Esempio n. 1
0
        // Delete methods
        public async Task <int> DeleteAsync(string deleteStatement, dynamic vars)
        {
            DeleteStatement statement = new DeleteStatement(this.database, deleteStatement);

            return(await this.DeleteAsync(statement, vars));
        }
Esempio n. 2
0
        public async Task <int> DeleteAsync(DeleteStatement deleteStatement, dynamic vars)
        {
            Dict varsDict = deleteStatement.ConvertParamsToDict(vars);

            (var whereIndex, var whereRefs) = deleteStatement.GetWhereIndexAndWhereRefs(this.database, varsDict);

            (string executableSql, Dict executableParams) = deleteStatement.GetExecutableSqlAndParams(varsDict, whereRefs);

            var    tableName    = deleteStatement.StatementFromRefs[0].table.Name;
            var    primaryIndex = deleteStatement.StatementFromRefs[0].table.Indexes[0];
            object keyValue     = await this.GetKeyValue(whereIndex, varsDict, executableParams, whereRefs, primaryIndex, tableName);

            Dict record            = null;
            var  deleteForeignKeys = this.database.GetForeignKeys(tableName, ForeignKeyRule.DeleteChildOnParentDelete, ForeignKeyRule.NullChildOnParentDelete);

            if (deleteForeignKeys.Length > 0)
            {
                record = await this.database.SelectRowAsync(tableName, keyValue);
            }

            int count;

            if (keyValue == null)
            {
                count = 0;
            }
            else
            {
                count = await this.DoDeleteAsync(executableSql, executableParams);

                if (count > 0)
                {
                    this.dataEvents.Add(new KeyValueDataEvent(DataEventType.Delete, tableName, keyValue));

                    foreach (var foreignKey in deleteForeignKeys)
                    {
                        var childSelectValues = new Dict();
                        for (int i = 0; i < foreignKey.parentFieldNames.Length; i++)
                        {
                            childSelectValues[foreignKey.childFieldNames[i]] = record[foreignKey.parentFieldNames[i]];
                        }
                        var childRecords = await this.database.SelectRowsAsync(foreignKey.childTable.Name, childSelectValues);

                        foreach (var childRecord in childRecords)
                        {
                            Dict modifyValues = new Dict();
                            foreach (var childPrimaryKeyFieldName in foreignKey.childTable.Indexes[0].FieldNames)
                            {
                                modifyValues[childPrimaryKeyFieldName] = childRecord[childPrimaryKeyFieldName];
                            }
                            switch (foreignKey.foreignKeyRule)
                            {
                            case ForeignKeyRule.DeleteChildOnParentDelete:
                                await this.DeleteAsync(foreignKey.childTable.Name, modifyValues);

                                break;

                            case ForeignKeyRule.NullChildOnParentDelete:
                                for (int i = 0; i < foreignKey.parentFieldNames.Length; i++)
                                {
                                    modifyValues[foreignKey.childFieldNames[i]] = null;
                                }
                                await this.UpdateAsync(foreignKey.childTable.Name, modifyValues);

                                break;
                            }
                        }
                    }
                }
                this.database.DeleteCount++;
            }

            return(count);
        }