コード例 #1
0
        private string BuildSQLQueryForSingleRow(DatabaseTableDefinitionJson tableDefinitionJson, string?customWhere, long?offset, int?limit)
        {
            var tableName = tableDefinitionJson.TableName;
            var columns   = tableDefinitionJson.Groups
                            .SelectMany(x => x.Fields)
                            .Where(x => !x.IsConditionColumn && !x.IsMetaColumn)
                            .Select(x =>
            {
                var column = $"`{x.ForeignTable ?? tableName}`.`{x.DbColumnName}`";
                if (x.IsUnixTimestamp)
                {
                    column = $"UNIX_TIMESTAMP({column}) AS `{x.DbColumnName}`";
                }
                return(column);
            })
                            .Distinct();
            var names = string.Join(",", columns);
            var joins = "";

            if (tableDefinitionJson.ForeignTable != null)
            {
                joins += string.Join(" ", tableDefinitionJson.ForeignTable.Select(table =>
                {
                    var where = table.ForeignKeys.Zip(tableDefinitionJson.PrimaryKey !)
                                .Select(pair => $"`{table.TableName}`.`{pair.First}` = `{tableName}`.`{pair.Second}`");
                    return($"LEFT JOIN `{table.TableName}` ON " + string.Join(" AND ", where));
                }));
            }

            var where = string.IsNullOrEmpty(customWhere) ? "" : $"WHERE ({customWhere})";
            return($"SELECT {names} FROM `{tableDefinitionJson.TableName}` {joins} {where} ORDER BY {string.Join(", ", tableDefinitionJson.PrimaryKey.Select(x => $"`{x}`"))} ASC LIMIT {limit ?? 300} OFFSET {offset ?? 0}");
        }
コード例 #2
0
        public IQuery GenerateDeleteQuery(DatabaseTableDefinitionJson table, IReadOnlyList <DatabaseKey> keys)
        {
            var query = Queries.BeginTransaction();

            GeneratePrimaryKeyDeletion(table, keys.Distinct().ToList(), query);
            return(query.Close());
        }
コード例 #3
0
        public IQuery GenerateDeleteQuery(DatabaseTableDefinitionJson table, ICollection <uint> keys)
        {
            if (keys.Count == 1)
            {
                return(GenerateDeleteQuery(table, keys.First()));
            }
            var query = Queries.BeginTransaction();

            if (table.ForeignTable != null)
            {
                foreach (var foreign in table.ForeignTable)
                {
                    query
                    .Table(foreign.TableName)
                    .WhereIn(foreign.ForeignKeys[0], keys.Distinct())
                    .Delete();
                }
            }

            query
            .Table(table.TableName)
            .WhereIn(table.TablePrimaryKeyColumnName, keys.Distinct())
            .Delete();
            return(query.Close());
        }
コード例 #4
0
        private string BuildSQLQueryFromTableDefinition(DatabaseTableDefinitionJson tableDefinitionJson, DatabaseKey[] entries)
        {
            var tableName       = tableDefinitionJson.TableName;
            var tablePrimaryKey = tableDefinitionJson.TablePrimaryKeyColumnName;
            var columns         = tableDefinitionJson.Groups
                                  .SelectMany(x => x.Fields)
                                  .Where(x => !x.IsConditionColumn && !x.IsMetaColumn)
                                  .Select(x =>
            {
                var column = $"`{x.ForeignTable ?? tableName}`.`{x.DbColumnName}`";
                if (x.IsUnixTimestamp)
                {
                    column = $"UNIX_TIMESTAMP({column}) AS `{x.DbColumnName}`";
                }
                return(column);
            })
                                  .Distinct();
            var names = string.Join(",", columns);
            var joins = "";

            if (tableDefinitionJson.ForeignTable != null)
            {
                joins += string.Join(" ", tableDefinitionJson.ForeignTable.Select(table =>
                {
                    var where = table.ForeignKeys.Zip(tableDefinitionJson.PrimaryKey !)
                                .Select(pair => $"`{table.TableName}`.`{pair.First}` = `{tableName}`.`{pair.Second}`");
                    return($"LEFT JOIN `{table.TableName}` ON " + string.Join(" AND ", where));
                }));
            }

            return
                ($"SELECT {names} FROM {tableDefinitionJson.TableName} {joins} WHERE `{tableName}`.`{tablePrimaryKey}` IN ({string.Join(", ", entries)});");
        }
