Beispiel #1
0
        private void _selectInternal <TKey>(ServerDbs tabName, List <TKey> tuplesGen, bool changeTab)
        {
            try {
                lock (_lock) {
                    IsSelecting = true;

                    if (tabName.AdditionalTable == null)
                    {
                        TabItem item = _tab.Dispatch(() => _tab.Items.Cast <TabItem>().FirstOrDefault(p => p.Header.ToString() == tabName));

                        if (item is GDbTab)
                        {
                            GDbTab tab = (GDbTab)item;

                            var          table  = tab.To <TKey>().Table;
                            List <Tuple> tuples = tuplesGen.Select(table.TryGetTuple).Where(p => p != null).Select(p => (Tuple)p).ToList();

                            if (tuples.Count == 0)
                            {
                                if (changeTab)
                                {
                                    ErrorHandler.HandleException((tuplesGen.Count > 1 ? "Items do" : "Item does") + " not exist in [" + tabName.DisplayName + "].", ErrorLevel.NotSpecified);
                                }
                                return;
                            }

                            if (!_containsAny(tab, tuples))
                            {
                                tab.IgnoreFilterOnce();
                                tab.Filter();
                                _waitForFilter(tab);

                                if (!_containsAny(tab, tuples))
                                {
                                    if (changeTab)
                                    {
                                        ErrorHandler.HandleException((tuplesGen.Count > 1 ? "Items" : "Item") + " not found in [" + tabName.DisplayName + "]. Try clearing the search filter on the specified table.", ErrorLevel.NotSpecified);
                                    }
                                    return;
                                }
                            }

                            tab.Dispatch(p => p.IsSelected = true);
                            _waitForFilter(tab);
                            tab.Dispatch(p => p.SelectItems(tuples));
                        }
                        else
                        {
                            if (item == null)
                            {
                                return;
                            }

                            if (changeTab)
                            {
                                item.Dispatch(p => p.IsSelected = true);
                            }
                        }
                    }
                    else
                    {
                        TabItem item  = _tab.Dispatch(() => _tab.Items.Cast <TabItem>().FirstOrDefault(p => p.Header.ToString() == tabName));
                        TabItem item2 = _tab.Dispatch(() => _tab.Items.Cast <TabItem>().FirstOrDefault(p => p.Header.ToString() == tabName.AdditionalTable));

                        if (item is GDbTab && item2 is GDbTab)
                        {
                            GDbTab tab  = (GDbTab)item;
                            GDbTab tab2 = (GDbTab)item2;

                            var          table   = tab.To <TKey>().Table;
                            var          table2  = tab2.To <TKey>().Table;
                            List <Tuple> tuples  = tuplesGen.Select(table.TryGetTuple).Where(p => p != null).Select(p => (Tuple)p).ToList();
                            List <Tuple> tuples2 = tuplesGen.Select(table2.TryGetTuple).Where(p => p != null).Select(p => (Tuple)p).ToList();

                            if (tuples.Count == 0 && tuples2.Count == 0)
                            {
                                if (changeTab)
                                {
                                    ErrorHandler.HandleException((tuplesGen.Count > 1 ? "Items do" : "Item does") + " not exist in either [" + tabName.DisplayName + "] or [" + tabName.AdditionalTable.DisplayName + "].", ErrorLevel.NotSpecified);
                                }
                                return;
                            }

                            if (!_containsAny(tab, tuples))
                            {
                                tab.IgnoreFilterOnce();
                                tab.Filter();
                                _waitForFilter(tab);
                            }

                            if (!_containsAny(tab2, tuples))
                            {
                                tab2.IgnoreFilterOnce();
                                tab2.Filter();
                                _waitForFilter(tab2);
                            }

                            if (!_containsAny(tab, tuples) && !_containsAny(tab2, tuples2))
                            {
                                if (!_containsAny(tab, tuples) && !_containsAny(tab2, tuples2))
                                {
                                    if (changeTab)
                                    {
                                        ErrorHandler.HandleException((tuplesGen.Count > 1 ? "Items" : "Item") + " not found in either [" + tabName.DisplayName + "] or [" + tabName.AdditionalTable.DisplayName + "], but . Try clearing the search filter on the specified table.", ErrorLevel.NotSpecified);
                                    }
                                    return;
                                }
                            }

                            GDbTab tabToSelect = _containsAny(tab2, tuples2) ? tab2 : tab;

                            if (changeTab)
                            {
                                tabToSelect.Dispatch(p => p.IsSelected = true);
                            }

                            _waitForFilter(tabToSelect);
                            tabToSelect.Dispatch(p => p.SelectItems(tabToSelect == tab ? tuples : tuples2));
                        }
                        else
                        {
                            if (item == null)
                            {
                                return;
                            }
                            if (changeTab)
                            {
                                item.Dispatch(p => p.IsSelected = true);
                            }
                        }
                    }
                }
            }
            catch {
            }
            finally {
                IsSelecting = false;
            }
        }
