sqlite3 2.1.0.rc1-x86-linux-gnu → 2.1.0.rc2-x86-linux-gnu
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/CONTRIBUTING.md +7 -12
- data/ext/sqlite3/database.c +9 -7
- data/ext/sqlite3/database.h +4 -0
- data/ext/sqlite3/statement.c +23 -28
- data/ext/sqlite3/statement.h +1 -0
- data/lib/sqlite3/3.1/sqlite3_native.so +0 -0
- data/lib/sqlite3/3.2/sqlite3_native.so +0 -0
- data/lib/sqlite3/3.3/sqlite3_native.so +0 -0
- data/lib/sqlite3/version.rb +1 -1
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: a2670fde457905e2a7dcfb9ddf490e8f33f4479edbfee68cba080afc4a885a31
         | 
| 4 | 
            +
              data.tar.gz: daff6e3cfb7905742fb8228e7dcf2a221936e88bc6cb0b9163065a863ce3b142
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 1de9bfd6aac5cc73c68edff3c18f1410cb357cedef1a54b46166ad284ce2c6dc860625eb8adb51c0a3e70d4349a0b581fc223879edca859a743e33f26bbfa044
         | 
| 7 | 
            +
              data.tar.gz: '0639b4a53ef6bb6ddcf9b6b25eacea597fcf693d54937552d49f67e41965316db465fa67a7af91c310d662c8f317d45e9f3067b8ed17baf8ce5f4e6d3bdcef87'
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    
    
        data/CONTRIBUTING.md
    CHANGED
    
    | @@ -16,20 +16,15 @@ please look there for additional information. | |
| 16 16 |  | 
| 17 17 | 
             
            All statements keep pointers back to their respective database connections.
         | 
| 18 18 | 
             
            The `@connection` instance variable on the `Statement` handle keeps the database
         | 
| 19 | 
            -
            connection alive. | 
| 20 | 
            -
            two cases:
         | 
| 19 | 
            +
            connection alive.
         | 
| 21 20 |  | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
            for the statement handler.  The reason is because there exists a race
         | 
| 27 | 
            -
            condition.  We cannot guarantee the order in which objects will be garbage
         | 
| 28 | 
            -
            collected.  So, it is possible that a connection and a statement are up for
         | 
| 29 | 
            -
            garbage collection.  If the database connection were to be free'd before the
         | 
| 30 | 
            -
            statement, then boom.  Instead we'll be conservative and free unclosed
         | 
| 31 | 
            -
            statements when the connection is terminated.
         | 
| 21 | 
            +
            We use `sqlite3_close_v2` in `Database#close` since v2.1.0 which defers _actually_ closing the
         | 
| 22 | 
            +
            connection and freeing the underlying memory until all open statments are closed; though the
         | 
| 23 | 
            +
            `Database` object will immediately behave as though it's been fully closed. If a Database is not
         | 
| 24 | 
            +
            explicitly closed, it will be closed when it is GCed.
         | 
| 32 25 |  | 
| 26 | 
            +
            `Statement#close` finalizes the underlying statement. If a Statement is not explicitly closed, it
         | 
| 27 | 
            +
            will be closed/finalized when it is GCed.
         | 
| 33 28 |  | 
| 34 29 |  | 
| 35 30 | 
             
            ## Building gems
         | 
    
        data/ext/sqlite3/database.c
    CHANGED
    
    | @@ -49,15 +49,16 @@ discard_db(sqlite3RubyPtr ctx) | |
| 49 49 | 
             
                }
         | 
| 50 50 |  | 
| 51 51 | 
             
                ctx->db = NULL;
         | 
| 52 | 
            +
                ctx->flags |= SQLITE3_RB_DATABASE_DISCARDED;
         | 
| 52 53 | 
             
            }
         | 
| 53 54 |  | 
| 54 55 | 
             
            static void
         | 
