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[]
public Task <IList <IConditionLine> > GetConditionsForAsync(IDatabaseProvider.ConditionKeyMask keyMask, IDatabaseProvider.ConditionKey manualKey) => Task.FromResult <IList <IConditionLine> >(System.Array.Empty <IConditionLine>());
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);
public Task <IList <IConditionLine> > GetConditionsForAsync(IDatabaseProvider.ConditionKeyMask keyMask, IDatabaseProvider.ConditionKey key) => impl.GetConditionsForAsync(keyMask, key);
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)); }