public void TestWalCheckpoint()
        {
            var tmpFile = GetTempFile();

            using (var db = SQLite3.Open(tmpFile))
            {
                db.Execute("PRAGMA journal_mode=WAL;");

                // CREATE TABLE results in 2 frames check pointed and increaseses the log size by 2
                // so manually do a checkpoint to reset the counters thus testing both
                // sqlite3_wal_checkpoint and sqlite3_wal_checkpoint_v2.
                db.Execute("CREATE TABLE foo (x int);");
                db.WalCheckPoint("main");

                db.Execute("INSERT INTO foo (x) VALUES (1);");
                db.Execute("INSERT INTO foo (x) VALUES (2);");

                db.WalCheckPoint("main", WalCheckPointMode.Full, out int logSize, out int framesCheckPointed);

                Assert.Equal(2, logSize);
                Assert.Equal(2, framesCheckPointed);
            }

            // Set autocheckpoint to 1 so that regardless of the number of
            // commits, explicit checkpoints only checkpoint the last update.
            var builder = SQLiteDatabaseConnectionBuilder.Create(
                tmpFile,
                autoCheckPointCount: 1);

            using (var db = builder.Build())
            {
                db.Execute("INSERT INTO foo (x) VALUES (3);");
                db.Execute("INSERT INTO foo (x) VALUES (4);");
                db.Execute("INSERT INTO foo (x) VALUES (5);");

                int logSize;
                int framesCheckPointed;
                db.WalCheckPoint("main", WalCheckPointMode.Passive, out logSize, out framesCheckPointed);

                Assert.Equal(1, logSize);
                Assert.Equal(1, framesCheckPointed);
            }

            builder = builder.With(autoCheckPointCount: 0);
            using (var db = builder.Build())
            {
                db.Execute("INSERT INTO foo (x) VALUES (3);");
                db.Execute("INSERT INTO foo (x) VALUES (4);");
                db.Execute("INSERT INTO foo (x) VALUES (5);");

                int logSize;
                int framesCheckPointed;
                db.WalCheckPoint("main", WalCheckPointMode.Passive, out logSize, out framesCheckPointed);

                Assert.True(logSize > 1);
                Assert.True(framesCheckPointed > 1);
            }

            raw.sqlite3__vfs__delete(null, tmpFile, 1);
        }
