示例#1
0
        // Кнопка подтверждения удаления
        private async void confirmDeleteButton_Click(object sender, EventArgs e)
        {
            DeleteResult    deleteResult   = DeleteResult.Failed;
            DbTable         tableName      = TableNameToEnumConverter.Convert(tableComboBox.AccessibilityObject.Value?.ToString());
            IDbTableManager dbTableManager = GetTableManager(tableName);
            string          recordId       = deleteRecordIdTextBox.Text;
            string          resultMessage  = "Something went wrong, try again";

            if (string.IsNullOrEmpty(recordId))
            {
                resultMessage = "Record ID field is required, try again";
            }
            else
            {
                deleteResult = await dbTableManager.DeleteRecord(int.Parse(recordId));

                if (deleteResult == DeleteResult.RecordNotFound)
                {
                    resultMessage = "Record not found, try again";
                }
                else if (deleteResult == DeleteResult.Success)
                {
                    resultMessage = "Record was successfully deleted";
                }
            }

            MessageBox.Show(resultMessage, "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);

            if (deleteResult == DeleteResult.Success)
            {
                deletePanel.Visible        = false;
                deleteRecordIdTextBox.Text = "";
                await DataGridDataInitialize(tableName);
            }
        }
示例#2
0
        public Dictionary <UbjectMetadata, object> GetObjectsIncMetadata(Type type, List <Tuple <string, string, string> > filterProperties = null)
        {
            Dictionary <UbjectMetadata, object> ubjects = new Dictionary <UbjectMetadata, object>();

            IDbTableManager databaseTable = DbManager.GetDbTableManagerForObject(type, false);

            if (databaseTable != null)
            {
                ubjects = databaseTable.GetObjects(type, filterProperties);

                if (ubjects.Count > 0)
                {
                    var objectAnatomyDefinition = GetObjectAnatomyDefinition(ubjects.Values.First());

                    foreach (var collectionObject in objectAnatomyDefinition.CollectionReferenceTypeObjects)
                    {
                        IEnumerator     enumerator         = collectionObject.Value.GetEnumerator();
                        Type            collectionItemType = enumerator.GetType().GetGenericArguments()[0];
                        IDbTableManager childDatabaseTable = DbManager.GetDbTableManagerForObject(collectionItemType, false);

                        if (childDatabaseTable != null)
                        {
                            foreach (KeyValuePair <UbjectMetadata, object> ubject in ubjects)
                            {
                                List <Tuple <string, string, string> > mappingFilterCondition = new List <Tuple <string, string, string> >();

                                mappingFilterCondition.Add(new Tuple <string, string, string>(parentTableKey, databaseTable.TableName, "="));
                                mappingFilterCondition.Add(new Tuple <string, string, string>(parentObjectKey, ubject.Key.PrimaryKey.ToString(), "="));
                                mappingFilterCondition.Add(new Tuple <string, string, string>(childTableKey, childDatabaseTable.TableName, "="));

                                List <UbjectMapping> ubjectMappings = GetObjects <UbjectMapping>(mappingFilterCondition);
                                List <object>        childObjects   = new List <object>();

                                foreach (var ubjectMapping in ubjectMappings)
                                {
                                    List <Tuple <string, string, string> > childObjectFilterCondition = new List <Tuple <string, string, string> >();
                                    childObjectFilterCondition.Add(new Tuple <string, string, string>(UbjectMetadata.PRIMARY_KEY, ubjectMapping.ChildObjectKey, "="));
                                    childObjects.AddRange(GetObjectsIncMetadata(collectionItemType, childObjectFilterCondition).Values);
                                }

                                PropertyInfo propertyInfo       = type.GetProperty(collectionObject.Key, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
                                MethodInfo   methodInfo         = propertyInfo.PropertyType.GetMethod("Add");
                                object       collectionInstance = Activator.CreateInstance(propertyInfo.PropertyType);

                                foreach (object childObject in childObjects)
                                {
                                    methodInfo.Invoke(collectionInstance, new object[] { childObject });
                                }

                                propertyInfo.SetValue(ubject.Value, collectionInstance, null);
                            }
                        }
                    }
                }
            }

            return(ubjects);
        }
示例#3
0
        public void RemoveAllObjects <T>()
        {
            IDbTableManager databaseTable = DbManager.GetDbTableManagerForObject(typeof(T));

            if (databaseTable != null)
            {
                databaseTable.DeleteAllObjects();
            }
        }
示例#4
0
        public override IDbTableManager CreateDatabaseTable(string tableName, List <PropertyInfo> properties)
        {
            IDbTableManager databaseTable = Utilities.CreateDbTableManager(this);

            databaseTable.TableName = (string.IsNullOrEmpty(tableName) ? Guid.NewGuid().ToString().ToUpper() : tableName);

            StringBuilder commandText = new StringBuilder();

            commandText.Append(string.Format("{0} `{1}`.`{2}`", "CREATE TABLE ", SchemaName, databaseTable.TableName));
            commandText.Append("(");
            commandText.Append(string.Format("`{0}` {1} {2} {3} {4}, ", UbjectMetadata.PRIMARY_KEY, "INT(11)", "UNIQUE", "NOT NULL", "AUTO_INCREMENT").Trim());
            commandText.Append(string.Format("`{0}` {1} {2} {3} {4}, ", UbjectMetadata.UBJECT_HASH, "VARCHAR(100)", "", "NOT NULL", "").Trim());
            commandText.Append(string.Format("`{0}` {1} {2} {3} {4}, ", UbjectMetadata.UBJECT_TIMESTAMP, "BIGINT", "", "NOT NULL", "").Trim());

            foreach (PropertyInfo property in properties)
            {
                if ((property.PropertyType == typeof(int)) ||
                    (property.PropertyType == typeof(int?)))
                {
                    commandText.Append(string.Format("`{0}` {1} {2}, ", property.Name.ToUpper(), "INT", "DEFAULT NULL").Trim());
                }
                else if ((property.PropertyType == typeof(long)) ||
                         (property.PropertyType == typeof(long?)))
                {
                    commandText.Append(string.Format("`{0}` {1} {2}, ", property.Name.ToUpper(), "BIGINT", "DEFAULT NULL").Trim());
                }
                else if ((property.PropertyType == typeof(float)) ||
                         (property.PropertyType == typeof(float?)))
                {
                    commandText.Append(string.Format("`{0}` {1} {2}, ", property.Name.ToUpper(), "FLOAT", "DEFAULT NULL").Trim());
                }
                else
                {
                    commandText.Append(string.Format("`{0}` {1} {2}, ", property.Name.ToUpper(), "VARCHAR(" + VarCharFieldSize + ")", "DEFAULT NULL").Trim());
                }
                databaseTable.Columns.Add(property.Name.ToUpper());
            }

            commandText.Append(string.Format("{0}(`{1}`), ", "PRIMARY KEY", UbjectMetadata.PRIMARY_KEY));

            List <PropertyInfo> indexedProperties = properties.GetIndexedProperties();

            foreach (PropertyInfo property in indexedProperties)
            {
                commandText.Append(string.Format("{0} `IDX_{1}` (`{2}` ASC), ", "INDEX", property.Name.ToUpper(), property.Name.ToUpper()));
            }

            commandText.Append(string.Format("{0} `IDX_{1}` (`{2}` ASC) ", "INDEX", UbjectMetadata.UBJECT_TIMESTAMP, UbjectMetadata.UBJECT_TIMESTAMP));
            commandText.Append(")");
            commandText.Append("ENGINE = InnoDB DEFAULT CHARSET = utf8;");

            dbQueryExecutor.ExecuteNonQuery(commandText);

            return(databaseTable);
        }
示例#5
0
        public void RemoveObject(object data, List <string> filterProperties)
        {
            Dictionary <UbjectMetadata, object> objects = new Dictionary <UbjectMetadata, object>();

            IDbTableManager databaseTable = DbManager.GetDbTableManagerForObject(data.GetType());

            if (databaseTable != null)
            {
                objects = databaseTable.GetObjects(data.GetType(), CreateCompleteFilterFromPropertyAndData(data, filterProperties));

                if (objects.Count > 0)
                {
                    var objectAnatomyDefinition = GetObjectAnatomyDefinition(objects.Values.First());

                    foreach (var collectionObject in objectAnatomyDefinition.CollectionReferenceTypeObjects)
                    {
                        IEnumerator     enumerator           = collectionObject.Value.GetEnumerator();
                        Type            collectionItemType   = enumerator.GetType().GetGenericArguments()[0];
                        IDbTableManager mappingDatabaseTable = DbManager.GetDbTableManagerForObject(typeof(UbjectMapping), false);
                        IDbTableManager childDatabaseTable   = DbManager.GetDbTableManagerForObject(collectionItemType, false);

                        if ((mappingDatabaseTable != null) && (childDatabaseTable != null))
                        {
                            foreach (KeyValuePair <UbjectMetadata, object> ubject in objects)
                            {
                                List <Tuple <string, string, string> > mappingFilterCondition = new List <Tuple <string, string, string> >();

                                mappingFilterCondition.Add(new Tuple <string, string, string>(parentTableKey, databaseTable.TableName, "="));
                                mappingFilterCondition.Add(new Tuple <string, string, string>(parentObjectKey, ubject.Key.PrimaryKey.ToString(), "="));
                                mappingFilterCondition.Add(new Tuple <string, string, string>(childTableKey, childDatabaseTable.TableName, "="));

                                Dictionary <UbjectMetadata, UbjectMapping> objectMappings = GetObjectsIncMetadata <UbjectMapping>(mappingFilterCondition);

                                List <UbjectMetadata> childObjectsMetadata = new List <UbjectMetadata>();

                                foreach (var objectMapping in objectMappings.Values)
                                {
                                    List <Tuple <string, string, string> > childObjectFilterCondition = new List <Tuple <string, string, string> >();
                                    childObjectFilterCondition.Add(new Tuple <string, string, string>(UbjectMetadata.PRIMARY_KEY, objectMapping.ChildObjectKey, "="));
                                    List <UbjectMetadata> ubjectMetadata = new List <UbjectMetadata>(GetObjectsIncMetadata(collectionItemType, childObjectFilterCondition).Keys);
                                    childObjectsMetadata.AddRange(ubjectMetadata);
                                }

                                childObjectsMetadata.ForEach(x => childDatabaseTable.DeleteObject(x));
                                objectMappings.Keys.ToList().ForEach(x => mappingDatabaseTable.DeleteObject(x));
                            }
                        }
                    }

                    objects.Keys.ToList().ForEach(x => databaseTable.DeleteObject(x));
                }
            }
        }
示例#6
0
        public Tuple <string, string> PersistObject(object data, List <string> filterProperties = null)
        {
            string primaryKey = string.Empty;

            IDbTableManager databaseTable = DbManager.GetDbTableManagerForObject(data.GetType());

            if (databaseTable != null)
            {
                bool objectUpdated           = false;
                var  objectAnatomyDefinition = GetObjectAnatomyDefinition(data);

                if (filterProperties != null)
                {
                    var objects = databaseTable.GetObjects(data.GetType(), CreateCompleteFilterFromPropertyAndData(data, filterProperties));

                    if (objects.Count == 1)
                    {
                        databaseTable.UpdateObject(objectAnatomyDefinition.PropertiesAndValues, objects.Keys.First().PrimaryKey);
                        objectUpdated = true;
                    }
                    else if (objects.Count != 0)
                    {
                        throw new Exception(string.Format("Multiple existing objects found while attempting to persist object. Filter: {0} Number of objects returned: {1}",
                                                          string.Join(", ", filterProperties),
                                                          objects.Count));
                    }
                }

                if (!objectUpdated)
                {
                    primaryKey = databaseTable.AddObject(objectAnatomyDefinition.PropertiesAndValues).ToString();
                }

                foreach (KeyValuePair <string, ICollection> collectionObject in objectAnatomyDefinition.CollectionReferenceTypeObjects)
                {
                    foreach (var collectionItem in collectionObject.Value)
                    {
                        Tuple <string, string> childObjectKey = PersistObject(collectionItem);
                        PersistObject(new UbjectMapping(databaseTable.TableName, primaryKey, childObjectKey.Item1, childObjectKey.Item2));
                    }
                }
            }

            return(new Tuple <string, string>(databaseTable.TableName, primaryKey));
        }
示例#7
0
        public override IDbTableManager CreateDatabaseTable(string tableName, List <PropertyInfo> properties)
        {
            IDbTableManager databaseTable = Utilities.CreateDbTableManager(this);

            databaseTable.TableName = (string.IsNullOrEmpty(tableName) ? Guid.NewGuid().ToString().ToUpper() : tableName);

            StringBuilder commandText = new StringBuilder();

            commandText.Append(string.Format("{0} '{1}'", "CREATE TABLE", databaseTable.TableName));
            commandText.Append("(");
            commandText.Append(string.Format("{0} {1} {2} {3},", UbjectMetadata.PRIMARY_KEY, "INTEGER", "PRIMARY KEY", "AUTOINCREMENT").Trim());
            commandText.Append(string.Format("{0} {1} {2} {3},", UbjectMetadata.UBJECT_HASH, "CHAR(100)", "", "NOT NULL").Trim());
            commandText.Append(string.Format("{0} {1} {2} {3},", UbjectMetadata.UBJECT_TIMESTAMP, "BIGINT", "", "NOT NULL").Trim());
            commandText.Append(string.Join(", ", properties.Select(x => string.Format("{0} {1}", x.Name.ToUpper(), "TEXT"))).Trim());
            properties.ForEach(x => databaseTable.Columns.Add(x.Name.ToUpper()));
            commandText.Append(");");
            dbQueryExecutor.ExecuteNonQuery(commandText);

            commandText.Clear();
            commandText.Append(
                string.Format(
                    "CREATE INDEX IDX_{0}_{1} ON '{2}' ({3});",
                    UbjectMetadata.UBJECT_TIMESTAMP,
                    databaseTable.TableName.Replace("-", ""),
                    databaseTable.TableName,
                    UbjectMetadata.UBJECT_TIMESTAMP));

            foreach (PropertyInfo property in properties.GetIndexedProperties())
            {
                commandText.Append(
                    string.Format(
                        "{0} IDX_{1}_{2} ON '{3}' ({4});",
                        "CREATE INDEX",
                        property.Name.ToUpper(),
                        databaseTable.TableName.Replace("-", ""),
                        databaseTable.TableName,
                        property.Name.ToUpper()));
            }

            dbQueryExecutor.ExecuteNonQuery(commandText);

            return(databaseTable);
        }
示例#8
0
        /// <summary>
        /// Check then add primary keys to schema table
        /// </summary>
        private void SetPrimaryKeys(SyncTable schemaTable, IDbTableManager dbManagerTable)
        {
            // Get PrimaryKey
            var schemaPrimaryKeys = dbManagerTable.GetPrimaryKeys();

            if (schemaPrimaryKeys == null || schemaPrimaryKeys.Any() == false)
            {
                throw new MissingPrimaryKeyException(schemaTable.TableName);
            }

            // Set the primary Key
            foreach (var rowColumn in schemaPrimaryKeys.OrderBy(r => r.Ordinal))
            {
                var columnKey = schemaTable.Columns.FirstOrDefault(sc => sc == rowColumn);

                if (columnKey == null)
                {
                    throw new MissingColumnException(rowColumn.ColumnName, schemaTable.TableName);
                }

                schemaTable.PrimaryKeys.Add(columnKey.ColumnName);
            }
        }
示例#9
0
        /// <summary>
        /// Check then add primary keys to schema table
        /// </summary>
        private async Task SetPrimaryKeysAsync(SyncTable schemaTable, IDbTableManager dbManagerTable)
        {
            // Get PrimaryKey
            var schemaPrimaryKeys = await dbManagerTable.GetPrimaryKeysAsync().ConfigureAwait(false);

            if (schemaPrimaryKeys == null || schemaPrimaryKeys.Any() == false)
            {
                throw new MissingPrimaryKeyException(schemaTable.TableName);
            }

            // Set the primary Key
            foreach (var rowColumn in schemaPrimaryKeys.OrderBy(r => r.Ordinal))
            {
                // Find the column in the schema columns
                var columnKey = schemaTable.Columns.FirstOrDefault(sc => sc.EqualsByName(rowColumn));

                if (columnKey == null)
                {
                    throw new MissingPrimaryKeyColumnException(rowColumn.ColumnName, schemaTable.TableName);
                }

                schemaTable.PrimaryKeys.Add(columnKey.ColumnName);
            }
        }
示例#10
0
        public virtual List <IDbTableManager> GetAllDbTableManagers()
        {
            List <IDbTableManager> dbTableManagers = new List <IDbTableManager>();

            using (var tableConnection = Utilities.CreateDbConnection(this))
            {
                IDbCommand showTableCommand = tableConnection.CreateCommand();
                showTableCommand.CommandText = ShowTablesCommand;
                tableConnection.Open();

                IDataReader tableReader = showTableCommand.ExecuteReader();

                using (var columnsConnection = Utilities.CreateDbConnection(this))
                {
                    columnsConnection.Open();

                    while (tableReader.Read())
                    {
                        for (int tableFieldIndex = 0; tableFieldIndex < 1 /*tableReader.FieldCount*/; tableFieldIndex++)
                        {
                            IDbTableManager dbTableManager = Utilities.CreateDbTableManager(this);
                            dbTableManager.TableName = tableReader.GetValue(tableFieldIndex).ToString();

                            IDbCommand showColumnsCommand = columnsConnection.CreateCommand();
                            showColumnsCommand.CommandText = ShowColumnsCommand(dbTableManager.TableName);

                            IDataReader schemaReader = showColumnsCommand.ExecuteReader();

                            while (schemaReader.Read())
                            {
                                for (int schemaFieldIndex = 0; schemaFieldIndex < schemaReader.FieldCount; schemaFieldIndex++)
                                {
                                    string fieldName = schemaReader.GetName(schemaFieldIndex).ToString();

                                    if (fieldName == ColumnCommandFieldName)
                                    {
                                        string columnName = schemaReader.GetValue(schemaFieldIndex).ToString();

                                        if (!UbjectMetadata.IsMetadataField(columnName))
                                        {
                                            dbTableManager.Columns.Add(columnName);
                                        }

                                        break;
                                    }
                                }
                            }

                            schemaReader.Close();
                            dbTableManagers.Add(dbTableManager);
                        }
                    }

                    columnsConnection.Close();
                }

                tableReader.Close();
                tableConnection.Close();
            }

            return(dbTableManagers);
        }
示例#11
0
        /// <summary>
        /// Generate the DmTable configuration from a given columns list
        /// Validate that all columns are currently supported by the provider
        /// </summary>
        private void FillSyncTableWithColumns(SetupTable setupTable, SyncTable schemaTable, IEnumerable <SyncColumn> columns, IDbTableManager dbManagerTable)
        {
            schemaTable.OriginalProvider = this.ProviderTypeName;
            schemaTable.SyncDirection    = setupTable.SyncDirection;

            var ordinal = 0;

            // Eventually, do not raise exception here, just we don't have any columns
            if (columns == null || columns.Any() == false)
            {
                return;
            }

            // Delete all existing columns
            if (schemaTable.PrimaryKeys.Count > 0)
            {
                schemaTable.PrimaryKeys.Clear();
            }

            if (schemaTable.Columns.Count > 0)
            {
                schemaTable.Columns.Clear();
            }


            IEnumerable <SyncColumn> lstColumns;

            // Validate columns list from setup table if any
            if (setupTable.Columns != null && setupTable.Columns.Count > 1)
            {
                lstColumns = new List <SyncColumn>();

                foreach (var setupColumn in setupTable.Columns)
                {
                    // Check if the columns list contains the column name we specified in the setup
                    var column = columns.FirstOrDefault(c => c.ColumnName.Equals(setupColumn, SyncGlobalization.DataSourceStringComparison));

                    if (column == null)
                    {
                        throw new MissingColumnException(setupColumn, schemaTable.TableName);
                    }
                    else
                    {
                        ((List <SyncColumn>)lstColumns).Add(column);
                    }
                }
            }
            else
            {
                lstColumns = columns;
            }


            foreach (var column in lstColumns.OrderBy(c => c.Ordinal))
            {
                // First of all validate if the column is currently supported
                if (!this.Metadata.IsValid(column))
                {
                    throw new UnsupportedColumnTypeException(column.ColumnName, column.OriginalTypeName, this.ProviderTypeName);
                }

                var columnNameLower = column.ColumnName.ToLowerInvariant();
                if (columnNameLower == "sync_scope_name" ||
                    columnNameLower == "scope_timestamp" ||
                    columnNameLower == "scope_is_local" ||
                    columnNameLower == "scope_last_sync" ||
                    columnNameLower == "create_scope_id" ||
                    columnNameLower == "update_scope_id" ||
                    columnNameLower == "create_timestamp" ||
                    columnNameLower == "update_timestamp" ||
                    columnNameLower == "timestamp" ||
                    columnNameLower == "sync_row_is_tombstone" ||
                    columnNameLower == "last_change_datetime" ||
                    columnNameLower == "sync_scope_name" ||
                    columnNameLower == "sync_scope_name"
                    )
                {
                    throw new UnsupportedColumnTypeException(column.ColumnName, column.OriginalTypeName, this.ProviderTypeName);
                }

                // Validate max length
                column.MaxLength = this.Metadata.ValidateMaxLength(column.OriginalTypeName, column.IsUnsigned, column.IsUnicode, column.MaxLength);

                // Gets the datastore owner dbType (could be SqlDbtype, MySqlDbType, SqliteDbType, NpgsqlDbType & so on ...)
                var datastoreDbType = this.Metadata.ValidateOwnerDbType(column.OriginalTypeName, column.IsUnsigned, column.IsUnicode, column.MaxLength);

                // once we have the datastore type, we can have the managed type
                var columnType = this.Metadata.ValidateType(datastoreDbType);

                // and the DbType
                column.DbType = (int)this.Metadata.ValidateDbType(column.OriginalTypeName, column.IsUnsigned, column.IsUnicode, column.MaxLength);

                // Gets the owner dbtype (SqlDbType, OracleDbType, MySqlDbType, NpsqlDbType & so on ...)
                // Sqlite does not have it's own type, so it's DbType too
                column.OriginalDbType = datastoreDbType.ToString();

                // Validate if column should be readonly
                column.IsReadOnly = this.Metadata.ValidateIsReadonly(column);

                // set position ordinal
                column.Ordinal = ordinal;
                ordinal++;

                // Validate the precision and scale properties
                if (this.Metadata.IsNumericType(column.OriginalTypeName))
                {
                    if (this.Metadata.SupportScale(column.OriginalTypeName))
                    {
                        var(p, s)                 = this.Metadata.ValidatePrecisionAndScale(column);
                        column.Precision          = p;
                        column.PrecisionSpecified = true;
                        column.Scale              = s;
                        column.ScaleSpecified     = true;
                    }
                    else
                    {
                        column.Precision          = this.Metadata.ValidatePrecision(column);
                        column.PrecisionSpecified = true;
                        column.ScaleSpecified     = false;
                    }
                }

                // if setup table has no columns, we add all columns from db
                // otherwise check if columns exist in the data source
                if (setupTable.Columns == null || setupTable.Columns.Count <= 0 || setupTable.Columns.Contains(column.ColumnName))
                {
                    schemaTable.Columns.Add(column);
                }
                // If column does not allow null value and is not compute
                // We will not be able to insert a row, so raise an error
                else if (!column.AllowDBNull && !column.IsCompute && !column.IsReadOnly && string.IsNullOrEmpty(column.DefaultValue))
                {
                    throw new Exception($"Column {column.ColumnName} is not part of your setup. But it seems this columns is mandatory in your data source.");
                }
            }
        }