Beispiel #1
0
        public TntItem GetItemById(int id)
        {
            const string query =
                @"SELECT 
                    date, hash, topic, post, title, description, size, category, username
                FROM Items i
                JOIN Authors a ON a.id = i.author_id
                WHERE i.id = ?";

            using var stmt = _db.prepare(query);
            stmt.bind_int(1, id);
            stmt.step_row();

            var rawDate     = stmt.column_text(0);
            var date        = DateTime.Parse(rawDate);
            var hash        = stmt.column_text(1);
            var topic       = stmt.column_int(2);
            var post        = stmt.column_int(3);
            var title       = stmt.column_text(4);
            var description = stmt.column_text(5);
            var size        = stmt.column_int64(6);
            var category    = stmt.column_int(7);
            var author      = stmt.column_text(8);

            var item = new TntItem(date, hash, topic, post, author, title, description, size, category);

            return(item);
        }
        public Int32 GetVersion()
        {
            const string commandText = "PRAGMA user_version;";
            sqlite3_stmt statement;

            //NOTE.JHB Even though this is a read, iOS doesn't return the correct value on the read connection
            //but someone should try again when the version goes beyond 3.7.13
            statement = _writeConnection.prepare(commandText);

            var result = -1;

            try
            {
                var commandResult = raw.sqlite3_step(statement);
                if (commandResult != raw.SQLITE_ERROR)
                {
                    Debug.Assert(commandResult == raw.SQLITE_ROW);
                    result = raw.sqlite3_column_int(statement, 0);
                }
            }
            catch (Exception e)
            {
                Log.E(Tag, "Error getting user version", e);
            }
            finally
            {
                statement.Dispose();
            }

            return(result);
        }
Beispiel #3
0
        // allows only one statement in the sql string
        public static sqlite3_stmt prepare(this sqlite3 db, string sql, params object[] a)
        {
            sqlite3_stmt s = db.prepare(sql);

            s.bind(a);
            return(s);
        }
Beispiel #4
0
        public void test_stmt_busy()
        {
            using (sqlite3 db = ugly.open(":memory:"))
            {
                db.exec("CREATE TABLE foo (x int);");
                db.exec("INSERT INTO foo (x) VALUES (1);");
                db.exec("INSERT INTO foo (x) VALUES (2);");
                db.exec("INSERT INTO foo (x) VALUES (3);");
                const string sql = "SELECT x FROM foo";
                using (sqlite3_stmt stmt = db.prepare(sql))
                {
                    Assert.AreEqual(sql, stmt.sql());

                    Assert.AreEqual(stmt.stmt_busy(), 0);
                    stmt.step();
                    Assert.IsTrue(stmt.stmt_busy() != 0);
                    stmt.step();
                    Assert.IsTrue(stmt.stmt_busy() != 0);
                    stmt.step();
                    Assert.IsTrue(stmt.stmt_busy() != 0);
                    stmt.step();
                    Assert.IsTrue(stmt.stmt_busy() == 0);
                }
            }
        }
Beispiel #5
0
        public void test_bind_parameter_index()
        {
            using (sqlite3 db = ugly.open(":memory:"))
            {
                db.exec("CREATE TABLE foo (x int, v int, t text, d real, b blob, q blob);");
                using (sqlite3_stmt stmt = db.prepare("INSERT INTO foo (x,v,t,d,b,q) VALUES (:x,:v,:t,:d,:b,:q)"))
                {
                    Assert.IsTrue(stmt.stmt_readonly() == 0);

                    Assert.AreEqual(stmt.bind_parameter_count(), 6);

                    Assert.AreEqual(stmt.bind_parameter_index(":m"), 0);

                    Assert.AreEqual(stmt.bind_parameter_index(":x"), 1);
                    Assert.AreEqual(stmt.bind_parameter_index(":v"), 2);
                    Assert.AreEqual(stmt.bind_parameter_index(":t"), 3);
                    Assert.AreEqual(stmt.bind_parameter_index(":d"), 4);
                    Assert.AreEqual(stmt.bind_parameter_index(":b"), 5);
                    Assert.AreEqual(stmt.bind_parameter_index(":q"), 6);

                    Assert.AreEqual(stmt.bind_parameter_name(1), ":x");
                    Assert.AreEqual(stmt.bind_parameter_name(2), ":v");
                    Assert.AreEqual(stmt.bind_parameter_name(3), ":t");
                    Assert.AreEqual(stmt.bind_parameter_name(4), ":d");
                    Assert.AreEqual(stmt.bind_parameter_name(5), ":b");
                    Assert.AreEqual(stmt.bind_parameter_name(6), ":q");
                }
            }
        }
