Beispiel #1
0
        public override Result GetResult(Session session)
        {
            this.CheckAccessRights(session);
            object[]         dynamicArguments = session.sessionContext.DynamicArguments;
            IPersistentStore rowStore         = base.BaseTable.GetRowStore(session);
            int actionType = this.ActionType;

            switch (actionType)
            {
            case 0x12:
            {
                Row row = this.GetRow(session, dynamicArguments);
                if ((row == null) || row.IsDeleted(session, rowStore))
                {
                    throw Error.GetError(0xe25);
                }
                RowSetNavigatorDataChange navigator = new RowSetNavigatorDataChange();
                navigator.AddRow(row);
                StatementDML.Delete(session, base.BaseTable, navigator);
                break;
            }

            case 50:
            {
                object[] newRowData = base.BaseTable.GetNewRowData(session);
                for (int i = 0; i < newRowData.Length; i++)
                {
                    newRowData[base.BaseColumnMap[i]] = dynamicArguments[i];
                }
                return(base.InsertSingleRow(session, rowStore, newRowData));
            }

            default:
                if (actionType == 0x51)
                {
                    Row row = this.GetRow(session, dynamicArguments);
                    if ((row == null) || row.IsDeleted(session, rowStore))
                    {
                        throw Error.GetError(0xe25);
                    }
                    RowSetNavigatorDataChange navigator = new RowSetNavigatorDataChange();
                    object[] data = (object[])row.RowData.Clone();
                    bool[]   newColumnCheckList = base.BaseTable.GetNewColumnCheckList();
                    for (int i = 0; i < base.BaseColumnMap.Length; i++)
                    {
                        if (this.Types[i] != SqlType.SqlAllTypes)
                        {
                            data[base.BaseColumnMap[i]] = dynamicArguments[i];
                            newColumnCheckList[base.BaseColumnMap[i]] = true;
                        }
                    }
                    int[] columnMap = ArrayUtil.BooleanArrayToIntIndexes(newColumnCheckList);
                    navigator.AddRow(session, row, data, base.BaseTable.GetColumnTypes(), columnMap);
                    base.Update(session, base.BaseTable, navigator);
                }
                break;
            }
            return(Result.UpdateOneResult);
        }
Beispiel #2
0
        public Result ExecuteUpdateStatement(Session session)
        {
            Expression[] updateExpressions      = base.UpdateExpressions;
            RowSetNavigatorDataChange navigator = new RowSetNavigatorDataChange();

            SqlType[]      columnTypes = base.BaseTable.GetColumnTypes();
            IRangeIterator iterator    = RangeVariable.GetIterator(session, base.TargetRangeVariables);

            while (iterator.Next())
            {
                session.sessionData.StartRowProcessing();
                Row      currentRow = iterator.GetCurrentRow();
                object[] rowData    = currentRow.RowData;
                object[] data       = GetUpdatedData(session, this._targets, base.BaseTable, base.UpdateColumnMap, updateExpressions, columnTypes, rowData);
                if (this.UpdatableTableCheck != null)
                {
                    iterator.SetCurrent(data);
                    if (!this.UpdatableTableCheck.TestCondition(session))
                    {
                        iterator.Release();
                        throw Error.GetError(0x1644);
                    }
                }
                navigator.AddRow(session, currentRow, data, columnTypes, base.UpdateColumnMap);
            }
            iterator.Release();
            navigator.BeforeFirst();
            int count = this.Update(session, base.BaseTable, navigator);

            switch (count)
            {
            case 1:
                return(Result.UpdateOneResult);

            case 0:
                return(Result.UpdateZeroResult);
            }
            return(new Result(1, count));
        }
Beispiel #3
0
        public Result ExecuteDeleteStatement(Session session)
        {
            IRangeIterator            iterator  = RangeVariable.GetIterator(session, base.TargetRangeVariables);
            RowSetNavigatorDataChange navigator = new RowSetNavigatorDataChange();

            while (iterator.Next())
            {
                Row currentRow = iterator.GetCurrentRow();
                navigator.AddRow(currentRow);
            }
            iterator.Release();
            if (navigator.GetSize() <= 0)
            {
                return(Result.UpdateZeroResult);
            }
            int count = Delete(session, base.BaseTable, navigator);

            if (count == 1)
            {
                return(Result.UpdateOneResult);
            }
            return(new Result(1, count));
        }
