Beispiel #1
0
        /*
         *
         *
         * Нажали на кнопку "Загрузить карту"
         *
         */
        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();
        }
Beispiel #2
0
        // 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;
                }
            }
        }
Beispiel #3
0
        /*
         *
         *
         * Послать команду на выполнение
         *
         */
        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;
        }
Beispiel #4
0
        /*
         *
         *
         * Итерация таймера: проверка состояния отправленных команд
         *
         */
        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);
            }
        }
Beispiel #5
0
        //
        /*
         *
         *
         * Удалить карту по клику
         *
         */
        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;
                }
            }
        }