コード例 #5
0
 public IQuery GenerateDeleteQuery(DatabaseTableDefinitionJson table, DatabaseEntity entity)
 {
     return(Queries
            .Table(table.TableName)
            .Where(r => r.Column <uint>(table.TablePrimaryKeyColumnName) == entity.Key)
            .Delete());
 }
コード例 #6
0
        public DatabaseEntity CreateEmptyEntity(DatabaseTableDefinitionJson definition, DatabaseKey key, bool phantomEntity)
        {
            Dictionary <string, IDatabaseField> columns = new(StringComparer.InvariantCultureIgnoreCase);

            foreach (var column in definition.Groups.SelectMany(t => t.Fields)
                     .Distinct(
                         EqualityComparerFactory.Create <DatabaseColumnJson>(
                             f => f.DbColumnName.GetHashCode(),
                             (a, b) => a !.DbColumnName.Equals(b !.DbColumnName))))
            {
                IValueHolder valueHolder;
                var          type = column.ValueType;

                if (parameterFactory.IsRegisteredLong(type))
                {
                    type = "uint";
                }
                else if (parameterFactory.IsRegisteredString(type))
                {
                    type = "string";
                }
                else if (type.EndsWith("Parameter"))
                {
                    type = "uint";
                }

                if (type == "float")
                {
                    valueHolder = new ValueHolder <float>(column.Default is float f ? f : 0.0f, column.CanBeNull && column.Default == null);
                }
                else if (type is "int" or "uint" or "long")
                {
                    valueHolder = new ValueHolder <long>(column.Default is long f ? f : 0, column.CanBeNull && column.Default == null);
                }
コード例 #7
0
 private string BuildWhereFromKeys(DatabaseTableDefinitionJson definition, DatabaseKey[] keys)
 {
     if (keys.Length == 0)
     {
         return("false");
     }
     if (definition.GroupByKeys.Count == 1)
     {
         return($"`{definition.TableName}`.`{definition.GroupByKeys[0]}` IN ({string.Join(", ", keys.Select(k => k[0]))})");
     }
     else
     {
         Debug.Assert(keys[0].Count == definition.GroupByKeys.Count);
         return(string.Join(" OR ", keys.Select(key =>
         {
             StringBuilder sb = new();
             for (int i = 0; i < definition.GroupByKeys.Count; ++i)
             {
                 if (i != 0)
                 {
                     sb.Append(" AND ");
                 }
                 sb.Append($"(`{definition.TableName}`.`{definition.GroupByKeys[i]}` = {key[i]})");
             }
             return sb.ToString();
         })));
     }
 }
コード例 #8
0
 public ExpressionVisitor(ICreatureStatCalculatorService statCalculatorService,
                          IParameterFactory parameterFactory,
                          DatabaseTableDefinitionJson definition)
 {
     this.statCalculatorService = statCalculatorService;
     this.parameterFactory      = parameterFactory;
     this.definition            = definition;
 }
コード例 #9
0
 public EntityKey(DatabaseEntity entity, DatabaseTableDefinitionJson table)
 {
     fields = table.PrimaryKey !.Select(key => entity.GetCell(key) !).ToList();
     hash   = 0;
     foreach (var field in fields)
     {
         hash = HashCode.Combine(hash, field.GetHashCode());
     }
 }
コード例 #10
0
        public DatabaseEntity CreateEmptyEntity(DatabaseTableDefinitionJson definition, uint key)
        {
            Dictionary <string, IDatabaseField> columns = new();

            foreach (var column in definition.Groups.SelectMany(t => t.Fields)
                     .Distinct(
                         EqualityComparerFactory.Create <DatabaseColumnJson>(
                             f => f.DbColumnName.GetHashCode(),
                             (a, b) => a !.DbColumnName.Equals(b !.DbColumnName))))
            {
                IValueHolder valueHolder;
                var          type = column.ValueType;

                if (parameterFactory.IsRegisteredLong(type))
                {
                    type = "uint";
                }
                else if (parameterFactory.IsRegisteredString(type))
                {
                    type = "string";
                }
                else if (type.EndsWith("Parameter"))
                {
                    type = "uint";
                }

                if (type == "float")
                {
                    valueHolder = new ValueHolder <float>(column.Default is float f ? f : 0.0f, column.CanBeNull && column.Default == null);
                }
                else if (type == "int" || type == "uint")
                {
                    if (column.DbColumnName == definition.TablePrimaryKeyColumnName)
                    {
                        valueHolder = new ValueHolder <long>(key, false);
                    }
                    else
                    {
                        valueHolder = new ValueHolder <long>(column.Default is long f ? f : 0, column.CanBeNull && column.Default == null);
                    }
                }
                else
                {
                    valueHolder = new ValueHolder <string>(column.Default is string f ? f : "", column.CanBeNull && column.Default == null);
                }


                columns[column.DbColumnName] = databaseFieldFactory.CreateField(column.DbColumnName, valueHolder);
            }

            return(new DatabaseEntity(false, key, columns, null));
        }
コード例 #11
0
 internal DatabaseTableSolutionItemProvider(DatabaseTableDefinitionJson definition,
                                            IDatabaseTableDataProvider tableDataProvider,
                                            IItemFromListProvider itemFromListProvider,
                                            IMessageBoxService messageBoxService,
                                            IParameterFactory parameterFactory)
 {
     this.tableDataProvider    = tableDataProvider;
     this.itemFromListProvider = itemFromListProvider;
     this.messageBoxService    = messageBoxService;
     this.parameterFactory     = parameterFactory;
     this.definition           = definition;
     this.itemIcon             = new ImageUri($"Icons/document_big.png");
 }
 internal DatabaseTableSolutionItemProvider(DatabaseTableDefinitionJson definition,
                                            IDatabaseProvider databaseProvider,
                                            ITableOpenService tableOpenService,
                                            bool isCompatible,
                                            bool byDefaultIsHiddenInQuickLoad)
 {
     this.databaseProvider            = databaseProvider;
     this.tableOpenService            = tableOpenService;
     this.definition                  = definition;
     this.itemIcon                    = new ImageUri($"Icons/document_big.png");
     this.isCompatible                = isCompatible;
     this.ByDefaultHideFromQuickStart = byDefaultIsHiddenInQuickLoad;
 }
コード例 #13
0
 internal DatabaseTableSolutionItemProvider(DatabaseTableDefinitionJson definition,
                                            IDatabaseTableDataProvider tableDataProvider,
                                            IItemFromListProvider itemFromListProvider,
                                            IMessageBoxService messageBoxService,
                                            IParameterFactory parameterFactory)
 {
     this.tableDataProvider    = tableDataProvider;
     this.itemFromListProvider = itemFromListProvider;
     this.messageBoxService    = messageBoxService;
     this.parameterFactory     = parameterFactory;
     this.definition           = definition;
     this.itemIcon             = new ImageUri($"Resources/SmartScriptGeneric.png");
 }
コード例 #14
0
        public DatabaseExpressionEvaluator(ICreatureStatCalculatorService statCalculatorService,
                                           IParameterFactory parameterFactory,
                                           DatabaseTableDefinitionJson definition, string expression)
        {
            this.parameterFactory = parameterFactory;
            lexer  = new DatabaseEditorExpressionLexer(new AntlrInputStream(expression));
            tokens = new CommonTokenStream(lexer);
            parser = new DatabaseEditorExpressionParser(tokens);
            parser.BuildParseTree = true;
            parser.RemoveErrorListeners();

            visitor = new ExpressionVisitor(statCalculatorService, parameterFactory, definition);
        }
コード例 #15
0
        public string GenerateUpdateFieldQuery(DatabaseTableDefinitionJson table, DatabaseEntity entity,
                                               IDatabaseField field)
        {
            var    column           = table.TableColumns[field.FieldName];
            string primaryKeyColumn = table.TablePrimaryKeyColumnName;

            if (column.ForeignTable != null)
            {
                primaryKeyColumn = table.ForeignTableByName[column.ForeignTable].ForeignKey;
            }

            return
                ($"UPDATE {table.TableName} SET `{field.FieldName}` = {field.ToQueryString()} WHERE `{primaryKeyColumn}` = {entity.Key};");
        }
コード例 #16
0
        private static void GeneratePrimaryKeyDeletion(DatabaseTableDefinitionJson definition, IReadOnlyList <DatabaseKey>?keys,
                                                       IMultiQuery query)
        {
            if (keys == null || keys.Count == 0)
            {
                return;
            }

            ITable table;

            if (definition.ForeignTable != null)
            {
                foreach (var foreign in definition.ForeignTable)
                {
                    table = query.Table(foreign.TableName);
                    if (keys.Count > 1 && keys[0].Count == 1)
                    {
                        foreach (var chunk in keys.Select(k => k[0]).Chunk(128))
                        {
                            table.WhereIn(foreign.ForeignKeys[0], chunk).Delete();
                        }
                    }
                    else
                    {
                        foreach (var key in keys)
                        {
                            GenerateWherePrimaryKey(foreign.ForeignKeys, table, key).Delete();
                        }
                    }
                }
            }

            table = query.Table(definition.TableName);
            if (keys.Count > 1 && keys[0].Count == 1)
            {
                foreach (var chunk in keys.Select(k => k[0]).Chunk(128))
                {
                    table.WhereIn(definition.TablePrimaryKeyColumnName, chunk).Delete();
                }
            }
            else
            {
                foreach (var key in keys)
                {
                    GenerateWherePrimaryKey(definition, table, key).Delete();
                }
            }
        }
コード例 #17
0
        public IQuery GenerateDeleteQuery(DatabaseTableDefinitionJson table, DatabaseKey key)
        {
            var query = Queries.BeginTransaction();

            if (table.ForeignTable != null)
            {
                foreach (var foreign in table.ForeignTable)
                {
                    var tableKey = foreign.ForeignKeys[0];
                    GenerateWherePrimaryKey(foreign.ForeignKeys.Take(table.GroupByKeys.Count).ToList(), query
                                            .Table(foreign.TableName), key).Delete();
                }
            }

            GenerateWherePrimaryKey(table, query.Table(table.TableName), key).Delete();
            return(query.Close());
        }
コード例 #18
0
        public IQuery GenerateUpdateFieldQuery(DatabaseTableDefinitionJson table, DatabaseEntity entity,
                                               IDatabaseField field)
        {
            var    column           = table.TableColumns[field.FieldName];
            string primaryKeyColumn = table.TablePrimaryKeyColumnName;

            if (column.ForeignTable != null)
            {
                primaryKeyColumn = table.ForeignTableByName[column.ForeignTable].ForeignKey;
            }

            return(Queries
                   .Table(table.TableName)
                   .Where(row => row.Column <uint>(primaryKeyColumn) == entity.Key)
                   .Set(field.FieldName, field.Object)
                   .Update());
        }
コード例 #19
0
    public async Task <ISolutionItem?> TryCreate(DatabaseTableDefinitionJson definition)
    {
        if (definition.RecordMode == RecordMode.SingleRow)
        {
            return(await Create(definition, default));
        }

        Debug.Assert(definition.GroupByKeys.Count == 1);

        var parameter = parameterFactory.Factory(definition.Picker);
        var key       = await itemFromListProvider.GetItemFromList(parameter.HasItems?parameter.Items !: new Dictionary <long, SelectOption>(), false);

        if (key.HasValue)
        {
            return(await Create(definition, new DatabaseKey(key.Value)));
        }
        return(null);
    }
コード例 #20
0
    public async Task <ISolutionItem?> Create(DatabaseTableDefinitionJson definition, DatabaseKey key)
    {
        if (definition.RecordMode == RecordMode.MultiRecord)
        {
            return(new DatabaseTableSolutionItem(key, false, definition.Id, definition.IgnoreEquality));
        }
        if (definition.RecordMode == RecordMode.SingleRow)
        {
            return(new DatabaseTableSolutionItem(definition.Id, definition.IgnoreEquality));
        }
        else
        {
            var data = await tableDataProvider.Load(definition.Id, null, null, null, new [] { key });

            if (data == null)
            {
                return(null);
            }
            if (data.Entities.Count == 0)
            {
                return(null);
            }

            if (!data.Entities[0].ExistInDatabase)
            {
                if (!await messageBoxService.ShowDialog(new MessageBoxFactory <bool>()
                                                        .SetTitle("Entity doesn't exist in database")
                                                        .SetMainInstruction($"Entity {data.Entities[0].Key} doesn't exist in the database")
                                                        .SetContent(
                                                            "WoW Database Editor will be generating DELETE/INSERT query instead of UPDATE. Do you want to continue?")
                                                        .WithYesButton(true)
                                                        .WithNoButton(false).Build()))
                {
                    return(null);
                }
            }
            return(new DatabaseTableSolutionItem(data.Entities[0].Key, data.Entities[0].ExistInDatabase, definition.Id, definition.IgnoreEquality));
        }
    }
コード例 #21
0
        public IQuery GenerateDeleteQuery(DatabaseTableDefinitionJson table, uint key)
        {
            var query = Queries.BeginTransaction();

            if (table.ForeignTable != null)
            {
                foreach (var foreign in table.ForeignTable)
                {
                    var tableKey = foreign.ForeignKeys[0];
                    query
                    .Table(foreign.TableName)
                    .Where(row => row.Column <uint>(tableKey) == key)
                    .Delete();
                }
            }

            query
            .Table(table.TableName)
            .Where(r => r.Column <uint>(table.TablePrimaryKeyColumnName) == key)
            .Delete();
            return(query.Close());
        }
コード例 #22
0
    private async Task <bool> CheckIfItemIsOpened(DatabaseTableSolutionItem fakeSolutionItem,
                                                  DatabaseTableDefinitionJson definition)
    {
        bool openIsNoSaveMode = false;

        if (IsItemAlreadyOpened(fakeSolutionItem, out var openedDocument))
        {
            var result = await messageBoxService.ShowDialog(new MessageBoxFactory <bool>()
                                                            .SetTitle("Document is already opened")
                                                            .SetMainInstruction($"{definition.Id} is already opened")
                                                            .SetContent(
                                                                "This table is already being edited and you have an active session.\n Editing the same table in a new window would cause a session data loss.\n\nTherefore you can either close the current document or open the table without save feature enabled (you can still generate sql).")
                                                            .WithButton("Close document", true)
                                                            .WithButton("Open table without save", false)
                                                            .Build());

            if (result)
            {
                await openedDocument.CloseCommand !.ExecuteAsync();
                openIsNoSaveMode = documentManager.Value.OpenedDocuments.Contains(openedDocument);
                if (openIsNoSaveMode)
                {
                    await messageBoxService.ShowDialog(new MessageBoxFactory <Unit>()
                                                       .SetTitle("Document is still opened")
                                                       .SetMainInstruction("Document is still opened")
                                                       .SetContent("You didn't close the document. Opening the table without the save feature.")
                                                       .Build());
                }
            }
            else
            {
                openIsNoSaveMode = true;
            }
        }

        return(openIsNoSaveMode);
    }
コード例 #23
0
 public TableItemViewModel(string tableName, DatabaseTableDefinitionJson definition)
 {
     TableName  = tableName;
     Definition = definition;
     Icon       = new ImageUri(definition.IconPath ?? "Icons/document.png");
 }
コード例 #24
0
 public IQuery GenerateDeleteQuery(DatabaseTableDefinitionJson table, DatabaseEntity entity) =>
 GenerateDeleteQuery(table, entity.Key);
 internal DatabaseTableSolutionItemNumberedProvider(DatabaseTableDefinitionJson definition, IDatabaseProvider databaseProvider, ITableOpenService tableOpenService, bool isCompatible, bool byDefaultIsHiddenInQuickLoad) : base(definition, databaseProvider, tableOpenService, isCompatible, byDefaultIsHiddenInQuickLoad)
 {
 }
コード例 #26
0
 public EntityComparer(DatabaseTableDefinitionJson definition)
 {
     this.definition = definition;
 }
コード例 #27
0
 public string GenerateDeleteQuery(DatabaseTableDefinitionJson table, DatabaseEntity entity)
 {
     return($"DELETE FROM {table.TableName} WHERE {table.TablePrimaryKeyColumnName} = {entity.Key};");
 }
コード例 #28
0
 public DatabaseTableData(DatabaseTableDefinitionJson definitionJson, IReadOnlyList <DatabaseEntity> entities)
 {
     TableDefinition = definitionJson;
     Entities        = entities;
 }
コード例 #29
0
 public IDatabaseTableData?CreateDatabaseTable(DatabaseTableDefinitionJson tableDefinition,
                                               uint[] keys,
                                               IList <Dictionary <string, (System.Type type, object value)> > fieldsFromDb)
コード例 #30
0
 private static IWhere GenerateWherePrimaryKey(DatabaseTableDefinitionJson definition, ITable table, DatabaseKey key)
 {
     return(GenerateWherePrimaryKey(definition.GroupByKeys, table, key));
 }