Example #1
0
        internal static string GetSelect(this Type type, string whereOrLimit = null)
        {
            var result = new StringBuilder();

            result.AppendLine("SELECT");

            var columns = new List <string>();

            var properties = PropertyDiscovery.GetProperties(type);

            foreach (var property in properties)
            {
                var columnName = AttributeDiscovery.GetColumnName(property);
                columns.Add(columnName);
            }

            result.AppendLine(string.Join(",\r\n", columns));
            result.AppendLine("FROM");

            var tableName = AttributeDiscovery.GetTableName(type);

            result.AppendLine(tableName);

            if (!string.IsNullOrEmpty(whereOrLimit))
            {
                result.AppendLine(whereOrLimit);
            }

            return(result.ToString());
        }
Example #2
0
        internal static string GetUpdate(this object instance)
        {
            var result = new StringBuilder();

            var type = instance.GetType();

            var tableName = AttributeDiscovery.GetTableName(type);

            result.AppendLine($"UPDATE {tableName}");
            result.AppendLine("SET");

            var columns = new List <string>();

            var properties = PropertyDiscovery.GetProperties(type);

            var idProperty = PropertyDiscovery.GetProperty("Id", type);

            foreach (var property in properties)
            {
                if (property.Name == idProperty.Name)
                {
                    continue;
                }
                var columnName  = AttributeDiscovery.GetColumnName(property);
                var columnValue = ValueDiscovery.GetValue(instance, property);
                columns.Add($"{columnName} = {columnValue}");
            }

            result.AppendLine(string.Join(",\r\n", columns));

            result.AppendLine("WHERE");
            result.AppendLine($"Id = {ValueDiscovery.GetValue(instance, idProperty)}");

            return(result.ToString());
        }
Example #3
0
        internal static string GetCreateTable(this Type type)
        {
            var result = new StringBuilder();

            var tableName = AttributeDiscovery.GetTableName(type);

            result.AppendLine($"CREATE TABLE IF NOT EXISTS {tableName}");
            result.AppendLine("(");

            var columns = new List <string>();

            var properties = PropertyDiscovery.GetProperties(type);
            var idProperty = PropertyDiscovery.GetProperty("Id", type);

            if (idProperty != null)
            {
                if (idProperty.PropertyType != typeof(int) && idProperty.PropertyType != typeof(long))
                {
                    throw new InvalidSqlLiteIdentityMappingException("Invalid type for 'Id' expected Int32 or Int64.");
                }
                columns.Add($"{idProperty.Name.ToUpper()} INTEGER PRIMARY KEY AUTOINCREMENT");
            }

            foreach (var property in properties)
            {
                if (property.Name == idProperty.Name)
                {
                    continue;
                }
                var columnName     = AttributeDiscovery.GetColumnName(property);
                var columnType     = AttributeDiscovery.GetColumnType(property);
                var columnNullable = AttributeDiscovery.GetColumnNullable(property);
                columns.Add($"{columnName} {columnType.ToString().ToUpper()} {columnNullable}");
            }

            result.AppendLine(string.Join(",\r\n", columns));
            result.AppendLine(");");
            result.AppendLine($"CREATE UNIQUE INDEX IF NOT EXISTS {tableName}_ID_INDEX ON {tableName} (ID);");

            foreach (var property in properties)
            {
                if (property.Name == idProperty.Name)
                {
                    continue;
                }
                var columnName        = AttributeDiscovery.GetColumnName(property);
                var indexName         = AttributeDiscovery.GetIndexName(property);
                var indexUnique       = AttributeDiscovery.GetIndexUnique(property);
                var additionalColumns = AttributeDiscovery.GetIndexAdditionalColumns(property);
                if (!string.IsNullOrEmpty(additionalColumns))
                {
                    columnName = string.Join(",", columnName, additionalColumns);
                }
                result.AppendLine($"CREATE {indexUnique} INDEX IF NOT EXISTS {tableName}_{indexName}_INDEX ON {tableName} ({columnName});");
            }

            return(result.ToString());
        }