Beispiel #4
0
        public int Update(Session session, Table table, RowSetNavigatorDataChange navigator)
        {
            int size = navigator.GetSize();

            for (int i = 0; i < size; i++)
            {
                navigator.Next();
                object[] currentChangedData = navigator.GetCurrentChangedData();
                table.SetIdentityColumn(session, currentChangedData);
                table.SetGeneratedColumns(session, currentChangedData);
            }
            navigator.BeforeFirst();
            if (table.FkMainConstraints.Length != 0)
            {
                HashSet <object> constraintPath = session.sessionContext.GetConstraintPath();
                for (int k = 0; k < size; k++)
                {
                    Row      nextRow            = navigator.GetNextRow();
                    object[] currentChangedData = navigator.GetCurrentChangedData();
                    PerformReferentialActions(session, table, navigator, nextRow, currentChangedData, base.UpdateColumnMap, constraintPath);
                    constraintPath.Clear();
                }
                navigator.BeforeFirst();
            }
            for (int j = 0; j < navigator.GetSize(); j++)
            {
                Row      nextRow               = navigator.GetNextRow();
                object[] currentChangedData    = navigator.GetCurrentChangedData();
                int[]    currentChangedColumns = navigator.GetCurrentChangedColumns();
                Table    table2 = (Table)nextRow.GetTable();
                if (table2.TriggerLists[8].Length != 0)
                {
                    table2.FireTriggers(session, 8, nextRow.RowData, currentChangedData, currentChangedColumns);
                    table2.EnforceRowConstraints(session, currentChangedData);
                }
            }
            if (!table.IsView())
            {
                navigator.BeforeFirst();
                for (int k = 0; k < navigator.GetSize(); k++)
                {
                    Row   nextRow = navigator.GetNextRow();
                    Table table3  = (Table)nextRow.GetTable();
                    int[] currentChangedColumns = navigator.GetCurrentChangedColumns();
                    session.AddDeleteAction(table3, nextRow, currentChangedColumns);
                }
                navigator.BeforeFirst();
                for (int m = 0; m < navigator.GetSize(); m++)
                {
                    object[]         currentChangedData    = navigator.GetCurrentChangedData();
                    Table            table4                = (Table)navigator.GetNextRow().GetTable();
                    int[]            currentChangedColumns = navigator.GetCurrentChangedColumns();
                    IPersistentStore rowStore              = table4.GetRowStore(session);
                    if (currentChangedData != null)
                    {
                        table4.InsertSingleRow(session, rowStore, currentChangedData, currentChangedColumns);
                    }
                }
                navigator.BeforeFirst();
                OrderedHashSet <Table> set2 = null;
                bool flag = table.TriggerLists[5].Length > 0;
                for (int n = 0; n < navigator.GetSize(); n++)
                {
                    Row      nextRow               = navigator.GetNextRow();
                    Table    table5                = (Table)nextRow.GetTable();
                    object[] currentChangedData    = navigator.GetCurrentChangedData();
                    int[]    currentChangedColumns = navigator.GetCurrentChangedColumns();
                    PerformIntegrityChecks(session, table5, nextRow.RowData, currentChangedData, currentChangedColumns);
                    if (table5 != table)
                    {
                        if (set2 == null)
                        {
                            set2 = new OrderedHashSet <Table>();
                        }
                        set2.Add(table5);
                        if (table5.TriggerLists[5].Length != 0)
                        {
                            flag = true;
                        }
                    }
                }
                navigator.BeforeFirst();
                if (flag)
                {
                    for (int num9 = 0; num9 < navigator.GetSize(); num9++)
                    {
                        Row      nextRow               = navigator.GetNextRow();
                        object[] currentChangedData    = navigator.GetCurrentChangedData();
                        int[]    currentChangedColumns = navigator.GetCurrentChangedColumns();
                        ((Table)nextRow.GetTable()).FireTriggers(session, 5, nextRow.RowData, currentChangedData, currentChangedColumns);
                    }
                    navigator.BeforeFirst();
                }
                base.BaseTable.FireTriggers(session, 2, navigator);
                if (set2 != null)
                {
                    for (int num10 = 0; num10 < set2.Size(); num10++)
                    {
                        set2.Get(num10).FireTriggers(session, 2, navigator);
                    }
                }
            }
            return(size);
        }
