/* * * * Нажали на кнопку "Загрузить карту" * */ private void LoadMapButton_Click(object sender, RoutedEventArgs e) { if (!IsConnected) {ConsoleWriteLine("Сначала подключитесь к базе данных!"); return;} ConsoleWriteLine("Начинаю загрузку..."); //DB_CreateTables(); //string MapName = MapNameBox.Text.Trim(); MAP newMap = new MAP(); newMap.MapName = MapNameBox.Text.Trim(); newMap.linkedBoxItem = new ListBoxItem(); newMap.MapID = -1; newMap.MapState = MapStates.INSTALLING; if (!IsCorrectMapName(newMap.MapName)) { ConsoleWriteLine("Ошибка: В названии карты обнаружены запрещенные символы"); return; } if (newMap.MapName.Length < 1) { ConsoleWriteLine("Ошибка: название карты не задано"); return; } if (!IsTablesChecked) { ConsoleWriteLine("Проверка таблиц ... "); if (!CheckTablesExists()) { // если таблиц не существует ConsoleWriteLine("Таблицы не были обнаружены. Они будут созданы автоматически"); DB_CreateTables(); // создать их! } else ConsoleWriteLine("Таблицы существуют"); IsTablesChecked = true; } Dictionary<string, string> mapnames = null; mapnames = sqlClient.Select("ssmm_maps", "MapName LIKE '" + newMap.MapName + "'"); if (mapnames.Count > 0) { ConsoleWriteLine("Ошибка: Карта с таким названием уже существует"); return; } //int MapID = -1; bool Stop = false; Regex regex; MatchCollection matches; int Total = 0; int PackSize = 30; // 30 values в одном insert //sqlClient.SendCommand("START TRANSACTION"); //sqlClient.SendCommand("SET AUTOCOMMIT=0"); //sqlClient.SendCommand("BEGIN"); //sqlClient.SendCommand автоматически закрывает соединение, транзакции завершаются. Использование conn напрямую. sqlClient.getConn().Open(); MySqlCommand cmd = new MySqlCommand("START TRANSACTION", sqlClient.getConn()); cmd.ExecuteNonQuery(); var sqlFormattedDate = DateTime.Now.ToString("dd-MM-yyyy HH:mm:ss"); newMap.DateAdded = sqlFormattedDate; cmd = new MySqlCommand(String.Format(@" INSERT INTO `ssmm_maps` ( `MapName`, `MapState`, `MapDateAdded` ) VALUES ( '{0}', '{1}', '{2}' )", newMap.MapName, newMap.MapState.ToString(), newMap.DateAdded ), sqlClient.getConn()); cmd.ExecuteNonQuery(); cmd = new MySqlCommand("SELECT MAX(MapID) FROM `ssmm_maps`", sqlClient.getConn()); newMap.MapID = (int)cmd.ExecuteScalar(); if (newMap.MapID == -1) { ConsoleWriteLine("Ошибка: Не могу прочитать MapID"); Stop = true; } else { ConsoleWriteLine(String.Format("Загружается карта \"{0}\" ({1}) ...", newMap.MapName, newMap.MapID)); } ResourceSAMP lastObject = null; foreach (resourseTypes type in Enum.GetValues(typeof(resourseTypes))) { if (Stop == true) break; regex = new Regex(ResourceSAMP.GetMatchMaskValue(type)); // Настройка регулярного выражения под данный тип matches = regex.Matches(MapCodeBox.Text); // получение всех строк по данному типу if (matches.Count > 0) // строки с данным типом присутствуют { int i = 0; int currentPackId = 0; string QUERY_STRING = ""; foreach (Match match in matches) // перебираем строки с типом { ResourceSAMP newRes = null; switch (type) { case resourseTypes.CreateDynamicObject: { newRes = new CreatedDynamicObject(); break; } case resourseTypes.CreateObject: { newRes = new CreatedObject(); break; } case resourseTypes.AddStaticVehicle: { newRes = new AddedStaticVehicle(); break; } case resourseTypes.AddStaticVehicleEx: { newRes = new AddedStaticVehicleEx(); break; } case resourseTypes.CreateVehicle: { newRes = new CreatedVehicle(); break; } } string novastr = match.Value.Replace(")", ""); for (int dopsize = 0; dopsize < 6; dopsize++) { novastr += ", #"; // обеспечить tryParse в MakeObject } string[] tokens = novastr.Split(new char[] { ',' }, StringSplitOptions.None); try { // если первый пак, то поставить команду INSERT в начало if (currentPackId == 0) QUERY_STRING = newRes.getInsertString(); // перевод текста в объекты newRes.FromStringsToObject(tokens); // добавить VALUE данного объекта в запрос QUERY_STRING += newRes.getValueString(newMap.MapID); lastObject = newRes; Total++; } catch (Exception ex) { ConsoleWriteLine("Ошибка: Не удалось прочитать объект: " + tokens.ToString() + "(" + ex.ToString() + ")"); if (lastObject != null) ConsoleWriteLine("Предыдущий прочитанный объект: " + lastObject.ToString()); Stop = true; break; } try { // отправка объектов в БД if (currentPackId >= PackSize) { cmd = new MySqlCommand(QUERY_STRING, sqlClient.getConn()); cmd.ExecuteNonQuery(); //Console.WriteLine("Больше паксайц"); // обнулить currentPackId = 0; } else if (i == matches.Count - 1) // последний элемент. Завершаем { //Console.WriteLine("Последний элемент"); cmd = new MySqlCommand(QUERY_STRING, sqlClient.getConn()); cmd.ExecuteNonQuery(); } else { //Console.WriteLine("Пакуем"); QUERY_STRING += ","; currentPackId++; } } catch (Exception ex) { Stop = true; ConsoleWriteLine("Ошибка соединения: " + ex.ToString()); } if (Stop == true) break; i++; } newMap.resourcesCount[type] = i; cmd = new MySqlCommand(String.Format(@" UPDATE `ssmm_maps` SET `Map{0}Count` = '{1}' WHERE `MapID` = {2}", type.ToString(), i, newMap.MapID ), sqlClient.getConn()); //cmd = new MySqlCommand("UPDATE `ssmm_maps` SET `Map"+type.ToString()+"Count` = '"+i+"' WHERE `MapID` = " + MapID, sqlClient.getConn()); cmd.ExecuteNonQuery(); ConsoleWriteLine(String.Format("{0}, собрано: {1} из {2}", type.ToString(), i, matches.Count)); } } if (Total > 0) { if (Stop != true) // все прошло хорошо { CMD newCmd = new CMD(); newCmd.ID = -1; newCmd.Purpose = CmdPurposes.INSTALL; newCmd.State = CmdStates.ORDERED; newCmd.TargetId = newMap.MapID; newCmd.Comment = "-"; //bool AutoEnable = false; //AutoEnable = MapEnableDefaultCheckbox.IsChecked; if (MapEnableDefaultCheckbox.IsChecked == true) { newCmd.Comment = "DEF_ENABLE"; } // послать команду на установку cmd = new MySqlCommand(String.Format(@" INSERT INTO `ssmm_cmdstack` ( `CmdPurpose`, `CmdTargetId`, `CmdState`, `CmdComment` ) VALUES ( '{0}', '{1}', '{2}', '{3}' )", newCmd.Purpose.ToString(), newCmd.TargetId, newCmd.State.ToString(), newCmd.Comment //"INSTALL", //newMap.MapID, //"ORDERED", //"-" ), sqlClient.getConn()); cmd.ExecuteNonQuery(); cmd = new MySqlCommand("SELECT MAX(CmdID) FROM `ssmm_cmdstack`", sqlClient.getConn()); newCmd.ID = (int)cmd.ExecuteScalar(); if (newCmd.ID == -1) { ConsoleWriteLine("Ошибка: Не могу найти CmdID"); Stop = true; } else { ConsoleWriteLine("Установка начинается..."); // принять команду в обработку ActiveCMDs.Add(newCmd); } // ~~~~~~~~~~~~~~~ } if (Stop != true) // отправка команды прошла хорошо { cmd = new MySqlCommand("COMMIT", sqlClient.getConn()); cmd.ExecuteNonQuery(); ConsoleWriteLine("Загрузка успешно завершена!"); Maps.Add(newMap); //string comment = ""; //if(MapEnableDefaultCheckbox /* ListBoxItem itm = new ListBoxItem(); itm.Content = MapName + " ("+MapID+") "+"| Installing ..."; itm.Background = System.Windows.Media.Brushes.Yellow; MapList.Items.Add(itm); */ //MapList.SelectedItem } else { cmd = new MySqlCommand("ROLLBACK", sqlClient.getConn()); cmd.ExecuteNonQuery(); ConsoleWriteLine("Загрузка отменена!"); } } else { cmd = new MySqlCommand("ROLLBACK", sqlClient.getConn()); cmd.ExecuteNonQuery(); ConsoleWriteLine("Ошибка: Объекты не найдены. Загрузка отменена."); } sqlClient.getConn().Close(); }
// Count types /* * * * Включить карту по клику * */ private void EnableMapButton_Click(object sender, RoutedEventArgs e) { if (!IsConnected) { ConsoleWriteLine("Сначала подключитесь к базе данных!"); return; } for (int i = 0; i < Maps.Count; i++) { if (Maps[i].linkedBoxItem == selectedListBoxItem) // элемент найден { if (Maps[i].MapState == MapStates.DISABLED) { Maps[i].MapState = MapStates.Launching; CMD newCmd = new CMD(); newCmd.ID = -1; newCmd.Purpose = CmdPurposes.ENABLE; newCmd.State = CmdStates.ORDERED; newCmd.TargetId = Maps[i].MapID; newCmd.Comment = "-"; bool success = false; success = SendCommandToCmdStack(newCmd); if (success) { ConsoleWriteLine("Карта включается ..."); } else { ConsoleWriteLine("Ошибка: Не могу найти CmdID"); } } break; } } }
/* * * * Послать команду на выполнение * */ private bool SendCommandToCmdStack(CMD newCmd) { sqlClient.getConn().Open(); MySqlCommand cmd = new MySqlCommand("START TRANSACTION", sqlClient.getConn()); cmd.ExecuteNonQuery(); // послать команду на удаление cmd = new MySqlCommand(String.Format(@" INSERT INTO `ssmm_cmdstack` ( `CmdPurpose`, `CmdTargetId`, `CmdState`, `CmdComment` ) VALUES ( '{0}', '{1}', '{2}', '{3}' )", newCmd.Purpose.ToString(), newCmd.TargetId, newCmd.State.ToString(), newCmd.Comment ), sqlClient.getConn()); cmd.ExecuteNonQuery(); cmd = new MySqlCommand("SELECT MAX(CmdID) FROM `ssmm_cmdstack`", sqlClient.getConn()); newCmd.ID = (int)cmd.ExecuteScalar(); if (newCmd.ID == -1) { //ConsoleWriteLine("Ошибка: Не могу найти CmdID"); cmd = new MySqlCommand("ROLLBACK", sqlClient.getConn()); cmd.ExecuteNonQuery(); sqlClient.getConn().Close(); return false; } else { //ConsoleWriteLine("Удаляется карта..."); // принять команду в обработку ActiveCMDs.Add(newCmd); //ConsoleWriteLine("Команда принята в обработку + " + newCmd.TargetId.ToString()); cmd = new MySqlCommand("COMMIT", sqlClient.getConn()); cmd.ExecuteNonQuery(); } sqlClient.getConn().Close(); return true; }
/* * * * Итерация таймера: проверка состояния отправленных команд * */ private void timer_Tick(object sender, EventArgs e) { Collection<CMD> cmdsToRemove = new Collection<CMD>(); foreach(CMD cmd in ActiveCMDs) { Dictionary<string, string> RESULT = sqlClient.Select("ssmm_cmdstack", String.Format("`CmdID` = '{0}'", cmd.ID)); //ConsoleWriteLine(String.Format("CmdID: {0}", cmd.ID)); CMD preformedCmd = new CMD(); // новое состояние команды (cmd) preformedCmd = cmd; // загрузим новое состояние команды foreach (KeyValuePair<string, string> entry in RESULT) { switch (entry.Key) { case "CmdState":{ /* switch (entry.Value){ case "ORDERED": { preformedCmd.State = CmdStates.ORDERED; break; } case "ACCEPTED": { preformedCmd.State = CmdStates.ACCEPTED; break; } case "COMPLETE": { preformedCmd.State = CmdStates.COMPLETE; break; } case "ABORTED": { preformedCmd.State = CmdStates.ABORTED; break; } } */ preformedCmd.State = ReturnCmdStateByString(entry.Value); break; } case "CmdPurpose":{ /* switch (entry.Value){ case "INSTALL": { preformedCmd.Purpose = CmdPurposes.INSTALL; break; } case "ENABLE": { preformedCmd.Purpose = CmdPurposes.ENABLE; break; } case "DISABLE": { preformedCmd.Purpose = CmdPurposes.DISABLE; break; } case "REMOVE": { preformedCmd.Purpose = CmdPurposes.REMOVE; break; } } */ preformedCmd.Purpose = ReturnCmdPurposeByString(entry.Value); break; } case "CmdComment":{ preformedCmd.Comment = entry.Value; break; } } } switch(preformedCmd.Purpose) { case CmdPurposes.DISABLE: // выключение { switch (preformedCmd.State) { case CmdStates.ORDERED: break; // еще не принятя case CmdStates.ACCEPTED: break; // принята case CmdStates.COMPLETE: // удачно завершилась { ConsoleWriteLine(String.Format("Карта №{0} выключена", preformedCmd.TargetId)); MAP listmap = null; listmap = returnMapById(preformedCmd.TargetId); if (listmap != null) { listmap.MapState = MapStates.DISABLED; } cmdsToRemove.Add(cmd); break; } case CmdStates.ABORTED: // неудачно завершилась { ConsoleWriteLine(String.Format("Не удалось выключить карту №{0}! Причина: {1}", preformedCmd.TargetId, preformedCmd.Comment)); MAP listmap = null; listmap = returnMapById(preformedCmd.TargetId); if (listmap != null) { listmap.MapState = MapStates.ENABLED; } //ActiveCMDs.Remove(cmd); cmdsToRemove.Add(cmd); break; } } break; } case CmdPurposes.ENABLE: // включение { switch (preformedCmd.State) { case CmdStates.ORDERED: break; // еще не принятя case CmdStates.ACCEPTED: break; // принята case CmdStates.COMPLETE: // удачно завершилась { ConsoleWriteLine(String.Format("Карта №{0} включена", preformedCmd.TargetId)); MAP listmap = null; listmap = returnMapById(preformedCmd.TargetId); if (listmap != null) { listmap.MapState = MapStates.ENABLED; } cmdsToRemove.Add(cmd); break; } case CmdStates.ABORTED: // неудачно завершилась { ConsoleWriteLine(String.Format("Не удалось включить карту №{0}! Причина: {1}", preformedCmd.TargetId, preformedCmd.Comment)); MAP listmap = null; listmap = returnMapById(preformedCmd.TargetId); if (listmap != null) { listmap.MapState = MapStates.DISABLED; } //ActiveCMDs.Remove(cmd); cmdsToRemove.Add(cmd); break; } } break; } case CmdPurposes.INSTALL: // установка ... { switch (preformedCmd.State) { case CmdStates.ORDERED: break; // еще не принятя case CmdStates.ACCEPTED: break; // принята case CmdStates.COMPLETE: // удачно завершилась { ConsoleWriteLine(String.Format("Карта №{0} успешно установлена", preformedCmd.TargetId)); MAP listmap = null; listmap = returnMapById(preformedCmd.TargetId); if (listmap != null) { switch(preformedCmd.Comment){ case "DEF_ENABLE": { listmap.MapState = MapStates.ENABLED; break; } default:{ listmap.MapState = MapStates.DISABLED; break; } } } //ActiveCMDs.Remove(cmd); cmdsToRemove.Add(cmd); break; } case CmdStates.ABORTED: // завершилась неудачно { ConsoleWriteLine(String.Format("Не удалось установить карту №{0}! Причина: {1}", preformedCmd.TargetId, preformedCmd.Comment)); MAP listmap = null; listmap = returnMapById(preformedCmd.TargetId); if (listmap != null) { Maps.Remove(listmap); } //ActiveCMDs.Remove(cmd); cmdsToRemove.Add(cmd); break; } } break; } case CmdPurposes.REMOVE: { switch(preformedCmd.State) { case CmdStates.COMPLETE: { MAP listmap = null; listmap = returnMapById(preformedCmd.TargetId); if(listmap != null) { if (selectedListBoxItem == listmap.linkedBoxItem) // если сейчас выбрана удаляемая карта { MapInfoGroupBox.Header = "Выберите карту для получения информации"; MapInfoName.Text = "-"; MapInfoState.Text = "-"; MapInfoCounter_AddedStaticVehiclesEx.Text = "-"; MapInfoCounter_AddedStaticVehicles.Text = "-"; MapInfoCounter_CreatedObjects.Text = "-"; MapInfoCounter_CreatedVehicles.Text = "-"; MapInfoCounter_CreatedDynamicObjects.Text = "-"; MapInfoCounter_DateAdded.Text = "-"; selectedListBoxItem = null; } ConsoleWriteLine(String.Format("Карта №{0} ({1}) удалена", preformedCmd.TargetId, listmap.MapName)); Maps.Remove(listmap); } cmdsToRemove.Add(cmd); break; } case CmdStates.ABORTED: { ConsoleWriteLine(String.Format("Не удалось удалить карту №{0}! Причина: {1}", preformedCmd.TargetId, preformedCmd.Comment)); MAP listmap = null; listmap = returnMapById(preformedCmd.TargetId); if (listmap != null) { Maps.Remove(listmap); } cmdsToRemove.Add(cmd); break; } } break; } } } // удалить завершенные команды foreach(CMD cmd in cmdsToRemove) { ActiveCMDs.Remove(cmd); } }
// /* * * * Удалить карту по клику * */ private void RemoveMapButton_Click(object sender, RoutedEventArgs e) { if (!IsConnected) { ConsoleWriteLine("Сначала подключитесь к базе данных!"); return; } for (int i = 0; i < Maps.Count; i ++ ) { if(Maps[i].linkedBoxItem == selectedListBoxItem) // удаляемый элемент найден { if (Maps[i].MapState == MapStates.DISABLED || Maps[i].MapState == MapStates.ENABLED) { Maps[i].MapState = MapStates.Removing; CMD newCmd = new CMD(); newCmd.ID = -1; newCmd.Purpose = CmdPurposes.REMOVE; newCmd.State = CmdStates.ORDERED; newCmd.TargetId = Maps[i].MapID; newCmd.Comment = "-"; bool success = false; success = SendCommandToCmdStack(newCmd); if(success){ ConsoleWriteLine("Карта удаляется ..."); // Удаляем заголовок sqlClient.SendCommand(String.Format("DELETE FROM `ssmm_maps` WHERE `MapID` = '{0}'", Maps[i].MapID)); // удаляем ID карты из списка всех карт sqlClient.SendCommand(String.Format("UPDATE `ssmm_maps_ids` SET `IDS` = REPLACE (`IDS`, '{0}:', '') WHERE `ID` = '1'", Maps[i].MapID)); } else{ ConsoleWriteLine("Ошибка: Не могу найти CmdID"); } // send cmd //Maps.RemoveAt(i); } else { ConsoleWriteLine(String.Format("В данный момент нельзя удалить карту №{0} ({1})", Maps[i].MapID, Maps[i].MapName)); } break; } } }