| 55 56 | 
             
            close_or_discard_db(sqlite3RubyPtr ctx)
         | 
| 56 57 | 
             
            {
         | 
| 57 58 | 
             
                if (ctx->db) {
         | 
| 58 | 
            -
                    int  | 
| 59 | 
            +
                    int is_readonly = (ctx->flags & SQLITE3_RB_DATABASE_READONLY);
         | 
| 59 60 |  | 
| 60 | 
            -
                    if ( | 
| 61 | 
            +
                    if (is_readonly || ctx->owner == getpid()) {
         | 
| 61 62 | 
             
                        // Ordinary close.
         | 
| 62 63 | 
             
                        sqlite3_close_v2(ctx->db);
         | 
| 63 64 | 
             
                        ctx->db = NULL;
         | 
| @@ -153,7 +154,9 @@ rb_sqlite3_open_v2(VALUE self, VALUE file, VALUE mode, VALUE zvfs) | |
| 153 154 | 
             
                         );
         | 
| 154 155 |  | 
| 155 156 | 
             
                CHECK(ctx->db, status);
         | 
| 156 | 
            -
                 | 
| 157 | 
            +
                if (flags & SQLITE_OPEN_READONLY) {
         | 
| 158 | 
            +
                    ctx->flags |= SQLITE3_RB_DATABASE_READONLY;
         | 
| 159 | 
            +
                }
         | 
| 157 160 |  | 
| 158 161 | 
             
                return self;
         | 
| 159 162 | 
             
            }
         | 
| @@ -943,11 +946,10 @@ rb_sqlite3_open16(VALUE self, VALUE file) | |
| 943 946 | 
             
            #endif
         | 
| 944 947 | 
             
            #endif
         | 
| 945 948 |  | 
| 946 | 
            -
                 | 
| 947 | 
            -
             | 
| 948 | 
            -
                // these are the perm flags used implicitly by sqlite3_open16,
         | 
| 949 | 
            +
                // sqlite3_open16 implicitly uses flags (SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE)
         | 
| 949 950 | 
             
                // see https://www.sqlite.org/capi3ref.html#sqlite3_open
         | 
| 950 | 
            -
                 | 
| 951 | 
            +
                // so we do not ever set SQLITE3_RB_DATABASE_READONLY in ctx->flags
         | 
| 952 | 
            +
                status = sqlite3_open16(utf16_string_value_ptr(file), &ctx->db);
         | 
| 951 953 |  | 
| 952 954 | 
             
                CHECK(ctx->db, status)
         | 
| 953 955 |  | 
    
        data/ext/sqlite3/database.h
    CHANGED
    
    
    
        data/ext/sqlite3/statement.c
    CHANGED
    
    | @@ -1,22 +1,12 @@ | |
| 1 1 | 
             
            #include <sqlite3_ruby.h>
         | 
| 2 2 |  | 
| 3 3 | 
             
            #define REQUIRE_OPEN_STMT(_ctxt) \
         | 
| 4 | 
            -
              if(!_ctxt->st) \
         | 
| 4 | 
            +
              if (!_ctxt->st) \
         | 
| 5 5 | 
             
                rb_raise(rb_path2class("SQLite3::Exception"), "cannot use a closed statement");
         | 
| 6 6 |  | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
                VALUE closed_p = rb_funcall(
         | 
| 11 | 
            -
                                     rb_iv_get(stmt_rb, "@connection"),
         | 
| 12 | 
            -
                                     rb_intern("closed?"), 0);
         | 
| 13 | 
            -
             | 
| 14 | 
            -
                if (RTEST(closed_p)) {
         | 
| 15 | 
            -
                    rb_raise(rb_path2class("SQLite3::Exception"),
         | 
| 16 | 
            -
                             "cannot use a statement associated with a closed database");
         | 
| 17 | 
            -
                }
         | 
| 18 | 
            -
            }
         | 
| 19 | 
            -
             | 
| 7 | 
            +
            #define REQUIRE_LIVE_DB(_ctxt) \
         | 
| 8 | 
            +
              if (_ctxt->db->flags & SQLITE3_RB_DATABASE_DISCARDED) \
         | 
| 9 | 
            +
                rb_raise(rb_path2class("SQLite3::Exception"), "cannot use a statement associated with a discarded database");
         | 
| 20 10 |  | 
| 21 11 | 
             
            VALUE cSqlite3Statement;
         | 
| 22 12 |  | 
| @@ -71,6 +61,11 @@ prepare(VALUE self, VALUE db, VALUE sql) | |
| 71 61 |  | 
| 72 62 | 
             
                TypedData_Get_Struct(self, sqlite3StmtRuby, &statement_type, ctx);
         | 
| 73 63 |  | 
| 64 | 
            +
                /* Dereferencing a pointer to the database struct will be faster than accessing it through the
         | 
| 65 | 
            +
                 * instance variable @connection. The struct pointer is guaranteed to be live because instance
         | 
| 66 | 
            +
                 * variable will keep it from being GCed. */
         | 
| 67 | 
            +
                ctx->db = db_ctx;
         | 
| 68 | 
            +
             | 
| 74 69 | 
             
            #ifdef HAVE_SQLITE3_PREPARE_V2
         | 
| 75 70 | 
             
                status = sqlite3_prepare_v2(
         | 
| 76 71 | 
             
            #else
         | 
| @@ -135,7 +130,7 @@ step(VALUE self) | |
| 135 130 |  | 
| 136 131 | 
             
                TypedData_Get_Struct(self, sqlite3StmtRuby, &statement_type, ctx);
         | 
| 137 132 |  | 
| 138 | 
            -
                 | 
| 133 | 
            +
                REQUIRE_LIVE_DB(ctx);
         | 
| 139 134 | 
             
                REQUIRE_OPEN_STMT(ctx);
         | 
| 140 135 |  | 
| 141 136 | 
             
                if (ctx->done_p) { return Qnil; }
         | 
| @@ -232,7 +227,7 @@ bind_param(VALUE self, VALUE key, VALUE value) | |
| 232 227 |  | 
| 233 228 | 
             
                TypedData_Get_Struct(self, sqlite3StmtRuby, &statement_type, ctx);
         | 
| 234 229 |  | 
| 235 | 
            -
                 | 
| 230 | 
            +
                REQUIRE_LIVE_DB(ctx);
         | 
| 236 231 | 
             
                REQUIRE_OPEN_STMT(ctx);
         | 
| 237 232 |  | 
| 238 233 | 
             
                switch (TYPE(key)) {
         | 
| @@ -326,7 +321,7 @@ reset_bang(VALUE self) | |
| 326 321 |  | 
| 327 322 | 
             
                TypedData_Get_Struct(self, sqlite3StmtRuby, &statement_type, ctx);
         | 
| 328 323 |  | 
| 329 | 
            -
                 | 
| 324 | 
            +
                REQUIRE_LIVE_DB(ctx);
         | 
| 330 325 | 
             
                REQUIRE_OPEN_STMT(ctx);
         | 
| 331 326 |  | 
| 332 327 | 
             
                sqlite3_reset(ctx->st);
         | 
| @@ -348,7 +343,7 @@ clear_bindings_bang(VALUE self) | |
| 348 343 |  | 
| 349 344 | 
             
                TypedData_Get_Struct(self, sqlite3StmtRuby, &statement_type, ctx);
         | 
| 350 345 |  | 
| 351 | 
            -
                 | 
| 346 | 
            +
                REQUIRE_LIVE_DB(ctx);
         | 
| 352 347 | 
             
                REQUIRE_OPEN_STMT(ctx);
         | 
| 353 348 |  | 
| 354 349 | 
             
                sqlite3_clear_bindings(ctx->st);
         | 
| @@ -382,7 +377,7 @@ column_count(VALUE self) | |
| 382 377 | 
             
                sqlite3StmtRubyPtr ctx;
         | 
| 383 378 | 
             
                TypedData_Get_Struct(self, sqlite3StmtRuby, &statement_type, ctx);
         | 
| 384 379 |  | 
| 385 | 
            -
                 | 
| 380 | 
            +
                REQUIRE_LIVE_DB(ctx);
         | 
| 386 381 | 
             
                REQUIRE_OPEN_STMT(ctx);
         | 
| 387 382 |  | 
| 388 383 | 
             
                return INT2NUM(sqlite3_column_count(ctx->st));
         | 
| @@ -415,7 +410,7 @@ column_name(VALUE self, VALUE index) | |
| 415 410 |  | 
| 416 411 | 
             
                TypedData_Get_Struct(self, sqlite3StmtRuby, &statement_type, ctx);
         | 
| 417 412 |  | 
| 418 | 
            -
                 | 
| 413 | 
            +
                REQUIRE_LIVE_DB(ctx);
         | 
| 419 414 | 
             
                REQUIRE_OPEN_STMT(ctx);
         | 
| 420 415 |  | 
| 421 416 | 
             
                name = sqlite3_column_name(ctx->st, (int)NUM2INT(index));
         | 
| @@ -440,7 +435,7 @@ column_decltype(VALUE self, VALUE index) | |
| 440 435 |  | 
| 441 436 | 
             
                TypedData_Get_Struct(self, sqlite3StmtRuby, &statement_type, ctx);
         | 
| 442 437 |  | 
| 443 | 
            -
                 | 
| 438 | 
            +
                REQUIRE_LIVE_DB(ctx);
         | 
| 444 439 | 
             
                REQUIRE_OPEN_STMT(ctx);
         | 
| 445 440 |  | 
| 446 441 | 
             
                name = sqlite3_column_decltype(ctx->st, (int)NUM2INT(index));
         | 
| @@ -459,7 +454,7 @@ bind_parameter_count(VALUE self) | |
| 459 454 | 
             
                sqlite3StmtRubyPtr ctx;
         | 
| 460 455 | 
             
                TypedData_Get_Struct(self, sqlite3StmtRuby, &statement_type, ctx);
         | 
| 461 456 |  | 
| 462 | 
            -
                 | 
| 457 | 
            +
                REQUIRE_LIVE_DB(ctx);
         | 
| 463 458 | 
             
                REQUIRE_OPEN_STMT(ctx);
         | 
| 464 459 |  | 
| 465 460 | 
             
                return INT2NUM(sqlite3_bind_parameter_count(ctx->st));
         | 
| @@ -568,7 +563,7 @@ stats_as_hash(VALUE self) | |
| 568 563 | 
             
                sqlite3StmtRubyPtr ctx;
         | 
| 569 564 | 
             
                TypedData_Get_Struct(self, sqlite3StmtRuby, &statement_type, ctx);
         | 
| 570 565 |  | 
| 571 | 
            -
                 | 
| 566 | 
            +
                REQUIRE_LIVE_DB(ctx);
         | 
| 572 567 | 
             
                REQUIRE_OPEN_STMT(ctx);
         | 
| 573 568 |  | 
| 574 569 | 
             
                VALUE arg = rb_hash_new();
         | 
| @@ -587,7 +582,7 @@ stat_for(VALUE self, VALUE key) | |
| 587 582 | 
             
                sqlite3StmtRubyPtr ctx;
         | 
| 588 583 | 
             
                TypedData_Get_Struct(self, sqlite3StmtRuby, &statement_type, ctx);
         | 
| 589 584 |  | 
| 590 | 
            -
                 | 
| 585 | 
            +
                REQUIRE_LIVE_DB(ctx);
         | 
| 591 586 | 
             
                REQUIRE_OPEN_STMT(ctx);
         | 
| 592 587 |  | 
| 593 588 | 
             
                if (SYMBOL_P(key)) {
         | 
| @@ -609,7 +604,7 @@ memused(VALUE self) | |
| 609 604 | 
             
                sqlite3StmtRubyPtr ctx;
         | 
| 610 605 | 
             
                TypedData_Get_Struct(self, sqlite3StmtRuby, &statement_type, ctx);
         | 
| 611 606 |  | 
| 612 | 
            -
                 | 
| 607 | 
            +
                REQUIRE_LIVE_DB(ctx);
         | 
| 613 608 | 
             
                REQUIRE_OPEN_STMT(ctx);
         | 
| 614 609 |  | 
| 615 610 | 
             
                return INT2NUM(sqlite3_stmt_status(ctx->st, SQLITE_STMTSTATUS_MEMUSED, 0));
         | 
| @@ -628,7 +623,7 @@ database_name(VALUE self, VALUE index) | |
| 628 623 | 
             
                sqlite3StmtRubyPtr ctx;
         | 
| 629 624 | 
             
                TypedData_Get_Struct(self, sqlite3StmtRuby, &statement_type, ctx);
         | 
| 630 625 |  | 
| 631 | 
            -
                 | 
| 626 | 
            +
                REQUIRE_LIVE_DB(ctx);
         | 
| 632 627 | 
             
                REQUIRE_OPEN_STMT(ctx);
         | 
| 633 628 |  | 
| 634 629 | 
             
                return SQLITE3_UTF8_STR_NEW2(
         | 
| @@ -647,7 +642,7 @@ get_sql(VALUE self) | |
| 647 642 | 
             
                sqlite3StmtRubyPtr ctx;
         | 
| 648 643 | 
             
                TypedData_Get_Struct(self, sqlite3StmtRuby, &statement_type, ctx);
         | 
| 649 644 |  | 
| 650 | 
            -
                 | 
| 645 | 
            +
                REQUIRE_LIVE_DB(ctx);
         | 
| 651 646 | 
             
                REQUIRE_OPEN_STMT(ctx);
         | 
| 652 647 |  | 
| 653 648 | 
             
                return rb_obj_freeze(SQLITE3_UTF8_STR_NEW2(sqlite3_sql(ctx->st)));
         | 
| @@ -667,7 +662,7 @@ get_expanded_sql(VALUE self) | |
| 667 662 |  | 
| 668 663 | 
             
                TypedData_Get_Struct(self, sqlite3StmtRuby, &statement_type, ctx);
         | 
| 669 664 |  | 
| 670 | 
            -
                 | 
| 665 | 
            +
                REQUIRE_LIVE_DB(ctx);
         | 
| 671 666 | 
             
                REQUIRE_OPEN_STMT(ctx);
         | 
| 672 667 |  | 
| 673 668 | 
             
                expanded_sql = sqlite3_expanded_sql(ctx->st);
         | 
    
        data/ext/sqlite3/statement.h
    CHANGED
    
    
| Binary file | 
| Binary file | 
| Binary file | 
    
        data/lib/sqlite3/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: sqlite3
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 2.1.0. | 
| 4 | 
            +
              version: 2.1.0.rc2
         | 
| 5 5 | 
             
            platform: x86-linux-gnu
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Jamis Buck
         | 
| @@ -11,7 +11,7 @@ authors: | |
| 11 11 | 
             
            autorequire: 
         | 
| 12 12 | 
             
            bindir: bin
         | 
| 13 13 | 
             
            cert_chain: []
         | 
| 14 | 
            -
            date: 2024-09- | 
| 14 | 
            +
            date: 2024-09-19 00:00:00.000000000 Z
         | 
| 15 15 | 
             
            dependencies: []
         | 
| 16 16 | 
             
            description: |
         | 
| 17 17 | 
             
              Ruby library to interface with the SQLite3 database engine (http://www.sqlite.org). Precompiled
         |