예제 #2
0
        public static void ClassInit(TestContext testContext)
        {
            SQLitePCL.Batteries.Init();
            SQLiteDatabaseConnectionBuilder dbbuilder = SQLiteDatabaseConnectionBuilder.InMemory;

            db = PrettyFn.Init(dbbuilder);
            db.Execute("CREATE TABLE test (vals text, type text);");
            db.Execute("INSERT INTO test VALUES ('" + int.MaxValue + "', 'int');");
            db.Execute("INSERT INTO test VALUES ('" + uint.MaxValue + "', 'uint');");
            db.Execute("INSERT INTO test VALUES ('" + long.MaxValue + "', 'long');");
            db.Execute("INSERT INTO test VALUES ('" + ulong.MaxValue + "', 'ulong');");
            db.Execute("INSERT INTO test VALUES ('" + byte.MaxValue + "', 'byte');");
            db.Execute("INSERT INTO test VALUES ('" + sbyte.MaxValue + "', 'sbyte');");
            db.Execute("INSERT INTO test VALUES ('" + short.MaxValue + "', 'short');");
            db.Execute("INSERT INTO test VALUES ('" + ushort.MaxValue + "', 'ushort');");
            db.Execute("INSERT INTO test VALUES ('" + float.MaxValue + "', 'float');");
            db.Execute("INSERT INTO test VALUES ('1.7976931348623157E+308', 'double');");
            db.Execute("INSERT INTO test VALUES ('" + decimal.MaxValue + "', 'decimal');");
            db.Execute("INSERT INTO test VALUES ('" + char.MaxValue + "', 'char');");
            db.Execute("INSERT INTO test VALUES ('P1Y2MT2H', 'isotimespan');");
            db.Execute("INSERT INTO test VALUES ('02:14:18', 'dotnettimespan');");
            db.Execute("INSERT INTO test VALUES (UUID(), 'guid');");
            db.Execute("INSERT INTO test VALUES ('0', 'nonpositiveint');");
            db.Execute("INSERT INTO test VALUES ('0', 'nonnegativeint');");
            db.Execute("INSERT INTO test VALUES ('1', 'positiveint');");
            db.Execute("INSERT INTO test VALUES ('-1', 'negativeint');");
            db.Execute("INSERT INTO test VALUES ('true', 'bool');");
            db.Execute("INSERT INTO test VALUES ('https', 'uri');");
            db.Execute("INSERT INTO test VALUES ('a', 'rownum');");
            db.Execute("INSERT INTO test VALUES ('b', 'rownum');");
            db.Execute("INSERT INTO test VALUES ('c', 'rownum');");
        }
 public static SQLiteDatabaseConnection Init(SQLiteDatabaseConnectionBuilder dbbuilder)
 {
     return(dbbuilder
            .WithScalarFunc("REGEXP", RegexIsMatch_Func)
            .WithScalarFunc("ISDATETIME", DateIsValid_Func)
            .WithScalarFunc("ISBOOL", IsBool_Func)
            .WithScalarFunc("ISBYTE", IsByte_Func)
            .WithScalarFunc("ISSBYTE", IsSbyte_Func)
            .WithScalarFunc("ISSHORT", IsShort_Func)
            .WithScalarFunc("ISUSHORT", IsUshort_Func)
            .WithScalarFunc("ISINT", IsInt_Func)
            .WithScalarFunc("ISUINT", IsUint_Func)
            .WithScalarFunc("ISLONG", IsLong_Func)
            .WithScalarFunc("ISULONG", IsUlong_Func)
            .WithScalarFunc("ISFLOAT", IsFloat_Func)
            .WithScalarFunc("ISDOUBLE", IsDouble_Func)
            .WithScalarFunc("ISDECIMAL", IsDecimal_Func)
            .WithScalarFunc("ISNONPOSINT", IsNonPositiveInt_Func)
            .WithScalarFunc("ISNONNEGINT", IsNonNegativeInt_Func)
            .WithScalarFunc("ISPOSINT", IsPositiveInt_Func)
            .WithScalarFunc("ISNEGINT", IsNegativeInt_Func)
            .WithScalarFunc("ISCHAR", IsChar_Func)
            .WithScalarFunc("ISGUID", IsGuid_Func)
            .WithScalarFunc("ISISOTIMESPAN", IsISO8610Timespan_Func)
            .WithScalarFunc("ISDOTNETTIMESPAN", IsDotNetTimespan_Func)
            .WithScalarFunc("ISURI", IsUri_Func)
            .WithScalarFunc("DATECHK", DateCompare_Func)
            .WithScalarFunc("COMPARE", CompareVals_Func)
            .WithScalarFunc("UUID", GetUuid_Func)
            .WithScalarFunc("ROW_NUMBER", GetRowNumber_Func)
            .Build());
 }
예제 #4
0
        /// <summary>
        /// Builds an IAsyncDatabaseConnection using the specified scheduler.
        /// </summary>
        /// <returns>An IAsyncDatabaseConnection using the specified scheduler.</returns>
        /// <param name="This">A SQLiteDatabaseConnectionBuilder instance.</param>
        /// <param name="scheduler">An RX scheduler</param>
        public static IAsyncDatabaseConnection BuildAsyncDatabaseConnection(
            this SQLiteDatabaseConnectionBuilder This,
            IScheduler scheduler)
        {
            Contract.Requires(This != null);
            Contract.Requires(scheduler != null);

            var progressHandlerResult = new WriteLockedRef <bool>(false);
            var db = This.With(progressHandler: () => progressHandlerResult.Value).Build();

            return(new AsyncDatabaseConnectionImpl(db, scheduler, progressHandlerResult));
        }
        public void TestWithCommitHook()
        {
            var commits = 0;
            var tmpFile = GetTempFile();
            var builder =
                SQLiteDatabaseConnectionBuilder.Create(tmpFile,
                                                       commitHook: () =>
            {
                commits++;
                return(false);
            });

            using (var db = builder.Build())
            {
                db.Execute("CREATE TABLE foo (x int);");
                db.Execute("INSERT INTO foo (x) VALUES (1);");

                Assert.Equal(2, commits);
            }

            builder = builder.Without(commitHook: true);
            using (var db = builder.Build())
            {
                db.Execute("INSERT INTO foo (x) VALUES (1);");
                db.Execute("INSERT INTO foo (x) VALUES (1);");
                Assert.Equal(2, commits);
            }

            builder = builder.With(commitHook: () => true);
            using (var db = builder.Build())
            {
                try
                {
                    db.Execute("INSERT INTO foo (x) VALUES (1);");
                    Assert.True(false, "Expected exception to be thrown");
                }
                catch (SQLiteException e)
                {
                    Assert.Equal(ErrorCode.ConstraintCommitHook, e.ExtendedErrorCode);
                }

                var count =
                    db.Query("SELECT COUNT(*) from foo")
                    .Select(row => row.First().ToInt())
                    .First();
                Assert.Equal(3, count);
            }

            raw.sqlite3__vfs__delete(null, tmpFile, 1);
        }