Beispiel #5
0
        private static void PerformReferentialActions(Session session, Table table, RowSetNavigatorDataChange navigator, Row row, object[] data, int[] changedCols, HashSet <object> path)
        {
            if (session.database.IsReferentialIntegrity())
            {
                bool flag   = data == null;
                int  index  = 0;
                int  length = table.FkMainConstraints.Length;
                while (index < length)
                {
                    Constraint item = table.FkMainConstraints[index];
                    int        num3 = flag ? item.Core.DeleteAction : item.Core.UpdateAction;
                    if (flag || (ArrayUtil.HaveCommonElement(changedCols, item.Core.MainCols) && (item.Core.MainIndex.CompareRowNonUnique(session, row.RowData, data, item.Core.MainCols) != 0)))
                    {
                        IRowIterator iterator = item.FindFkRef(session, row.RowData);
                        if (iterator.HasNext())
                        {
                            while (iterator.HasNext())
                            {
                                object[]     emptyRowData;
                                int          num6;
                                int          num7;
                                ColumnSchema schema;
                                Row          nextRow = iterator.GetNextRow();
                                if (item.Core.RefIndex.CompareRowNonUnique(session, nextRow.RowData, row.RowData, item.Core.MainCols) != 0)
                                {
                                    break;
                                }
                                if (flag && (nextRow.GetId() == row.GetId()))
                                {
                                    iterator.Release();
                                }
                                else
                                {
                                    switch (num3)
                                    {
                                    case 0:
                                        if (!flag)
                                        {
                                            goto Label_0151;
                                        }
                                        if (navigator.AddRow(nextRow))
                                        {
                                            PerformReferentialActions(session, item.Core.RefTable, navigator, nextRow, null, null, path);
                                        }
                                        break;

                                    case 1:
                                    case 3:
                                        if (!navigator.ContainsDeletedRow(nextRow))
                                        {
                                            int      code = (item.Core.DeleteAction == 3) ? 8 : 0xdad;
                                            string[] add  = new string[] { item.Core.RefName.Name, item.Core.RefTable.GetName().Name };
                                            iterator.Release();
                                            throw Error.GetError(null, code, 2, add);
                                        }
                                        break;

                                    case 2:
                                        emptyRowData = item.Core.RefTable.GetEmptyRowData();
                                        Array.Copy(nextRow.RowData, 0, emptyRowData, 0, emptyRowData.Length);
                                        num6 = 0;
                                        goto Label_0268;

                                    case 4:
                                        emptyRowData = item.Core.RefTable.GetEmptyRowData();
                                        Array.Copy(nextRow.RowData, 0, emptyRowData, 0, emptyRowData.Length);
                                        num7 = 0;
                                        goto Label_02E5;
                                    }
                                }
                                continue;
Label_0151:
                                emptyRowData = item.Core.RefTable.GetEmptyRowData();
                                Array.Copy(nextRow.RowData, 0, emptyRowData, 0, emptyRowData.Length);
                                for (int i = 0; i < item.Core.RefCols.Length; i++)
                                {
                                    emptyRowData[item.Core.RefCols[i]] = data[item.Core.MainCols[i]];
                                }
                                goto Label_02F6;
Label_0250:
                                emptyRowData[item.Core.RefCols[num6]] = null;
                                num6++;
Label_0268:
                                if (num6 < item.Core.RefCols.Length)
                                {
                                    goto Label_0250;
                                }
                                goto Label_02F6;
Label_02A6:
                                schema = item.Core.RefTable.GetColumn(item.Core.RefCols[num7]);
                                emptyRowData[item.Core.RefCols[num7]] = schema.GetDefaultValue(session);
                                num7++;
Label_02E5:
                                if (num7 < item.Core.RefCols.Length)
                                {
                                    goto Label_02A6;
                                }
Label_02F6:
                                emptyRowData = navigator.AddRow(session, nextRow, emptyRowData, table.GetColumnTypes(), item.Core.RefCols);
                                if (path.Add(item))
                                {
                                    PerformReferentialActions(session, item.Core.RefTable, navigator, nextRow, emptyRowData, item.Core.RefCols, path);
                                    path.Remove(item);
                                }
                            }
                            iterator.Release();
                        }
                    }
                    index++;
                }
            }
        }
