public async Task <IQuery> GenerateSql(SolutionFolderItem item)
        {
            IMultiQuery query = Queries.BeginTransaction();

            query.Comment(item.MyName);
            foreach (ISolutionItem i in item.Items)
            {
                if (i.IsExportable)
                {
                    query.Add(await registry.Value.GenerateSql(i));
                }
            }

            return(query.Close());
        }
        private void BuildUpdate(IMultiQuery query)
        {
            switch (script.SourceType)
            {
            case SmartScriptType.Creature:
            {
                uint?entry;
                if (script.EntryOrGuid >= 0)
                {
                    entry = (uint)script.EntryOrGuid;
                }
                else
                {
                    entry = databaseProvider.GetCreatureByGuid((uint)-script.EntryOrGuid)?.Entry;
                }

                if (entry.HasValue)
                {
                    var condition = query
                                    .Table("creature_template")
                                    .Where(t => t.Column <int>("entry") == t.Variable <int>("ENTRY"));

                    if (script.EntryOrGuid != entry.Value)
                    {
                        condition = query
                                    .Table("creature_template")
                                    .Where(t => t.Column <uint>("entry") == entry.Value);
                    }

                    var update = condition
                                 .Set("AIName", currentCoreVersion.Current.SmartScriptFeatures.CreatureSmartAiName)
                                 .Set("ScriptName", "");
                    if (currentCoreVersion.Current.DatabaseFeatures.HasAiEntry)
                    {
                        update = update.Set("AIEntry", 0);
                    }
                    update.Update();
                }
                else
                {
                    query.Comment("[WARNING] cannot set creature AI to SmartAI, because guid not found in `creature` table!");
                }

                break;
            }

            case SmartScriptType.GameObject:
            {
                uint?entry;
                if (script.EntryOrGuid >= 0)
                {
                    entry = (uint)script.EntryOrGuid;
                }
                else
                {
                    entry = databaseProvider.GetCreatureByGuid((uint)-script.EntryOrGuid)?.Entry;
                }

                if (entry.HasValue)
                {
                    var condition = query
                                    .Table("gameobject_template")
                                    .Where(t => t.Column <int>("entry") == t.Variable <int>("ENTRY"));

                    if (script.EntryOrGuid != entry.Value)
                    {
                        condition = query
                                    .Table("gameobject_template")
                                    .Where(t => t.Column <uint>("entry") == entry.Value);
                    }
                    condition
                    .Set("AIName", currentCoreVersion.Current.SmartScriptFeatures.GameObjectSmartAiName)
                    .Update();
                }
                else
                {
                    query.Comment("[WARNING] cannot set gameobject AI to SmartGameObjectAI, because guid not found in `gameobject` table!");
                }
                break;
            }

            case SmartScriptType.Quest:
                query.Table("quest_template_addon")
                .InsertIgnore(new
                {
                    ID = query.Variable("ENTRY")
                });
                query.Table("quest_template_addon")
                .Where(r => r.Column <int>("ID") == r.Variable <int>("ENTRY"))
                .Set("ScriptName", "SmartQuest")
                .Update();
                break;

            case SmartScriptType.Spell:
                query.Comment("TrinityCore doesn't support Smart Spell Script");
                break;

            case SmartScriptType.Aura:
                query.Comment("TrinityCore doesn't support Smart Aura Script");
                break;

            case SmartScriptType.Cinematic:
                query.Comment("TrinityCore doesn't support Smart Cinematic Script");
                break;

            case SmartScriptType.AreaTrigger:
                query.Table("areatrigger_scripts")
                .Where(r => r.Column <int>("entry") == r.Variable <int>("ENTRY"))
                .Delete();
                query.Table("areatrigger_scripts")
                .Insert(new
                {
                    entry      = query.Variable("ENTRY"),
                    ScriptName = "SmartTrigger"
                });
                break;

            case SmartScriptType.AreaTriggerEntityServerSide:
                query.Table("areatrigger_template")
                .Where(r => r.Column <int>("Id") == r.Variable <int>("ENTRY") && r.Column <bool>("IsServerSide"))
                .Set("ScriptName", "SmartAreaTriggerAI")
                .Update();
                break;

            case SmartScriptType.AreaTriggerEntity:
                query.Table("areatrigger_template")
                .Where(r => r.Column <int>("Id") == r.Variable <int>("ENTRY") && !r.Column <bool>("IsServerSide"))
                .Set("ScriptName", "SmartAreaTriggerAI")
                .Update();
                break;
            }
        }
        private IQuery GenerateInsertQuery(ICollection <uint> keys, IDatabaseTableData tableData)
        {
            if (keys.Count == 0)
            {
                return(Queries.Empty());
            }

            IMultiQuery query = Queries.BeginTransaction();

            query
            .Table(tableData.TableDefinition.TableName)
            .WhereIn(tableData.TableDefinition.TablePrimaryKeyColumnName, keys.Distinct())
            .Delete();

            if (tableData.Entities.Count == 0)
            {
                return(query.Close());
            }

            var columns = tableData.TableDefinition.TableColumns
                          .Select(c => c.Value)
                          .Where(col => !col.IsMetaColumn && !col.IsConditionColumn)
                          .ToList();

            HashSet <EntityKey> entityKeys = new();
            List <Dictionary <string, object?> > inserts = new(tableData.Entities.Count);
            List <string> duplicates = new List <string>();
            var           comparer   = new EntityComparer(tableData.TableDefinition);

            foreach (var entity in tableData.Entities.OrderBy(t => t, comparer))
            {
                bool duplicate = tableData.TableDefinition.PrimaryKey != null && !entityKeys.Add(new EntityKey(entity, tableData.TableDefinition));
                var  cells     = columns.ToDictionary(c => c.DbColumnName, c =>
                {
                    var cell = entity.GetCell(c.DbColumnName) !;
                    if (c.AutogenerateComment != null && cell is DatabaseField <string> sField)
                    {
                        var evaluator = new DatabaseExpressionEvaluator(calculatorService, parameterFactory, tableData.TableDefinition, c.AutogenerateComment !);
                        var comment   = evaluator.Evaluate(entity);
                        if (comment is string s)
                        {
                            return(s.AddComment(sField.Current.Value));
                        }
                    }
                    return(cell.Object);
                });

                if (duplicate)
                {
                    duplicates.Add("(" + string.Join(", ", cells.Values) + ")");
                }
                else
                {
                    inserts.Add(cells);
                }
            }

            query.Table(tableData.TableDefinition.TableName)
            .BulkInsert(inserts);

            if (duplicates.Count > 0)
            {
                query.Comment("duplicates, cannot insert:");
                foreach (var line in duplicates)
                {
                    query.Comment(line);
                }
            }

            query.Add(BuildConditions(keys, tableData));

            return(query.Close());
        }