public override DatabaseModel Create(DbConnection connection, DatabaseModelFactoryOptions options) { Check.NotNull(connection, nameof(connection)); Check.NotNull(options, nameof(options)); if (options.Schemas.Any()) { _logger.SchemasNotSupportedWarning(); } var databaseModel = new DatabaseModel(); var connectionStartedOpen = connection.State == ConnectionState.Open; if (!connectionStartedOpen) { connection.Open(); SpatialiteLoader.TryLoad(connection); } try { databaseModel.DatabaseName = GetDatabaseName(connection); GetTables(connection, databaseModel, options.Tables); foreach (var table in databaseModel.Tables) { GetForeignKeys(connection, table, databaseModel.Tables); } var nullableKeyColumns = databaseModel.Tables .SelectMany(t => t.PrimaryKey?.Columns ?? Array.Empty <DatabaseColumn>()) .Concat(databaseModel.Tables.SelectMany(t => t.ForeignKeys).SelectMany(fk => fk.PrincipalColumns)) .Where(c => c.IsNullable) .Distinct(); foreach (var column in nullableKeyColumns) { // TODO: Consider warning column.IsNullable = false; } } finally { if (!connectionStartedOpen) { connection.Close(); } } return(databaseModel); }
private void LoadSpatialite() { if (!_loadSpatialite) { return; } var connection = (SqliteConnection)DbConnection; connection.EnableExtensions(); SpatialiteLoader.Load(DbConnection); connection.EnableExtensions(false); }
public override void OpenConnection() { Connection.Open(); ((SqliteConnection)Connection).EnableExtensions(); SpatialiteLoader.TryLoad(Connection); using (var command = Connection.CreateCommand()) { command.CommandText = "PRAGMA foreign_keys=ON;"; command.ExecuteNonQuery(); } }
private SqliteTestStore(string name, bool seed = true, bool sharedCache = true, bool shared = true) : base(name, shared) { _seed = seed; ConnectionString = new SqliteConnectionStringBuilder { DataSource = Name + ".db", Cache = sharedCache ? SqliteCacheMode.Shared : SqliteCacheMode.Private }.ToString(); var connection = new SqliteConnection(ConnectionString); SpatialiteLoader.TryLoad(connection); Connection = connection; }
private void InitializeDbConnection(DbConnection connection) { if (_loadSpatialite) { SpatialiteLoader.Load(connection); } if (connection is SqliteConnection sqliteConnection) { if (_commandTimeout.HasValue) { sqliteConnection.DefaultTimeout = _commandTimeout.Value; } sqliteConnection.CreateFunction <object, object, object>( "ef_mod", (dividend, divisor) => { if (dividend == null || divisor == null) { return(null); } if (dividend is string s) { return(decimal.Parse(s, CultureInfo.InvariantCulture) % Convert.ToDecimal(divisor, CultureInfo.InvariantCulture)); } return(Convert.ToDouble(dividend, CultureInfo.InvariantCulture) % Convert.ToDouble(divisor, CultureInfo.InvariantCulture)); }); sqliteConnection.CreateFunction( name: "ef_compare", (decimal? left, decimal? right) => left.HasValue && right.HasValue ? decimal.Compare(left.Value, right.Value) : default(int?), isDeterministic: true); } else { _logger.UnexpectedConnectionTypeWarning(connection.GetType()); } }
/// <summary> /// This API supports the Entity Framework Core infrastructure and is not intended to be used /// directly from your code. This API may change or be removed in future releases. /// </summary> public virtual DatabaseModel Create(DbConnection connection, IEnumerable <string> tables, IEnumerable <string> schemas) { Check.NotNull(connection, nameof(connection)); Check.NotNull(tables, nameof(tables)); Check.NotNull(schemas, nameof(schemas)); if (schemas.Any()) { _logger.SchemasNotSupportedWarning(); } var databaseModel = new DatabaseModel(); var connectionStartedOpen = connection.State == ConnectionState.Open; if (!connectionStartedOpen) { connection.Open(); SpatialiteLoader.TryLoad((SqliteConnection)connection); } try { databaseModel.DatabaseName = GetDatabaseName(connection); foreach (var table in GetTables(connection, tables)) { table.Database = databaseModel; databaseModel.Tables.Add(table); } foreach (var table in databaseModel.Tables) { foreach (var foreignKey in GetForeignKeys(connection, table, databaseModel.Tables)) { foreignKey.Table = table; table.ForeignKeys.Add(foreignKey); } } var nullableKeyColumns = databaseModel.Tables .Where(t => t.PrimaryKey != null).SelectMany(t => t.PrimaryKey.Columns) .Concat(databaseModel.Tables.SelectMany(t => t.ForeignKeys).SelectMany(fk => fk.PrincipalColumns)) .Where(c => c.IsNullable) .Distinct(); foreach (var column in nullableKeyColumns) { // TODO: Consider warning column.IsNullable = false; } } finally { if (!connectionStartedOpen) { connection.Close(); } } return(databaseModel); }
protected override void OpenConnection(IRelationalConnection connection) { connection.Open(); SpatialiteLoader.TryLoad(connection.DbConnection); }
private void InitializeDbConnection(DbConnection connection) { if (_loadSpatialite) { SpatialiteLoader.Load(connection); } if (connection is SqliteConnection sqliteConnection) { if (_commandTimeout.HasValue) { sqliteConnection.DefaultTimeout = _commandTimeout.Value; } sqliteConnection.CreateFunction <string, string, bool?>( "regexp", (pattern, input) => { if (input == null || pattern == null) { return(null); } return(Regex.IsMatch(input, pattern)); }, isDeterministic: true); sqliteConnection.CreateFunction <object, object, object?>( "ef_mod", (dividend, divisor) => { if (dividend == null || divisor == null) { return(null); } if (dividend is string s) { return(decimal.Parse(s, CultureInfo.InvariantCulture) % Convert.ToDecimal(divisor, CultureInfo.InvariantCulture)); } return(Convert.ToDouble(dividend, CultureInfo.InvariantCulture) % Convert.ToDouble(divisor, CultureInfo.InvariantCulture)); }, isDeterministic: true); sqliteConnection.CreateFunction( name: "ef_add", (decimal? left, decimal? right) => left + right, isDeterministic: true); sqliteConnection.CreateFunction( name: "ef_divide", (decimal? dividend, decimal? divisor) => dividend / divisor, isDeterministic: true); sqliteConnection.CreateFunction( name: "ef_compare", (decimal? left, decimal? right) => left.HasValue && right.HasValue ? decimal.Compare(left.Value, right.Value) : default(int?), isDeterministic: true); sqliteConnection.CreateFunction( name: "ef_multiply", (decimal? left, decimal? right) => left * right, isDeterministic: true); sqliteConnection.CreateFunction( name: "ef_negate", (decimal? m) => - m, isDeterministic: true); } else { _logger.UnexpectedConnectionTypeWarning(connection.GetType()); } }