Beispiel #6
0
        public void test_column_origin()
        {
            using (sqlite3 db = ugly.open(":memory:"))
            {
                db.exec("CREATE TABLE foo (x int, v int, t text, d real, b blob, q blob);");
                byte[] blob = db.query_scalar <byte[]>("SELECT randomblob(5);");
                db.exec("INSERT INTO foo (x,v,t,d,b,q) VALUES (?,?,?,?,?,?)", 32, 44, "hello", 3.14, blob, null);
#if not
                // maybe we should just let this fail so we can
                // see the differences between running against the built-in
                // sqlite vs a recent version?
                if (1 == raw.sqlite3_compileoption_used("ENABLE_COLUMN_METADATA"))
#endif
                {
                    using (sqlite3_stmt stmt = db.prepare("SELECT x AS mario FROM foo;"))
                    {
                        stmt.step();

                        Assert.IsTrue(stmt.stmt_readonly() != 0);

                        Assert.AreEqual(stmt.column_database_name(0), "main");
                        Assert.AreEqual(stmt.column_table_name(0), "foo");
                        Assert.AreEqual(stmt.column_origin_name(0), "x");
                        Assert.AreEqual(stmt.column_name(0), "mario");
                        Assert.AreEqual(stmt.column_decltype(0), "int");
                    }
                }
            }
        }
Beispiel #7
0
 // allows only one statement in the sql string
 public static void exec(this sqlite3 db, string sql, params object[] a)
 {
     using (sqlite3_stmt stmt = db.prepare(sql, a))
     {
         stmt.step();
     }
 }
        public void test_progress_handler()
        {
            using (sqlite3 db = ugly.open(":memory:"))
            {
                int count = 0;

                delegate_progress_handler handler = obj =>
                {
                    Assert.AreEqual(obj, "user_data");
                    count++;
                    return(0);
                };

                raw.sqlite3_progress_handler(db, 1, handler, "user_data");

                GC.Collect();

                using (sqlite3_stmt stmt = db.prepare("SELECT 1;"))
                {
                    stmt.step();
                }
                Assert.IsTrue(count > 0);

                handler = obj => 1;
                raw.sqlite3_progress_handler(db, 1, handler, null);
                using (sqlite3_stmt stmt = db.prepare("SELECT 1;"))
                {
                    try
                    {
                        stmt.step();
                        Assert.Fail("Expected sqlite3_exception");
                    }
                    catch (ugly.sqlite3_exception e)
                    {
                        Assert.AreEqual(e.errcode, raw.SQLITE_INTERRUPT);
                    }
                }

                // Test that assigning null to the handler removes the progress handler.
                handler = null;
                raw.sqlite3_progress_handler(db, 1, handler, null);
                using (sqlite3_stmt stmt = db.prepare("SELECT 1;"))
                {
                    stmt.step();
                }
            }
        }
Beispiel #9
0
 public static T query_scalar <T>(this sqlite3 db, string sql, params object[] a)
 {
     using (sqlite3_stmt stmt = db.prepare(sql, a))
     {
         stmt.step();
         return(stmt.column <T>(0));
     }
 }
Beispiel #10
0
 public static IEnumerable <T> query <T> (this sqlite3 db, string sql, params object[] a) where T : class, new()
 {
     using (sqlite3_stmt stmt = db.prepare(sql, a))
     {
         while (raw.SQLITE_ROW == stmt.step())
         {
             yield return(stmt.row <T>());
         }
     }
 }
Beispiel #11
0
 public void test_next_stmt()
 {
     using (sqlite3 db = ugly.open(":memory:"))
     {
         Assert.AreEqual(db.next_stmt(null), null);
         using (sqlite3_stmt stmt = db.prepare("SELECT 5;"))
         {
             Assert.AreEqual(db.next_stmt(null), stmt);
             Assert.AreEqual(db.next_stmt(stmt), null);
         }
         Assert.AreEqual(db.next_stmt(null), null);
     }
 }
