/*
         *
         *
         * Нажали на кнопку "Загрузить карту"
         *
         */
        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);
            }
            }
        }