예제 #1
0
        public static SqliteConnection AddEFCoreExtensions(this SqliteConnection connection)
        {
            // TimeSpan
            connection.CreateFunction("days", (TimeSpan value) => value.TotalDays);
            connection.CreateFunction("timespan", (double value) => TimeSpan.FromDays(value));

            // NetTopologySuite
            using (var command = connection.CreateCommand())
            {
                // Workaround ericsink/SQLitePCL.raw#225
                var file = "mod_spatialite";
                if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
                {
                    file += ".dylib";
                }
                else if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
                {
                    file += ".so";
                }

                command.CommandText = "SELECT load_extension('" + file + "');";

                // Let the CLR load from NuGet package assets. SQLite won't look there
                var temp = spatialite_version();

                connection.EnableExtensions();
                command.ExecuteNonQuery();
                connection.EnableExtensions(false);
            }

            return(connection);
        }
        public static SqliteConnection AddEFCoreExtensions(this SqliteConnection connection)
        {
            connection.CreateFunction("days", (TimeSpan value) => value.TotalDays);
            connection.CreateFunction("timespan", (double value) => TimeSpan.FromDays(value));

            return(connection);
        }
예제 #3
0
        public void CreateFunction_works_when_null()
        {
            using (var connection = new SqliteConnection("Data Source=:memory:"))
            {
                connection.Open();
                connection.CreateFunction("test", () => 1L);
                connection.CreateFunction("test", default(Func <long>));

                var ex = Assert.Throws <SqliteException>(() => connection.ExecuteScalar <long>("SELECT test();"));

                Assert.Equal(Resources.SqliteNativeError(SQLITE_ERROR, "no such function: test"), ex.Message);
            }
        }
예제 #4
0
        public void Functions_dont_bleed_across_connections()
        {
            sqlite3 db;

            using (var connection1 = new SqliteConnection(ConnectionString))
            {
                if (new Version(connection1.ServerVersion) < new Version(3, 31, 0))
                {
                    // Skip. SQLite returns deleted functions
                    return;
                }

                connection1.CreateFunction("function1", () => 1L, isDeterministic: true);
                connection1.CreateAggregate("aggregate1", 0L, x => x, isDeterministic: true);
                connection1.Open();
                db = connection1.Handle !;
            }

            using var connection2 = new SqliteConnection(ConnectionString);
            connection2.Open();

            Assert.Same(db, connection2.Handle);
            var functions = connection2.ExecuteScalar <string>("SELECT group_concat(name) FROM pragma_function_list;")
                            .Split(",");

            Assert.DoesNotContain("function1", functions);
            Assert.DoesNotContain("aggregate1", functions);
        }
        public void CreateFunction_throws_when_closed()
        {
            var connection = new SqliteConnection();

            var ex = Assert.Throws <InvalidOperationException>(() => connection.CreateFunction("test", () => 1L));

            Assert.Equal(Resources.CallRequiresOpenConnection("CreateFunction"), ex.Message);
        }
예제 #6
0
        public void CreateFunction_throws_when_no_name()
        {
            using (var connection = new SqliteConnection("Data Source=:memory:"))
            {
                connection.Open();
                var ex = Assert.Throws <ArgumentNullException>(() => connection.CreateFunction(null, () => 1L));

                Assert.Equal("name", ex.ParamName);
            }
        }
예제 #7
0
        public void CreateFunction_deterministic_param_works()
        {
            using (var connection = new SqliteConnection("Data Source=:memory:"))
            {
                connection.Open();

                connection.ExecuteNonQuery("CREATE TABLE Data (Value); INSERT INTO Data VALUES (0);");
                connection.CreateFunction("test", (double x) => x, true);

                Assert.Equal(1, connection.ExecuteNonQuery("CREATE INDEX InvalidIndex ON Data (Value) WHERE test(Value) = 0;"));
            }
        }
예제 #8
0
        public void CreateFunction_works_when_parameter_empty_blob()
        {
            using (var connection = new SqliteConnection("Data Source=:memory:"))
            {
                connection.Open();
                connection.CreateFunction("test", (byte[] x) => x?.Length == 0);

                var result = connection.ExecuteScalar <long>("SELECT test(X'');");

                Assert.Equal(1L, result);
            }
        }