Beispiel #12
0
        public void test_row()
        {
            using (sqlite3 db = ugly.open(":memory:"))
            {
                db.exec("CREATE TABLE foo (x int, v int, t text, d real, b blob, q blob);");
                byte[] blob = db.query_scalar <byte[]>("SELECT randomblob(5);");
                db.exec("INSERT INTO foo (x,v,t,d,b,q) VALUES (?,?,?,?,?,?)", 32, 44, "hello", 3.14, blob, null);
                foreach (row r in db.query <row>("SELECT x,v,t,d,b,q FROM foo;"))
                {
                    Assert.AreEqual(r.x, 32);
                    Assert.AreEqual(r.v, 44);
                    Assert.AreEqual(r.t, "hello");
                    Assert.AreEqual(r.d, 3.14);
                    Assert.AreEqual(r.b.Length, blob.Length);
                    for (int i = 0; i < blob.Length; i++)
                    {
                        Assert.AreEqual(r.b[i], blob[i]);
                    }
                    Assert.AreEqual(r.q, null);
                }
                using (sqlite3_stmt stmt = db.prepare("SELECT x,v,t,d,b,q FROM foo;"))
                {
                    stmt.step();

                    Assert.AreEqual(stmt.db_handle(), db);

                    Assert.AreEqual(stmt.column_int(0), 32);
                    Assert.AreEqual(stmt.column_int64(1), 44);
                    Assert.AreEqual(stmt.column_text(2), "hello");
                    Assert.AreEqual(stmt.column_double(3), 3.14);
                    Assert.AreEqual(stmt.column_bytes(4), blob.Length);
                    byte[] b2 = stmt.column_blob(4);
                    Assert.AreEqual(b2.Length, blob.Length);
                    for (int i = 0; i < blob.Length; i++)
                    {
                        Assert.AreEqual(b2[i], blob[i]);
                    }

                    Assert.AreEqual(stmt.column_type(5), raw.SQLITE_NULL);

                    Assert.AreEqual(stmt.column_name(0), "x");
                    Assert.AreEqual(stmt.column_name(1), "v");
                    Assert.AreEqual(stmt.column_name(2), "t");
                    Assert.AreEqual(stmt.column_name(3), "d");
                    Assert.AreEqual(stmt.column_name(4), "b");
                    Assert.AreEqual(stmt.column_name(5), "q");
                }
            }
        }
        public Int32 GetVersion()
        {
            var          commandText = "PRAGMA user_version;";
            sqlite3_stmt statement;

            lock (dbLock) { statement = db.prepare(commandText); }

            var result = -1;

            try {
                var commandResult = raw.sqlite3_step(statement);
                if (commandResult != raw.SQLITE_ERROR)
                {
                    Debug.Assert(commandResult == raw.SQLITE_ROW);
                    result = raw.sqlite3_column_int(statement, 0);
                }
            } catch (Exception e) {
                Log.E(Tag, "Error getting user version", e);
            } finally {
                statement.Dispose();
            }

            return(result);
        }
Beispiel #14
0
        public static IEnumerable <T> query_one_column <T> (this sqlite3 db, string sql, params object[] a)
        {
            using (sqlite3_stmt stmt = db.prepare(sql, a))
            {
                if (1 != stmt.column_count())
                {
                    throw new InvalidOperationException("the SELECT expression for query_one_column() must have exactly one column");
                }

                while (raw.SQLITE_ROW == stmt.step())
                {
                    yield return(stmt.column <T>(0));
                }
            }
        }
Beispiel #15
0
 public void test_explicit_prepare()
 {
     using (sqlite3 db = ugly.open(":memory:"))
     {
         db.exec("CREATE TABLE foo (x int);");
         const int num = 7;
         using (sqlite3_stmt stmt = db.prepare("INSERT INTO foo (x) VALUES (?)"))
         {
             for (int i = 0; i < num; i++)
             {
                 stmt.reset();
                 stmt.clear_bindings();
                 stmt.bind(1, i);
                 stmt.step();
             }
         }
         int c = db.query_scalar <int>("SELECT COUNT(*) FROM foo");
         Assert.AreEqual(c, num);
     }
 }
        public void test_stmt_status()
        {
            using (sqlite3 db = ugly.open(":memory:"))
            {
                db.exec("CREATE TABLE foo (x int);");

                using (var stmt = db.prepare("SELECT x FROM foo"))
                {
                    stmt.step();

                    int vmStep = raw.sqlite3_stmt_status(stmt, raw.SQLITE_STMTSTATUS_VM_STEP, 0);
                    Assert.IsTrue(vmStep > 0);

                    int vmStep2 = raw.sqlite3_stmt_status(stmt, raw.SQLITE_STMTSTATUS_VM_STEP, 1);
                    Assert.AreEqual(vmStep, vmStep2);

                    int vmStep3 = raw.sqlite3_stmt_status(stmt, raw.SQLITE_STMTSTATUS_VM_STEP, 0);
                    Assert.AreEqual(0, vmStep3);
                }
            }
        }