Beispiel #6
0
        public Result ExecuteMergeStatement(Session session)
        {
            SqlType[]       columnTypes        = base.BaseTable.GetColumnTypes();
            Result          result             = null;
            RowSetNavigator generatedNavigator = null;

            if (base.GeneratedIndexes != null)
            {
                result             = Result.NewUpdateCountResult(base.generatedResultMetaData, 0);
                generatedNavigator = result.GetChainedResult().GetNavigator();
            }
            int count = 0;
            RowSetNavigatorClient     newData   = new RowSetNavigatorClient(8);
            RowSetNavigatorDataChange navigator = new RowSetNavigatorDataChange();

            RangeVariable[]  targetRangeVariables = base.TargetRangeVariables;
            IRangeIterator[] iteratorArray        = new IRangeIterator[targetRangeVariables.Length];
            for (int i = 0; i < targetRangeVariables.Length; i++)
            {
                iteratorArray[i] = targetRangeVariables[i].GetIterator(session);
            }
            int index = 0;

            while (index >= 0)
            {
                IRangeIterator iterator = iteratorArray[index];
                bool           flag     = iterator.IsBeforeFirst();
                if (iterator.Next())
                {
                    if (index < (targetRangeVariables.Length - 1))
                    {
                        index++;
                        continue;
                    }
                    if (base.UpdateExpressions.Length == 0)
                    {
                        continue;
                    }
                    Row      currentRow = iterator.GetCurrentRow();
                    object[] data       = GetUpdatedData(session, this._targets, base.BaseTable, base.UpdateColumnMap, base.UpdateExpressions, columnTypes, currentRow.RowData);
                    try
                    {
                        navigator.AddRow(session, currentRow, data, columnTypes, base.UpdateColumnMap);
                        continue;
                    }
                    catch (CoreException)
                    {
                        for (int k = 0; k < targetRangeVariables.Length; k++)
                        {
                            iteratorArray[k].Reset();
                        }
                        throw Error.GetError(0xc81);
                    }
                }
                if (((index == 1) & flag) && (base.InsertExpression != null))
                {
                    object[] data = this.GetInsertData(session, columnTypes, base.InsertExpression.nodes[0].nodes);
                    if (data != null)
                    {
                        newData.Add(data);
                    }
                }
                iterator.Reset();
                index--;
            }
            for (int j = 0; j < targetRangeVariables.Length; j++)
            {
                iteratorArray[j].Reset();
            }
            if (base.UpdateExpressions.Length != 0)
            {
                count = this.Update(session, base.BaseTable, navigator);
            }
            if (newData.GetSize() > 0)
            {
                this.InsertRowSet(session, generatedNavigator, newData);
                count += newData.GetSize();
            }
            if ((base.InsertExpression != null) && (base.BaseTable.TriggerLists[0].Length != 0))
            {
                base.BaseTable.FireTriggers(session, 0, newData);
            }
            if (result != null)
            {
                result.SetUpdateCount(count);
                return(result);
            }
            if (count == 1)
            {
                return(Result.UpdateOneResult);
            }
            return(new Result(1, count));
        }
