示例#1
0
        public async Task InstallConditions(IEnumerable <IConditionLine> conditionLines,
                                            IDatabaseProvider.ConditionKeyMask keyMask,
                                            IDatabaseProvider.ConditionKey?manualKey = null)
        {
            using var writeLock = await DatabaseLock.WriteLock();

            await using var model = new TrinityDatabase();

            var conditions = conditionLines?.ToList() ?? new List <IConditionLine>();
            List <(int SourceType, int?SourceGroup, int?SourceEntry, int?SourceId)> keys = conditions.Select(c =>
                                                                                                             (c.SourceType, keyMask.HasFlag(IDatabaseProvider.ConditionKeyMask.SourceGroup) ? (int?)c.SourceGroup : null,
                                                                                                              keyMask.HasFlag(IDatabaseProvider.ConditionKeyMask.SourceEntry) ? (int?)c.SourceEntry : null,
                                                                                                              keyMask.HasFlag(IDatabaseProvider.ConditionKeyMask.SourceId) ? (int?)c.SourceId : null))
                                                                                           .Union(manualKey.HasValue
                    ? new[]
示例#2
0
 public Task <IList <IConditionLine> > GetConditionsForAsync(IDatabaseProvider.ConditionKeyMask keyMask, IDatabaseProvider.ConditionKey manualKey) => Task.FromResult <IList <IConditionLine> >(System.Array.Empty <IConditionLine>());
示例#3
0
 public Task InstallConditions(IEnumerable <IConditionLine> conditions, IDatabaseProvider.ConditionKeyMask keyMask, IDatabaseProvider.ConditionKey?manualKey = null) => Task.FromResult(false);
 public Task InstallConditions(IEnumerable <IConditionLine> conditions,
                               IDatabaseProvider.ConditionKeyMask keyMask,
                               IDatabaseProvider.ConditionKey?manualKey = null) =>
 impl.InstallConditions(conditions, keyMask, manualKey);
示例#5
0
 public Task <IList <IConditionLine> > GetConditionsForAsync(IDatabaseProvider.ConditionKeyMask keyMask, IDatabaseProvider.ConditionKey key) =>
 impl.GetConditionsForAsync(keyMask, key);
示例#6
0
        public async Task <IDatabaseTableData?> Load(string definitionId, string?customWhere, long?offset, int?limit, DatabaseKey[]?keys)
        {
            var definition = tableDefinitionProvider.GetDefinition(definitionId);

            if (definition == null)
            {
                return(null);
            }

            IList <Dictionary <string, (Type, object)> >?result = null;

            IDatabaseProvider.ConditionKeyMask keyMask = IDatabaseProvider.ConditionKeyMask.None;
            if (definition.Condition != null)
            {
                if (definition.Condition.SourceEntryColumn != null)
                {
                    keyMask |= IDatabaseProvider.ConditionKeyMask.SourceEntry;
                }
                if (definition.Condition.SourceGroupColumn != null)
                {
                    keyMask |= IDatabaseProvider.ConditionKeyMask.SourceGroup;
                }
                if (definition.Condition.SourceIdColumn != null)
                {
                    keyMask |= IDatabaseProvider.ConditionKeyMask.SourceId;
                }
            }

            if (definition.RecordMode == RecordMode.SingleRow)
            {
                if (keys != null)
                {
                    var whereKeys = BuildWhereFromKeys(definition, keys);
                    if (string.IsNullOrEmpty(customWhere))
                    {
                        customWhere = whereKeys;
                    }
                    else
                    {
                        customWhere = "(" + customWhere + ") AND " + whereKeys;
                    }
                }
                var sqlStatement = BuildSQLQueryForSingleRow(definition, customWhere, offset, Math.Min(limit ?? 300, 3000));
                try
                {
                    result = await sqlExecutor.ExecuteSelectSql(sqlStatement);

                    if (definition.Condition != null)
                    {
                        foreach (var row in result)
                        {
                            int?sourceGroup = null, sourceEntry = null, sourceId = null;

                            if (definition.Condition.SourceGroupColumn != null &&
                                row.TryGetValue(definition.Condition.SourceGroupColumn, out var groupData) &&
                                int.TryParse(groupData.Item2.ToString(), out var groupInt))
                            {
                                sourceGroup = groupInt;
                            }

                            if (definition.Condition.SourceEntryColumn != null &&
                                row.TryGetValue(definition.Condition.SourceEntryColumn, out var entryData) &&
                                int.TryParse(entryData.Item2.ToString(), out var entryInt))
                            {
                                sourceEntry = entryInt;
                            }

                            if (definition.Condition.SourceIdColumn != null &&
                                row.TryGetValue(definition.Condition.SourceIdColumn, out var idData) &&
                                int.TryParse(idData.Item2.ToString(), out var idInt))
                            {
                                sourceId = idInt;
                            }

                            IList <IConditionLine>?conditionList = await databaseProvider.GetConditionsForAsync(keyMask,
                                                                                                                new IDatabaseProvider.ConditionKey(definition.Condition.SourceType, sourceGroup,
                                                                                                                                                   sourceEntry, sourceId));

                            if (conditionList == null || conditionList.Count == 0)
                            {
                                conditionList = new List <IConditionLine>();
                            }
                            row.Add("conditions", (typeof(IList <IConditionLine>), conditionList !));
                        }
                    }
                }
                catch (IMySqlExecutor.CannotConnectToDatabaseException)
                {
                }
                catch (IMySqlExecutor.QueryFailedDatabaseException e)
                {
                    await messageBoxService.ShowDialog(new MessageBoxFactory <bool>()
                                                       .SetTitle("Query error")
                                                       .SetMainInstruction(
                                                           "Unable to execute SQL query.")
                                                       .SetContent(e.Message)
                                                       .SetIcon(MessageBoxIcon.Error)
                                                       .WithOkButton(false)
                                                       .Build());
                }
                catch (Exception e)
                {
                    await messageBoxService.ShowDialog(new MessageBoxFactory <bool>()
                                                       .SetTitle("Database error")
                                                       .SetMainInstruction(
                                                           "Unable to execute SQL query. Most likely your database is incompatible with provided database schema, if you think this is a bug, report it via Help -> Report Bug")
                                                       .SetContent(e.ToString())
                                                       .SetIcon(MessageBoxIcon.Error)
                                                       .WithOkButton(false)
                                                       .Build());

                    return(null);
                }
            }
            else if (keys != null && keys.Length > 0)
            {
                Debug.Assert(customWhere == null, "Custom where with non single record mode is not supported");
                if (definition.IsOnlyConditionsTable)
                {
                    if (definition.Condition == null)
                    {
                        throw new Exception("only_conditions + no conditions make no sense");
                    }

                    result = new List <Dictionary <string, (Type, object)> >();

                    foreach (var key in keys)
                    {
                        Debug.Assert(key.Count == 1, "todo?");
                        int?sourceGroup = null, sourceEntry = null, sourceId = null;
                        if (definition.Condition.SourceGroupColumn != null &&
                            definition.TablePrimaryKeyColumnName == definition.Condition.SourceGroupColumn)
                        {
                            keyMask     = IDatabaseProvider.ConditionKeyMask.SourceGroup;
                            sourceGroup = (int)key[0];
                        }

                        if (definition.Condition.SourceEntryColumn != null &&
                            definition.TablePrimaryKeyColumnName == definition.Condition.SourceEntryColumn)
                        {
                            keyMask     = IDatabaseProvider.ConditionKeyMask.SourceEntry;
                            sourceEntry = (int)key[0];
                        }

                        if (definition.Condition.SourceIdColumn != null &&
                            definition.TablePrimaryKeyColumnName == definition.Condition.SourceIdColumn)
                        {
                            keyMask  = IDatabaseProvider.ConditionKeyMask.SourceId;
                            sourceId = (int)key[0];
                        }

                        IList <IConditionLine>?conditionList = await databaseProvider.GetConditionsForAsync(keyMask,
                                                                                                            new IDatabaseProvider.ConditionKey(definition.Condition.SourceType, sourceGroup,
                                                                                                                                               sourceEntry, sourceId));

                        if (conditionList != null && conditionList.Count > 0)
                        {
                            foreach (var distinct in conditionList
                                     .Select(line => (line.SourceEntry, line.SourceGroup, line.SourceId)).Distinct())
                            {
                                var row        = new Dictionary <string, (Type, object)>();
                                var conditions = conditionList.Where(l =>
                                                                     l.SourceEntry == distinct.SourceEntry && l.SourceId == distinct.SourceId &&
                                                                     l.SourceGroup == distinct.SourceGroup).ToList();

                                foreach (var column in definition.TableColumns.Values)
                                {
                                    if (column.IsConditionColumn)
                                    {
                                        continue;
                                    }
                                    if (definition.Condition.SourceGroupColumn != null &&
                                        column.DbColumnName == definition.Condition.SourceGroupColumn)
                                    {
                                        row.Add(column.DbColumnName, (typeof(int), distinct.SourceGroup));
                                    }

                                    if (definition.Condition.SourceEntryColumn != null &&
                                        column.DbColumnName == definition.Condition.SourceEntryColumn)
                                    {
                                        row.Add(column.DbColumnName, (typeof(int), distinct.SourceEntry));
                                    }

                                    if (definition.Condition.SourceIdColumn != null &&
                                        column.DbColumnName == definition.Condition.SourceIdColumn)
                                    {
                                        row.Add(column.DbColumnName, (typeof(int), distinct.SourceId));
                                    }
                                }
                                row.Add("conditions", (typeof(IList <IConditionLine>), conditions));
                                result.Add(row);
                            }
                        }
                    }
                }
                else
                {
                    Debug.Assert(customWhere == null, "Custom where with non single record mode is not supported");
                    var sqlStatement = BuildSQLQueryFromTableDefinition(definition, keys);
                    try
                    {
                        result = await sqlExecutor.ExecuteSelectSql(sqlStatement);

                        if (definition.Condition != null)
                        {
                            foreach (var row in result)
                            {
                                int?sourceGroup = null, sourceEntry = null, sourceId = null;

                                if (definition.Condition.SourceGroupColumn != null &&
                                    row.TryGetValue(definition.Condition.SourceGroupColumn, out var groupData) &&
                                    int.TryParse(groupData.Item2.ToString(), out var groupInt))
                                {
                                    sourceGroup = groupInt;
                                }

                                if (definition.Condition.SourceEntryColumn != null &&
                                    row.TryGetValue(definition.Condition.SourceEntryColumn, out var entryData) &&
                                    int.TryParse(entryData.Item2.ToString(), out var entryInt))
                                {
                                    sourceEntry = entryInt;
                                }

                                if (definition.Condition.SourceIdColumn != null &&
                                    row.TryGetValue(definition.Condition.SourceIdColumn, out var idData) &&
                                    int.TryParse(idData.Item2.ToString(), out var idInt))
                                {
                                    sourceId = idInt;
                                }

                                IList <IConditionLine>?conditionList = await databaseProvider.GetConditionsForAsync(keyMask,
                                                                                                                    new IDatabaseProvider.ConditionKey(definition.Condition.SourceType, sourceGroup,
                                                                                                                                                       sourceEntry, sourceId));

                                if (conditionList == null || conditionList.Count == 0)
                                {
                                    conditionList = new List <IConditionLine>();
                                }
                                row.Add("conditions", (typeof(IList <IConditionLine>), conditionList !));
                            }
                        }
                    }
                    catch (IMySqlExecutor.CannotConnectToDatabaseException)
                    {
                    }
                    catch (Exception e)
                    {
                        await messageBoxService.ShowDialog(new MessageBoxFactory <bool>()
                                                           .SetTitle("Database error")
                                                           .SetMainInstruction(
                                                               "Unable to execute SQL query. Most likely your database is incompatible with provided database schema, if you think this is a bug, report it via Help -> Report Bug")
                                                           .SetContent(e.ToString())
                                                           .SetIcon(MessageBoxIcon.Error)
                                                           .WithOkButton(false)
                                                           .Build());

                        return(null);
                    }
                }
            }

            if (result == null)
            {
                result = new List <Dictionary <string, (Type, object)> >();
            }

            return(tableModelGenerator.CreateDatabaseTable(definition, keys, result));
        }