예제 #1
0
 public EntityOrigianlField(EntityOrigianlField copy)
 {
     ColumnName    = copy.ColumnName;
     OriginalValue = copy.OriginalValue;
 }
        public async Task <(IList <ISolutionItem> items, IList <string> errors)> GenerateItemsForQuery(string query)
        {
            IList <ISolutionItem> found         = new List <ISolutionItem>();
            IList <string>        errors        = new List <string>();
            HashSet <string>      missingTables = new HashSet <string>();

            foreach (var q in queryEvaluator.Extract(query))
            {
                if (q is UpdateQuery updateQuery)
                {
                    var defi = tableDefinitionProvider.GetDefinitionByTableName(updateQuery.TableName);
                    if (defi == null)
                    {
                        missingTables.Add(updateQuery.TableName);
                        continue;
                    }

                    if (!updateQuery.Where.ColumnName.Equals(defi.TablePrimaryKeyColumnName,
                                                             StringComparison.InvariantCultureIgnoreCase))
                    {
                        missingTables.Add(updateQuery.TableName);
                        continue;
                    }

                    foreach (var key in updateQuery.Where.Values)
                    {
                        if (key is not long lkey)
                        {
                            continue;
                        }
                        var old = await loader.Load(defi.Id, (uint)lkey);

                        if (old == null || old.Entities.Count != 1 || !old.Entities[0].ExistInDatabase)
                        {
                            errors.Add($"{defi.TableName} where {defi.TablePrimaryKeyColumnName} = {lkey} not found, no update");
                            continue;
                        }
                        var item = new DatabaseTableSolutionItem(defi.Id);
                        item.Entries.Add(new SolutionItemDatabaseEntity((uint)lkey, true));
                        var savedItem = sessionService.Find(item);
                        if (savedItem != null)
                        {
                            item = (DatabaseTableSolutionItem)savedItem.Clone();
                        }

                        var originals = item.Entries[0].OriginalValues ??= new();
                        foreach (var upd in updateQuery.Updates)
                        {
                            var cell = old.Entities[0].GetCell(upd.ColumnName);
                            if (cell == null)
                            {
                                continue;
                            }
                            if (originals.Any(o => o.ColumnName == upd.ColumnName))
                            {
                                continue;
                            }
                            var original = new EntityOrigianlField()
                            {
                                ColumnName    = upd.ColumnName,
                                OriginalValue = cell.OriginalValue
                            };
                            originals.Add(original);
                        }
                        found.Add(item);
                    }
                }
                else if (q is InsertQuery insertQuery)
                {
                    var defi = tableDefinitionProvider.GetDefinitionByTableName(insertQuery.TableName);
                    if (defi == null)
                    {
                        missingTables.Add(insertQuery.TableName);
                        continue;
                    }

                    int indexOf = -1;
                    for (int i = 0; i < insertQuery.Columns.Count; ++i)
                    {
                        if (insertQuery.Columns[i].Equals(defi.TablePrimaryKeyColumnName,
                                                          StringComparison.InvariantCultureIgnoreCase))
                        {
                            indexOf = i;
                            break;
                        }
                    }

                    if (indexOf == -1)
                    {
                        missingTables.Add(insertQuery.TableName);
                        continue;
                    }

                    foreach (var line in insertQuery.Inserts)
                    {
                        if (line[indexOf] is not long lkey)
                        {
                            continue;
                        }
                        var item = new DatabaseTableSolutionItem(defi.Id);
                        item.Entries.Add(new SolutionItemDatabaseEntity((uint)lkey, false));
                        found.Add(item);
                    }
                }
            }
            foreach (var missing in missingTables)
            {
                errors.Add($"Table `{missing}` is not supported in WDE, no item added to the session.");
            }

            return(found, errors);
        }