예제 #9
0
        public void CreateFunction_works_when_parameter_null_and_type_byteArray()
        {
            using (var connection = new SqliteConnection("Data Source=:memory:"))
            {
                connection.Open();
                connection.CreateFunction("test", (byte[] x) => x == null);

                var result = connection.ExecuteScalar <long>("SELECT test(NULL);");

                Assert.Equal(1L, result);
            }
        }
예제 #10
0
        public void CreateFunction_works_when_result_DBNull()
        {
            using (var connection = new SqliteConnection("Data Source=:memory:"))
            {
                connection.Open();
                connection.CreateFunction <object>("test", () => DBNull.Value);

                var result = connection.ExecuteScalar <object>("SELECT test();");

                Assert.Equal(DBNull.Value, result);
            }
        }
예제 #11
0
        public void CreateFunction_works_when_sqlite_exception()
        {
            using (var connection = new SqliteConnection("Data Source=:memory:"))
            {
                connection.Open();
                connection.CreateFunction <long>("test", () => throw new SqliteException("Test", 200));

                var ex = Assert.Throws <SqliteException>(() => connection.ExecuteScalar <long>("SELECT test();"));

                Assert.Equal(Resources.SqliteNativeError(200, "Test"), ex.Message);
            }
        }
예제 #12
0
        public void CreateFunction_works()
        {
            using (var connection = new SqliteConnection("Data Source=:memory:"))
            {
                connection.Open();
                connection.CreateFunction("test", 1L, (long state, long x, int y) => $"{state} {x} {y}");

                var result = connection.ExecuteScalar <string>("SELECT test(2, 3);");

                Assert.Equal("1 2 3", result);
            }
        }
예제 #13
0
        public void CreateFunction_works_when_parameter_null_but_type_long()
        {
            using (var connection = new SqliteConnection("Data Source=:memory:"))
            {
                connection.Open();
                connection.CreateFunction("test", (long x) => x);

                var ex = Assert.Throws <SqliteException>(() => connection.ExecuteScalar <long>("SELECT test(NULL);"));

                Assert.Equal(
                    Resources.SqliteNativeError(SQLITE_ERROR, Resources.UDFCalledWithNull("test", 0)),
                    ex.Message);
            }
        }
예제 #14
0
        public void CreateFunction_works_when_params()
        {
            using (var connection = new SqliteConnection("Data Source=:memory:"))
            {
                connection.Open();
                connection.CreateFunction(
                    "test",
                    args => string.Join(", ", args.Select(a => a?.GetType().FullName ?? "(null)")));

                var result = connection.ExecuteScalar <string>("SELECT test(1, 3.1, 'A', X'7E57', NULL);");

                Assert.Equal("System.Int64, System.Double, System.String, System.Byte[], (null)", result);
            }
        }
예제 #15
0
        public void CreateFunction_works_when_parameter_null_but_type_double()
        {
            using (var connection = new SqliteConnection("Data Source=:memory:"))
            {
                connection.Open();
                connection.CreateFunction("test", (double x) => x);

                var ex = Assert.Throws <SqliteException>(() => connection.ExecuteScalar <double>("SELECT test(NULL);"));

                Assert.Equal(
                    Resources.SqliteNativeError(raw.SQLITE_ERROR, new InvalidCastException().Message),
                    ex.Message);
                Assert.Equal(raw.SQLITE_ERROR, ex.SqliteErrorCode);
            }
        }
예제 #16
0
        public void CreateFunction_is_non_deterministic()
        {
            using (var connection = new SqliteConnection("Data Source=:memory:"))
            {
                connection.Open();

                connection.ExecuteNonQuery("CREATE TABLE Data (Value); INSERT INTO Data VALUES (0);");
                connection.CreateFunction("test", (double x) => x);

                var ex = Assert.Throws <SqliteException>(
                    () => connection.ExecuteNonQuery("CREATE INDEX InvalidIndex ON Data (Value) WHERE test(Value) = 0;"));

                Assert.Equal(
                    Resources.SqliteNativeError(SQLITE_ERROR, "non-deterministic functions prohibited in partial index WHERE clauses"),
                    ex.Message);
            }
        }