Beispiel #17
0
        private static void SeedDb(sqlite3 db, List <CsvItem> csvItems)
        {
            db.exec("DELETE FROM items");
            db.exec("BEGIN TRANSACTION");
            using (var stmt = db.prepare("INSERT INTO items (release_date, hash, topic, post, author, title, description, size, category, magnet) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"))
            {
                for (var i = 0; i < csvItems.Count; i++)
                {
                    if (i % 100 == 0)
                    {
                        Console.Write('.');
                    }

                    if (i % 5000 == 0)
                    {
                        Console.WriteLine();
                    }

                    var item = csvItems[i];
                    stmt.reset();

                    stmt.bind_text(1, item.ReleaseDate);
                    stmt.bind_text(2, item.Hash);
                    stmt.bind_int(3, item.Topic);
                    stmt.bind_int(4, item.Post);
                    stmt.bind_text(5, item.Author);
                    stmt.bind_text(6, item.Title);
                    stmt.bind_text(7, item.Description);
                    stmt.bind_int64(8, item.Size);
                    stmt.bind_int(9, item.Category);
                    stmt.bind_text(10, BuildMagnetUri(item));

                    stmt.step_done();
                }
            }
            db.exec("COMMIT TRANSACTION");
            Console.WriteLine();
        }
Beispiel #18
0
        public void test_blob_write()
        {
            using (sqlite3 db = ugly.open(":memory:"))
            {
                const int len = 100;

                db.exec("CREATE TABLE foo (b blob);");
                using (sqlite3_stmt stmt = db.prepare("INSERT INTO foo (b) VALUES (?)"))
                {
                    stmt.bind_zeroblob(1, len);
                    stmt.step();
                }

                long rowid = db.last_insert_rowid();

                using (sqlite3_blob bh = db.blob_open("main", "foo", "b", rowid, 1))
                {
                    int len2 = bh.bytes();
                    Assert.AreEqual(len, len2);

                    int passes = 10;

                    Assert.AreEqual(len % passes, 0);

                    int    sublen = len / passes;
                    byte[] buf    = new byte[sublen];
                    for (int i = 0; i < sublen; i++)
                    {
                        buf[i] = (byte)(i % 256);
                    }

                    for (int q = 0; q < passes; q++)
                    {
                        bh.write(buf, q * sublen);
                    }
                }
            }
        }
Beispiel #19
0
        public SQLiteGrid()
        {
            sqlite3 conn = ugly.open(":memory:");

            conn.exec("BEGIN TRANSACTION");
            conn.exec("CREATE TABLE foo (a int, b int, c int);");
            for (int i = 0; i < 100; i++)
            {
                conn.exec("INSERT INTO foo (a,b,c) VALUES (?,?,?)", i, i * 5 - 3, i * i / 10);
            }
            conn.exec("COMMIT TRANSACTION");

            var stmt = conn.prepare("SELECT * FROM foo");

            var colinfo = new Dimension_Columns_SQLite(stmt);
            var rowinfo = new Dimension_Rows_SQLite();

            var mytextfmt = new MyTextFormat {
                TextFont  = this.Font.ToCrossFont(),
                TextColor = CrossGraphics.Colors.Black,
                HorizontalTextAlignment = CrossGraphics.TextAlignment.Center,
                VerticalTextAlignment   = CrossGraphics.TextAlignment.Center,
            };

            var fmt = new ValuePerCell_Steady <MyTextFormat> (
                mytextfmt
                );

            PropertyChanged += (object sender, System.ComponentModel.PropertyChangedEventArgs e) => {
                if (e.PropertyName == A1Grid.FontProperty.PropertyName)
                {
                    mytextfmt.TextFont = Font.ToCrossFont();
                    fmt.notify_changed(-1, -1);
                }
            };
            var padding1   = new ValuePerCell_Steady <Padding?> (new Padding(1));
            var padding4   = new ValuePerCell_Steady <Padding?> (new Padding(4));
            var fill_white = new ValuePerCell_Steady <CrossGraphics.Color> (CrossGraphics.Colors.White);

            var rowlist               = new RowList_SQLite_StringArray(stmt);
            var rowlist_cached        = new RowList_Cache <string[]> (rowlist);
            var vpc                   = new ValuePerCell_RowList_Indexed <string, string[]> (rowlist_cached);
            IDrawCell <IGraphics> dec = new DrawCell_Text(vpc, fmt);

            dec = new DrawCell_Chain_Padding(padding4, dec);
            dec = new DrawCell_Fill(fill_white, dec);
            dec = new DrawCell_Chain_Padding(padding1, dec);
            dec = new DrawCell_Chain_Cache(dec, colinfo, rowinfo);

            var sel = new Selection();

            var dec_selection = new DrawCell_FillRectIfSelected(sel, new CrossGraphics.Color(0, 255, 0, 120));

            var dh_layers = new DrawVisible_Layers(new IDrawVisible <IGraphics>[] {
                new DrawVisible_Adapter_DrawCell <IGraphics>(dec),
                new DrawVisible_Adapter_DrawCell <IGraphics>(dec_selection)
            });

            Main = new MainPanel(
                colinfo,
                rowinfo,
                dh_layers
                );
        }