/* * * * Нажали на кнопку "Загрузить карту" * */ 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(); }
/* * * * загружает все активные карты из БД * */ public void LoadAllMapsFromDatabase() { Dictionary<string, string> LoadedIDS = new Dictionary<string, string>(); LoadedIDS = sqlClient.Select("`ssmm_maps_ids`", "`ID` = '1'"); //Console.WriteLine(LoadedIDS["IDS"]); if (LoadedIDS["IDS"] != "-1") { string[] IDS = LoadedIDS["IDS"].Split(':'); int id = -2; Dictionary<string, string> LoadedMap = new Dictionary<string,string>(); foreach(string s_id in IDS) { id = Int32.Parse(s_id); if (id == -1) continue; // Загружаем карту по идентификатору LoadedMap = sqlClient.Select("`ssmm_maps`", String.Format("`MapID` = '{0}' LIMIT 1", id)); MAP loadedMap = new MAP(); loadedMap.linkedBoxItem = new ListBoxItem(); loadedMap.MapState = MapStates.INSTALLING; loadedMap.MapState = ReturnMapStateByString(LoadedMap["MapState"]); loadedMap.MapName = LoadedMap["MapName"]; loadedMap.MapID = Int32.Parse(LoadedMap["MapID"]); loadedMap.DateAdded = LoadedMap["MapDateAdded"]; loadedMap.resourcesCount[resourseTypes.CreateObject] = Int32.Parse(LoadedMap["MapCreateObjectCount"]); loadedMap.resourcesCount[resourseTypes.CreateDynamicObject] = Int32.Parse(LoadedMap["MapCreateDynamicObjectCount"]); loadedMap.resourcesCount[resourseTypes.CreateVehicle] = Int32.Parse(LoadedMap["MapCreateVehicleCount"]); loadedMap.resourcesCount[resourseTypes.AddStaticVehicle] = Int32.Parse(LoadedMap["MapAddStaticVehicleCount"]); loadedMap.resourcesCount[resourseTypes.AddStaticVehicleEx] = Int32.Parse(LoadedMap["MapAddStaticVehicleExCount"]); Maps.Add(loadedMap); } } }