Beispiel #7
0
        public static int Delete(Session session, Table table, RowSetNavigatorDataChange navigator)
        {
            int size = navigator.GetSize();

            navigator.BeforeFirst();
            if (table.FkMainConstraints.Length != 0)
            {
                HashSet <object> constraintPath = session.sessionContext.GetConstraintPath();
                for (int i = 0; i < size; i++)
                {
                    navigator.Next();
                    Row currentRow = navigator.GetCurrentRow();
                    PerformReferentialActions(session, table, navigator, currentRow, null, null, constraintPath);
                    constraintPath.Clear();
                }
                navigator.BeforeFirst();
            }
            while (navigator.HasNext())
            {
                navigator.Next();
                Row      currentRow            = navigator.GetCurrentRow();
                object[] currentChangedData    = navigator.GetCurrentChangedData();
                int[]    currentChangedColumns = navigator.GetCurrentChangedColumns();
                Table    table2 = (Table)currentRow.GetTable();
                if (currentChangedData == null)
                {
                    table2.FireTriggers(session, 7, currentRow.RowData, null, null);
                }
                else
                {
                    table2.FireTriggers(session, 8, currentRow.RowData, currentChangedData, currentChangedColumns);
                }
            }
            if (!table.IsView())
            {
                navigator.BeforeFirst();
                bool flag = false;
                for (int i = 0; i < navigator.GetSize(); i++)
                {
                    Row   nextRow = navigator.GetNextRow();
                    Table table3  = (Table)nextRow.GetTable();
                    session.AddDeleteAction(table3, nextRow, null);
                    if (navigator.GetCurrentChangedData() != null)
                    {
                        flag = true;
                    }
                }
                navigator.BeforeFirst();
                if (flag)
                {
                    for (int j = 0; j < navigator.GetSize(); j++)
                    {
                        object[]         currentChangedData    = navigator.GetCurrentChangedData();
                        Table            table4                = (Table)navigator.GetNextRow().GetTable();
                        int[]            currentChangedColumns = navigator.GetCurrentChangedColumns();
                        IPersistentStore rowStore              = table4.GetRowStore(session);
                        if (currentChangedData != null)
                        {
                            table4.InsertSingleRow(session, rowStore, currentChangedData, currentChangedColumns);
                        }
                    }
                    navigator.BeforeFirst();
                }
                OrderedHashSet <Table> set2 = null;
                OrderedHashSet <Table> set3 = null;
                bool flag2 = table.TriggerLists[4].Length > 0;
                if (size != navigator.GetSize())
                {
                    while (navigator.HasNext())
                    {
                        navigator.Next();
                        Row      currentRow            = navigator.GetCurrentRow();
                        object[] currentChangedData    = navigator.GetCurrentChangedData();
                        int[]    currentChangedColumns = navigator.GetCurrentChangedColumns();
                        Table    table5 = (Table)currentRow.GetTable();
                        if (currentChangedData != null)
                        {
                            PerformIntegrityChecks(session, table5, currentRow.RowData, currentChangedData, currentChangedColumns);
                        }
                        if (table5 != table)
                        {
                            if (currentChangedData == null)
                            {
                                if (table5.TriggerLists[4].Length != 0)
                                {
                                    flag2 = true;
                                }
                                if (set3 == null)
                                {
                                    set3 = new OrderedHashSet <Table>();
                                }
                                set3.Add(table5);
                            }
                            else
                            {
                                if (table5.TriggerLists[5].Length != 0)
                                {
                                    flag2 = true;
                                }
                                if (set2 == null)
                                {
                                    set2 = new OrderedHashSet <Table>();
                                }
                                set2.Add(table5);
                            }
                        }
                    }
                    navigator.BeforeFirst();
                }
                if (flag2)
                {
                    while (navigator.HasNext())
                    {
                        navigator.Next();
                        Row      currentRow         = navigator.GetCurrentRow();
                        object[] currentChangedData = navigator.GetCurrentChangedData();
                        Table    table6             = (Table)currentRow.GetTable();
                        if (currentChangedData == null)
                        {
                            table6.FireTriggers(session, 4, currentRow.RowData, null, null);
                        }
                        else
                        {
                            table6.FireTriggers(session, 5, currentRow.RowData, currentChangedData, null);
                        }
                    }
                    navigator.BeforeFirst();
                }
                table.FireTriggers(session, 1, navigator);
                if (set2 != null)
                {
                    for (int j = 0; j < set2.Size(); j++)
                    {
                        set2.Get(j).FireTriggers(session, 2, navigator);
                    }
                }
                if (set3 != null)
                {
                    for (int j = 0; j < set3.Size(); j++)
                    {
                        set3.Get(j).FireTriggers(session, 1, navigator);
                    }
                }
            }
            return(size);
        }