Beispiel #2
0
        public string Execute(GDbTab core, string code)
        {
            MemoryStream stream = new MemoryStream();
            string       output = "";

            _core = core;
            Script script = new Script();

            try {
                TableHelper.EnableTupleTrace = true;

                if (_core == null)
                {
                    throw new Exception("No database tab selected.");
                }

                _selected = new ObservableList <Tuple>();

                foreach (var tuple in _core._listView.SelectedItems.OfType <Tuple>().OrderBy(p => p))
                {
                    _selected.Add(tuple);
                }

                _selectionChanged = false;

                _selected.CollectionChanged += delegate { _selectionChanged = true; };

                _mEngine.Runtime.IO.SetOutput(stream, EncodingService.DisplayEncoding);
                _mEngine.Runtime.IO.SetErrorOutput(stream, EncodingService.DisplayEncoding);

                _mScope = _mEngine.CreateScope();

                List <object> dbs = new List <object>();

                foreach (var serverDb in ServerDbs.ListDbs)
                {
                    var db = _core.DbComponent.TryGetDb(serverDb);

                    if (db != null)
                    {
                        if (db.AttributeList.PrimaryAttribute.DataType == typeof(int))
                        {
                            var adb = (AbstractDb <int>)db;
                            dbs.Add(adb);
                            TableHelper.Tables.Add(adb.Table);
                            _mScope.SetVariable(serverDb.Filename.ToLower().Replace(" ", "_"), adb.Table);
                        }
                        else if (db.AttributeList.PrimaryAttribute.DataType == typeof(string))
                        {
                            var adb = (AbstractDb <string>)db;
                            dbs.Add(adb);
                            TableHelper.Tables.Add(adb.Table);
                            _mScope.SetVariable(serverDb.Filename.ToLower().Replace(" ", "_"), adb.Table);
                        }
                    }
                }

                _mScope.SetVariable("item_db_m", _core.DbComponent.GetMeta <int>(ServerDbs.Items));
                _mScope.SetVariable("mob_db_m", _core.DbComponent.GetMeta <int>(ServerDbs.Mobs));
                _mScope.SetVariable("mob_skill_db_m", _core.DbComponent.GetMeta <string>(ServerDbs.MobSkills));
                _mScope.SetVariable("selection", _selected);
                _mScope.SetVariable("database", _core.ProjectDatabase);
                _mScope.SetVariable("script", script);

                //_mScope.SetVariable("ServerDbs", DynamicHelpers.GetPythonTypeFromType(typeof(ServerDbs)));
                _selectedDb = null;

                _to <int>(_core.DbComponent, p => {
                    _selectedDb = p.Table;
                    _mScope.SetVariable("selected_db", p.Table);
                });
                _to <string>(_core.DbComponent, p => {
                    _selectedDb = p.Table;
                    _mScope.SetVariable("selected_db", p.Table);
                });

                string temp = TemporaryFilesManager.GetTemporaryFilePath("python_script_{0:0000}.py");

                byte[]   file     = File.ReadAllBytes(code);
                Encoding encoding = EncodingService.DetectEncoding(file);

                using (StreamWriter writer = new StreamWriter(File.Create(temp), encoding))
                    using (StreamReader reader = new StreamReader(code)) {
                        writer.WriteLine("#!/usr/bin/env python");
                        writer.WriteLine("# -*- coding: {0} -*- ", encoding.CodePage);

                        while (!reader.EndOfStream)
                        {
                            string line = reader.ReadLine();

                            if (line == null)
                            {
                                continue;
                            }

                            writer.WriteLine(EncodingService.FromAnyTo(line, encoding));
                        }
                    }

                ScriptSource source = _mEngine.CreateScriptSourceFromFile(temp);

                foreach (var db in dbs)
                {
                    _to <int>(db, _onBegin);
                    _to <string>(db, _onBegin);
                }

                try {
                    try {
                        source.Execute(_mScope);
                    }
                    catch (OperationCanceledException) {
                    }

                    if (stream.Position > 0)
                    {
                        stream.Seek(0, SeekOrigin.Begin);
                        byte[] data = new byte[stream.Length];
                        stream.Read(data, 0, data.Length);

                        output = EncodingService.DisplayEncoding.GetString(data);
                        Clipboard.SetDataObject(EncodingService.DisplayEncoding.GetString(data));
                    }
                }
                catch {
                    foreach (var db in dbs)
                    {
                        _to <int>(db, p => p.Table.Commands.CancelEdit());
                        _to <string>(db, p => p.Table.Commands.CancelEdit());
                    }

                    throw;
                }
                finally {
                    foreach (var db in dbs)
                    {
                        _to <int>(db, _onEnd);
                        _to <string>(db, _onEnd);
                    }

                    stream.Close();
                    _core.Filter();
                    _core.Update();
                }
            }
            catch (Exception err) {
                ErrorHandler.HandleException(err);
            }
            finally {
                TableHelper.EnableTupleTrace = false;
                TableHelper.Tables.Clear();
            }

            return(output);
        }
        private void _copy <TKey>()
        {
            // Only int tables are allowed...
            AbstractDb <TKey> db       = _destDb.To <TKey>();
            AbstractDb <TKey> sourceDb = _sourceDb.To <TKey>();
            TKey newKey;
            TKey firstId = (TKey)(object)Int32.Parse(_tbNewId.Text);

            Regex aegisNameInput = null;
            Regex nameInput      = null;

            try {
                db.Table.Commands.BeginNoDelay();

                for (int i = 0; i < _tuples.Count; i++)
                {
                    var  item  = _tuples[i];
                    TKey oldId = item.GetKey <TKey>();
                    newKey = (TKey)(object)((int)(object)firstId + i);

                    if (!SdeAppConfiguration.CmdCopyToOverwrite)
                    {
                        if (db.Table.ContainsKey(newKey))
                        {
                            continue;
                        }
                    }

                    if (i == _tuples.Count - 1)
                    {
                        db.Table.Commands.CopyTupleTo(sourceDb.Table, oldId, newKey, (a, b, c, d, e) => _copyToCallback2(db, c, d, e));
                    }
                    else
                    {
                        db.Table.Commands.CopyTupleTo(sourceDb.Table, oldId, newKey, (a, b, c, d, e) => _copyToCallback3(c, d, e));
                    }

                    if ((ServerDbs.ServerItems & db.DbSource) != 0)
                    {
                        _autoField(ref aegisNameInput, () => SdeAppConfiguration.CmdCopyToAegisNameEnabled, () => SdeAppConfiguration.CmdCopyToAegisNameFormatInput, () => SdeAppConfiguration.CmdCopyToAegisNameFormatOutput, item, db, newKey, i, ServerItemAttributes.AegisName);
                        _autoField(ref nameInput, () => SdeAppConfiguration.CmdCopyToNameEnabled, () => SdeAppConfiguration.CmdCopyToNameFormatInput, () => SdeAppConfiguration.CmdCopyToNameFormatOutput, item, db, newKey, i, ServerItemAttributes.Name);
                    }
                }
            }
            catch (Exception err) {
                db.Table.Commands.CancelEdit();
                ErrorHandler.HandleException(err);
            }
            finally {
                db.Table.Commands.End();
                _tab.Filter();
            }

            if ((ServerDbs.ServerItems & db.DbSource) != 0 && SdeAppConfiguration.CmdCopyToClientItems)
            {
                var cDb = db.GetDb <TKey>(ServerDbs.CItems);

                try {
                    cDb.Table.Commands.Begin();

                    for (int i = 0; i < _tuples.Count; i++)
                    {
                        newKey = (TKey)(object)((int)(object)firstId + i);
                        cDb.Table.Commands.CopyTupleTo(cDb.Table, _tuples[i].GetKey <TKey>(), newKey, (a, b, c, d, e) => _copyToCallback3(c, d, e));
                    }
                }
                catch (Exception err) {
                    cDb.Table.Commands.CancelEdit();
                    ErrorHandler.HandleException(err);
                }
                finally {
                    cDb.Table.Commands.End();
                }
            }
        }