示例#1
0
        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);
        }
示例#2
0
        private void LoadSpatialite()
        {
            if (!_loadSpatialite)
            {
                return;
            }

            var connection = (SqliteConnection)DbConnection;

            connection.EnableExtensions();
            SpatialiteLoader.Load(DbConnection);
            connection.EnableExtensions(false);
        }
示例#3
0
        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();
            }
        }
示例#4
0
        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;
        }
示例#5
0
        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);
        }
示例#7
0
        protected override void OpenConnection(IRelationalConnection connection)
        {
            connection.Open();

            SpatialiteLoader.TryLoad(connection.DbConnection);
        }
示例#8
0
        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());
            }
        }