Example #4
0
        internal static List <T> TransformTo <T>(this QueryResponse response) where T : new()
        {
            var results = new List <T>();

            var type       = typeof(T);
            var properties = PropertyDiscovery.GetProperties(type);

            foreach (var row in response.Rows)
            {
                var result = new T();

                foreach (var prop in response.Query.Properties)
                {
                    var ordinal  = response.Query.Properties.IndexOf(prop);
                    var property = properties.FirstOrDefault(x => x.Name.ToUpper() == prop.ToUpper());

                    var columnType = AttributeDiscovery.GetColumnType(property);
                    var columnName = AttributeDiscovery.GetColumnName(property);

                    if (columnName.ToUpper() == "ID")
                    {
                        ReadInteger(property, row[ordinal], result);
                        continue;
                    }

                    switch (columnType)
                    {
                    case SqlLiteType.Integer:
                    {
                        ReadInteger(property, row[ordinal], result);
                        break;
                    }

                    case SqlLiteType.Real:
                    {
                        ReadReal(property, row[ordinal], result);
                        break;
                    }

                    case SqlLiteType.Text:
                    {
                        ReadString(property, row[ordinal], result);
                        break;
                    }

                    case SqlLiteType.Blob:
                    {
                        throw new NotSupportedException("Cannot do blobs yet...");
                    }
                    }
                }

                results.Add(result);
            }

            return(results);
        }
Example #5
0
        internal static string GetInsert(this object instance, bool withIdentity = false)
        {
            var result = new StringBuilder();

            var type = instance.GetType();

            var tableName = AttributeDiscovery.GetTableName(type);

            result.AppendLine($"INSERT INTO {tableName}");
            result.AppendLine("(");

            var columns = new List <string>();

            var properties = PropertyDiscovery.GetProperties(type);

            var idProperty = PropertyDiscovery.GetProperty("Id", type);

            foreach (var property in properties)
            {
                if (property.Name == idProperty.Name && !withIdentity)
                {
                    continue;
                }
                var columnName = AttributeDiscovery.GetColumnName(property);
                columns.Add(columnName);
            }

            result.AppendLine(string.Join(",\r\n", columns));
            result.AppendLine(")");
            result.AppendLine("VALUES");
            result.AppendLine("(");

            var values = new List <string>();

            foreach (var property in properties)
            {
                if (property.Name == idProperty.Name && !withIdentity)
                {
                    continue;
                }
                if (property.Name == idProperty.Name)
                {
                    var value = (string)ValueDiscovery.GetValue(instance, property);
                    values.Add(value == "0" ? "NULL" : value.ToString());
                }
                else
                {
                    var value = (string)ValueDiscovery.GetValue(instance, property);
                    values.Add(value.ToString());
                }
            }

            result.AppendLine(string.Join(",\r\n", values));
            result.AppendLine(");");
            result.AppendLine("SELECT last_insert_rowid();");
            return(result.ToString());
        }
Example #6
0
        internal static SQLiteCommand GetInsertPrepared(this object instance, SQLiteConnection connection, bool withIdentity = false)
        {
            var command = new SQLiteCommand(connection);

            var result = new StringBuilder();

            var type = instance.GetType();

            var tableName = AttributeDiscovery.GetTableName(type);

            result.AppendLine($"INSERT INTO {tableName}");
            result.AppendLine("(");

            var columns = new List <string>();

            var properties = PropertyDiscovery.GetProperties(type);

            var idProperty = PropertyDiscovery.GetProperty("Id", type);

            foreach (var property in properties)
            {
                if (property.Name == idProperty.Name && !withIdentity)
                {
                    continue;
                }
                var columnName = AttributeDiscovery.GetColumnName(property);
                columns.Add(columnName);
            }

            result.AppendLine(string.Join(",\r\n", columns));
            result.AppendLine(")");
            result.AppendLine("VALUES");
            result.AppendLine("(");

            var values = new List <string>();

            foreach (var property in properties)
            {
                if (property.Name == idProperty.Name && !withIdentity)
                {
                    continue;
                }
                values.Add("?");
                var instanceValue = property.GetValue(instance);

                var sqlParameter = new SQLiteParameter(instanceValue.GetType().ToDbType(), instanceValue);
                command.Parameters.Add(sqlParameter);
            }

            result.AppendLine(string.Join(",\r\n", values));
            result.AppendLine(");");
            result.AppendLine("SELECT last_insert_rowid();");

            command.CommandText = result.ToString();
            return(command);
        }