예제 #6
0
 /// <summary>
 /// Builds an IAsyncDatabaseConnection using the default TaskPool scheduler.
 /// </summary>
 /// <returns>An IAsyncDatabaseConnection using the default TaskPool scheduler.</returns>
 /// <param name="This">A SQLiteDatabaseConnectionBuilder instance.</param>
 public static IAsyncDatabaseConnection BuildAsyncDatabaseConnection(this SQLiteDatabaseConnectionBuilder This) =>
 This.BuildAsyncDatabaseConnection(TaskPoolScheduler.Default);
예제 #7
0
 /// <summary>
 /// Opens a SQLite database.
 /// </summary>
 /// <param name="filename">The database filename.</param>
 /// <param name="flags"><see cref="ConnectionFlags"/> used to defined if the database is readonly,
 /// read/write and whether a new database file should be created if it does not already exist.</param>
 /// <param name="vfs">
 /// The name of the sqlite3_vfs object that defines the operating system interface
 /// that the new database connection should use. If <see langword="null"/>, then
 /// the default sqlite3_vfs object is used.</param>
 /// <returns>A <see cref="SQLiteDatabaseConnection"/> instance.</returns>
 /// <seealso href="https://sqlite.org/c3ref/open.html"/>
 public static SQLiteDatabaseConnection Open(string filename, ConnectionFlags flags, string vfs) =>
 SQLiteDatabaseConnectionBuilder.Create(
     filename,
     connectionFlags: flags,
     vfs: vfs).Build();
예제 #8
0
 /// <summary>
 /// Opens a SQLite database.
 /// </summary>
 /// <param name="filename">The database filename.</param>
 /// <returns>A <see cref="SQLiteDatabaseConnection"/> instance.</returns>
 /// <seealso href="https://sqlite.org/c3ref/open.html"/>
 public static SQLiteDatabaseConnection Open(string filename) =>
 SQLiteDatabaseConnectionBuilder.Create(filename).Build();
        public void TestAuthorizer()
        {
            var tmpFile = GetTempFile();
            var builder = SQLiteDatabaseConnectionBuilder.Create(tmpFile,
                                                                 authorizer: (actionCode, p0, p1, dbName, triggerOrView) =>
            {
                switch (actionCode)
                {
                // When creating a table an insert is first done.
                case ActionCode.Insert:
                    Assert.Equal("sqlite_master", p0);
                    Assert.Null(p1);
                    Assert.Equal("main", dbName);
                    Assert.Null(triggerOrView);
                    break;

                case ActionCode.CreateTable:
                    Assert.Equal("foo", p0);
                    Assert.Null(p1);
                    Assert.Equal("main", dbName);
                    Assert.Null(triggerOrView);
                    break;

                case ActionCode.Read:
                    Assert.NotNull(p0);
                    Assert.NotNull(p1);
                    Assert.Equal("main", dbName);
                    Assert.Null(triggerOrView);
                    break;
                }

                return(AuthorizerReturnCode.Ok);
            });

            using (var db = builder.Build())
            {
                db.ExecuteAll(
                    @"CREATE TABLE foo (x int);
                      SELECT * FROM foo;
                      CREATE VIEW TEST_VIEW AS SELECT * FROM foo;");
            }


            // View authorizer
            builder = builder.With(authorizer: (actionCode, p0, p1, dbName, triggerOrView) =>
            {
                switch (actionCode)
                {
                case ActionCode.Read:
                    Assert.NotNull(p0);
                    Assert.NotNull(p1);
                    Assert.Equal("main", dbName);

                    // A Hack. Goal is to prove that inner_most_trigger_or_view is not null when it is returned in the callback
                    if (p0 == "foo")
                    {
                        Assert.NotNull(triggerOrView);
                    }
                    break;
                }

                return(AuthorizerReturnCode.Ok);
            });

            using (var db = builder.Build())
            {
                db.Execute("SELECT * FROM TEST_VIEW;");
            }


            // Denied authorizer
            builder = builder.With(authorizer: (actionCode, p0, p1, dbName, triggerOrView) => AuthorizerReturnCode.Deny);
            using (var db = builder.Build())
            {
                try
                {
                    db.Execute("SELECT * FROM TEST_VIEW;");
                    Assert.True(false);
                }
                catch (SQLiteException e)
                {
                    Assert.Equal(ErrorCode.NotAuthorized, e.ErrorCode);
                }
            }

            builder = builder.Without(authorizer: true);
            using (var db = builder.Build())
            {
                db.Execute("SELECT * FROM TEST_VIEW;");
            }

            raw.sqlite3__vfs__delete(null, tmpFile, 1);
        }