Example #7
0
        internal static List <string> GetColumns(this Type type)
        {
            var columns    = new List <string>();
            var properties = PropertyDiscovery.GetProperties(type);

            foreach (var property in properties)
            {
                var columnName = AttributeDiscovery.GetColumnName(property);
                columns.Add(columnName);
            }
            return(columns);
        }
Example #8
0
        internal static string GetCount(this Type type)
        {
            var result = new StringBuilder();

            result.AppendLine("SELECT COUNT(*)");
            result.AppendLine("FROM");

            var tableName = AttributeDiscovery.GetTableName(type);

            result.AppendLine(tableName);

            return(result.ToString());
        }
Example #9
0
        internal static string GetDelete(this object instance)
        {
            var result = new StringBuilder();

            var type       = instance.GetType();
            var idProperty = PropertyDiscovery.GetProperty("Id", type);

            var tableName = AttributeDiscovery.GetTableName(type);

            result.AppendLine($"DELETE FROM {tableName} WHERE Id = {ValueDiscovery.GetValue(instance, idProperty)}");

            return(result.ToString());
        }
Example #10
0
        internal static SQLiteCommand GetUpdatePrepared(this object instance, SQLiteConnection connection)
        {
            var command = new SQLiteCommand(connection);

            var result = new StringBuilder();

            var type = instance.GetType();

            var tableName = AttributeDiscovery.GetTableName(type);

            result.AppendLine($"UPDATE {tableName}");
            result.AppendLine("SET");

            var columns = new List <string>();

            var properties = PropertyDiscovery.GetProperties(type);

            var idProperty = PropertyDiscovery.GetProperty("Id", type);

            foreach (var property in properties)
            {
                if (property.Name == idProperty.Name)
                {
                    continue;
                }
                var columnName = AttributeDiscovery.GetColumnName(property);
                columns.Add($"{columnName} = ?");

                var columnValue  = ValueDiscovery.GetValue(instance, property);
                var sqlParameter = new SQLiteParameter(columnValue.GetType().ToDbType(), columnValue);
                command.Parameters.Add(sqlParameter);
            }

            result.AppendLine(string.Join(",\r\n", columns));

            result.AppendLine("WHERE");

            var idValue = ValueDiscovery.GetValue(instance, idProperty);

            result.AppendLine("Id = ?");

            var idSqlParameter = new SQLiteParameter(idValue.GetType().ToDbType(), idValue);

            command.Parameters.Add(idSqlParameter);

            command.CommandText = result.ToString();

            return(command);
        }
Example #11
0
        internal static async Task <List <T> > QueryAsync <T>(this DbConnection dbConnection, string where = null) where T : new()
        {
            var type       = typeof(T);
            var results    = new List <T>();
            var properties = PropertyDiscovery.GetProperties(type);
            var query      = type.GetSelect(where);

            using (var dbReader = await dbConnection.ExecuteQueryAsync(query))
            {
                var reader = dbReader.Reader;
                while (reader.Read())
                {
                    var result = new T();

                    foreach (var property in properties)
                    {
                        int ordinal;
                        var columnType = AttributeDiscovery.GetColumnType(property);
                        var columnName = AttributeDiscovery.GetColumnName(property);

                        if (columnName.ToUpper() == "ID")
                        {
                            ordinal = reader.GetOrdinal(columnName.ToUpper());
                            ReadInteger(property, reader, ordinal, result);
                            continue;
                        }
                        ordinal = reader.GetOrdinal(columnName);

                        switch (columnType)
                        {
                        case SqlLiteType.Integer:
                        {
                            ReadInteger(property, reader, ordinal, result);
                            break;
                        }

                        case SqlLiteType.Real:
                        {
                            ReadReal(property, reader, ordinal, result);
                            break;
                        }

                        case SqlLiteType.Text:
                        {
                            ReadString(reader, ordinal, property, result);
                            break;
                        }

                        case SqlLiteType.Blob:
                        {
                            throw new NotSupportedException("Cannot do blobs yet...");
                        }
                        }
                    }

                    results.Add(result);
                }
            }

            return(results);
        }
Example #12
0
        internal static string GetDropTable(this Type type)
        {
            var tableName = AttributeDiscovery.GetTableName(type);

            return($"DROP TABLE IF EXISTS {tableName};");
        }