sqlite3 1.7.3-arm64-darwin → 2.0.0-arm64-darwin
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 +152 -0
- data/CONTRIBUTING.md +23 -1
- data/FAQ.md +0 -43
- data/INSTALLATION.md +13 -5
- data/LICENSE +18 -22
- data/README.md +75 -4
- data/dependencies.yml +10 -11
- data/ext/sqlite3/aggregator.c +142 -145
- data/ext/sqlite3/aggregator.h +2 -4
- data/ext/sqlite3/backup.c +74 -65
- data/ext/sqlite3/backup.h +2 -2
- data/ext/sqlite3/database.c +535 -482
- data/ext/sqlite3/database.h +7 -4
- data/ext/sqlite3/exception.c +111 -92
- data/ext/sqlite3/exception.h +3 -1
- data/ext/sqlite3/extconf.rb +21 -22
- data/ext/sqlite3/sqlite3.c +159 -115
- data/ext/sqlite3/sqlite3_ruby.h +2 -2
- data/ext/sqlite3/statement.c +516 -300
- data/ext/sqlite3/statement.h +3 -3
- data/ext/sqlite3/timespec.h +20 -0
- data/lib/sqlite3/3.0/sqlite3_native.bundle +0 -0
- data/lib/sqlite3/3.1/sqlite3_native.bundle +0 -0
- data/lib/sqlite3/3.2/sqlite3_native.bundle +0 -0
- data/lib/sqlite3/3.3/sqlite3_native.bundle +0 -0
- data/lib/sqlite3/constants.rb +171 -47
- data/lib/sqlite3/database.rb +105 -165
- data/lib/sqlite3/errors.rb +26 -1
- data/lib/sqlite3/pragmas.rb +126 -136
- data/lib/sqlite3/resultset.rb +14 -97
- data/lib/sqlite3/statement.rb +58 -13
- data/lib/sqlite3/value.rb +17 -20
- data/lib/sqlite3/version.rb +1 -21
- data/lib/sqlite3.rb +6 -4
- metadata +3 -28
- data/API_CHANGES.md +0 -49
- data/ChangeLog.cvs +0 -88
- data/Gemfile +0 -10
- data/LICENSE-DEPENDENCIES +0 -20
- data/lib/sqlite3/translator.rb +0 -117
- data/test/helper.rb +0 -27
- data/test/test_backup.rb +0 -33
- data/test/test_collation.rb +0 -82
- data/test/test_database.rb +0 -668
- data/test/test_database_flags.rb +0 -95
- data/test/test_database_readonly.rb +0 -36
- data/test/test_database_readwrite.rb +0 -41
- data/test/test_deprecated.rb +0 -49
- data/test/test_encoding.rb +0 -165
- data/test/test_integration.rb +0 -507
- data/test/test_integration_aggregate.rb +0 -336
- data/test/test_integration_open_close.rb +0 -30
- data/test/test_integration_pending.rb +0 -115
- data/test/test_integration_resultset.rb +0 -142
- data/test/test_integration_statement.rb +0 -194
- data/test/test_pragmas.rb +0 -22
- data/test/test_result_set.rb +0 -47
- data/test/test_sqlite3.rb +0 -30
- data/test/test_statement.rb +0 -290
- data/test/test_statement_execute.rb +0 -39
    
        data/ext/sqlite3/database.h
    CHANGED
    
    | @@ -4,16 +4,19 @@ | |
| 4 4 | 
             
            #include <sqlite3_ruby.h>
         | 
| 5 5 |  | 
| 6 6 | 
             
            struct _sqlite3Ruby {
         | 
| 7 | 
            -
             | 
| 7 | 
            +
                sqlite3 *db;
         | 
| 8 | 
            +
                VALUE busy_handler;
         | 
| 9 | 
            +
                int stmt_timeout;
         | 
| 10 | 
            +
                struct timespec stmt_deadline;
         | 
| 8 11 | 
             
            };
         | 
| 9 12 |  | 
| 10 13 | 
             
            typedef struct _sqlite3Ruby sqlite3Ruby;
         | 
| 11 | 
            -
            typedef sqlite3Ruby * | 
| 14 | 
            +
            typedef sqlite3Ruby *sqlite3RubyPtr;
         | 
| 12 15 |  | 
| 13 16 | 
             
            void init_sqlite3_database();
         | 
| 14 | 
            -
            void set_sqlite3_func_result(sqlite3_context * | 
| 17 | 
            +
            void set_sqlite3_func_result(sqlite3_context *ctx, VALUE result);
         | 
| 15 18 |  | 
| 16 19 | 
             
            sqlite3RubyPtr sqlite3_database_unwrap(VALUE database);
         | 
| 17 | 
            -
            VALUE sqlite3val2rb(sqlite3_value * | 
| 20 | 
            +
            VALUE sqlite3val2rb(sqlite3_value *val);
         | 
| 18 21 |  | 
| 19 22 | 
             
            #endif
         | 
    
        data/ext/sqlite3/exception.c
    CHANGED
    
    | @@ -1,98 +1,117 @@ | |
| 1 1 | 
             
            #include <sqlite3_ruby.h>
         | 
| 2 2 |  | 
| 3 | 
            -
            void | 
| 3 | 
            +
            void
         | 
| 4 | 
            +
            rb_sqlite3_raise(sqlite3 *db, int status)
         | 
| 4 5 | 
             
            {
         | 
| 5 | 
            -
             | 
| 6 | 
            +
                VALUE klass = Qnil;
         | 
| 6 7 |  | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 40 | 
            -
             | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 48 | 
            -
             | 
| 49 | 
            -
             | 
| 50 | 
            -
             | 
| 51 | 
            -
             | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 54 | 
            -
             | 
| 55 | 
            -
             | 
| 56 | 
            -
             | 
| 57 | 
            -
             | 
| 58 | 
            -
             | 
| 59 | 
            -
             | 
| 60 | 
            -
             | 
| 61 | 
            -
             | 
| 62 | 
            -
             | 
| 63 | 
            -
             | 
| 64 | 
            -
             | 
| 65 | 
            -
             | 
| 66 | 
            -
             | 
| 67 | 
            -
             | 
| 68 | 
            -
             | 
| 69 | 
            -
             | 
| 70 | 
            -
             | 
| 71 | 
            -
             | 
| 72 | 
            -
             | 
| 73 | 
            -
             | 
| 74 | 
            -
             | 
| 75 | 
            -
             | 
| 76 | 
            -
             | 
| 77 | 
            -
             | 
| 78 | 
            -
             | 
| 79 | 
            -
             | 
| 80 | 
            -
             | 
| 81 | 
            -
             | 
| 82 | 
            -
             | 
| 83 | 
            -
             | 
| 84 | 
            -
             | 
| 85 | 
            -
             | 
| 86 | 
            -
             | 
| 87 | 
            -
             | 
| 88 | 
            -
             | 
| 89 | 
            -
             | 
| 90 | 
            -
             | 
| 91 | 
            -
             | 
| 92 | 
            -
             | 
| 93 | 
            -
             | 
| 8 | 
            +
                /* Consider only lower 8 bits, to work correctly when
         | 
| 9 | 
            +
                   extended result codes are enabled. */
         | 
| 10 | 
            +
                switch (status & 0xff) {
         | 
| 11 | 
            +
                    case SQLITE_OK:
         | 
| 12 | 
            +
                        return;
         | 
| 13 | 
            +
                        break;
         | 
| 14 | 
            +
                    case SQLITE_ERROR:
         | 
| 15 | 
            +
                        klass = rb_path2class("SQLite3::SQLException");
         | 
| 16 | 
            +
                        break;
         | 
| 17 | 
            +
                    case SQLITE_INTERNAL:
         | 
| 18 | 
            +
                        klass = rb_path2class("SQLite3::InternalException");
         | 
| 19 | 
            +
                        break;
         | 
| 20 | 
            +
                    case SQLITE_PERM:
         | 
| 21 | 
            +
                        klass = rb_path2class("SQLite3::PermissionException");
         | 
| 22 | 
            +
                        break;
         | 
| 23 | 
            +
                    case SQLITE_ABORT:
         | 
| 24 | 
            +
                        klass = rb_path2class("SQLite3::AbortException");
         | 
| 25 | 
            +
                        break;
         | 
| 26 | 
            +
                    case SQLITE_BUSY:
         | 
| 27 | 
            +
                        klass = rb_path2class("SQLite3::BusyException");
         | 
| 28 | 
            +
                        break;
         | 
| 29 | 
            +
                    case SQLITE_LOCKED:
         | 
| 30 | 
            +
                        klass = rb_path2class("SQLite3::LockedException");
         | 
| 31 | 
            +
                        break;
         | 
| 32 | 
            +
                    case SQLITE_NOMEM:
         | 
| 33 | 
            +
                        klass = rb_path2class("SQLite3::MemoryException");
         | 
| 34 | 
            +
                        break;
         | 
| 35 | 
            +
                    case SQLITE_READONLY:
         | 
| 36 | 
            +
                        klass = rb_path2class("SQLite3::ReadOnlyException");
         | 
| 37 | 
            +
                        break;
         | 
| 38 | 
            +
                    case SQLITE_INTERRUPT:
         | 
| 39 | 
            +
                        klass = rb_path2class("SQLite3::InterruptException");
         | 
| 40 | 
            +
                        break;
         | 
| 41 | 
            +
                    case SQLITE_IOERR:
         | 
| 42 | 
            +
                        klass = rb_path2class("SQLite3::IOException");
         | 
| 43 | 
            +
                        break;
         | 
| 44 | 
            +
                    case SQLITE_CORRUPT:
         | 
| 45 | 
            +
                        klass = rb_path2class("SQLite3::CorruptException");
         | 
| 46 | 
            +
                        break;
         | 
| 47 | 
            +
                    case SQLITE_NOTFOUND:
         | 
| 48 | 
            +
                        klass = rb_path2class("SQLite3::NotFoundException");
         | 
| 49 | 
            +
                        break;
         | 
| 50 | 
            +
                    case SQLITE_FULL:
         | 
| 51 | 
            +
                        klass = rb_path2class("SQLite3::FullException");
         | 
| 52 | 
            +
                        break;
         | 
| 53 | 
            +
                    case SQLITE_CANTOPEN:
         | 
| 54 | 
            +
                        klass = rb_path2class("SQLite3::CantOpenException");
         | 
| 55 | 
            +
                        break;
         | 
| 56 | 
            +
                    case SQLITE_PROTOCOL:
         | 
| 57 | 
            +
                        klass = rb_path2class("SQLite3::ProtocolException");
         | 
| 58 | 
            +
                        break;
         | 
| 59 | 
            +
                    case SQLITE_EMPTY:
         | 
| 60 | 
            +
                        klass = rb_path2class("SQLite3::EmptyException");
         | 
| 61 | 
            +
                        break;
         | 
| 62 | 
            +
                    case SQLITE_SCHEMA:
         | 
| 63 | 
            +
                        klass = rb_path2class("SQLite3::SchemaChangedException");
         | 
| 64 | 
            +
                        break;
         | 
| 65 | 
            +
                    case SQLITE_TOOBIG:
         | 
| 66 | 
            +
                        klass = rb_path2class("SQLite3::TooBigException");
         | 
| 67 | 
            +
                        break;
         | 
| 68 | 
            +
                    case SQLITE_CONSTRAINT:
         | 
| 69 | 
            +
                        klass = rb_path2class("SQLite3::ConstraintException");
         | 
| 70 | 
            +
                        break;
         | 
| 71 | 
            +
                    case SQLITE_MISMATCH:
         | 
| 72 | 
            +
                        klass = rb_path2class("SQLite3::MismatchException");
         | 
| 73 | 
            +
                        break;
         | 
| 74 | 
            +
                    case SQLITE_MISUSE:
         | 
| 75 | 
            +
                        klass = rb_path2class("SQLite3::MisuseException");
         | 
| 76 | 
            +
                        break;
         | 
| 77 | 
            +
                    case SQLITE_NOLFS:
         | 
| 78 | 
            +
                        klass = rb_path2class("SQLite3::UnsupportedException");
         | 
| 79 | 
            +
                        break;
         | 
| 80 | 
            +
                    case SQLITE_AUTH:
         | 
| 81 | 
            +
                        klass = rb_path2class("SQLite3::AuthorizationException");
         | 
| 82 | 
            +
                        break;
         | 
| 83 | 
            +
                    case SQLITE_FORMAT:
         | 
| 84 | 
            +
                        klass = rb_path2class("SQLite3::FormatException");
         | 
| 85 | 
            +
                        break;
         | 
| 86 | 
            +
                    case SQLITE_RANGE:
         | 
| 87 | 
            +
                        klass = rb_path2class("SQLite3::RangeException");
         | 
| 88 | 
            +
                        break;
         | 
| 89 | 
            +
                    case SQLITE_NOTADB:
         | 
| 90 | 
            +
                        klass = rb_path2class("SQLite3::NotADatabaseException");
         | 
| 91 | 
            +
                        break;
         | 
| 92 | 
            +
                    default:
         | 
| 93 | 
            +
                        klass = rb_path2class("SQLite3::Exception");
         | 
| 94 | 
            +
                }
         | 
| 94 95 |  | 
| 95 | 
            -
             | 
| 96 | 
            -
             | 
| 97 | 
            -
             | 
| 96 | 
            +
                klass = rb_exc_new2(klass, sqlite3_errmsg(db));
         | 
| 97 | 
            +
                rb_iv_set(klass, "@code", INT2FIX(status));
         | 
| 98 | 
            +
                rb_exc_raise(klass);
         | 
| 99 | 
            +
            }
         | 
| 100 | 
            +
             | 
| 101 | 
            +
            /*
         | 
| 102 | 
            +
             *  accepts a sqlite3 error message as the final argument, which will be `sqlite3_free`d
         | 
| 103 | 
            +
             */
         | 
| 104 | 
            +
            void
         | 
| 105 | 
            +
            rb_sqlite3_raise_msg(sqlite3 *db, int status, const char *msg)
         | 
| 106 | 
            +
            {
         | 
| 107 | 
            +
                VALUE exception;
         | 
| 108 | 
            +
             | 
| 109 | 
            +
                if (status == SQLITE_OK) {
         | 
| 110 | 
            +
                    return;
         | 
| 111 | 
            +
                }
         | 
| 112 | 
            +
             | 
| 113 | 
            +
                exception = rb_exc_new2(rb_path2class("SQLite3::Exception"), msg);
         | 
| 114 | 
            +
                sqlite3_free((void *)msg);
         | 
| 115 | 
            +
                rb_iv_set(exception, "@code", INT2FIX(status));
         | 
| 116 | 
            +
                rb_exc_raise(exception);
         | 
| 98 117 | 
             
            }
         | 
    
        data/ext/sqlite3/exception.h
    CHANGED
    
    | @@ -2,7 +2,9 @@ | |
| 2 2 | 
             
            #define SQLITE3_EXCEPTION_RUBY
         | 
| 3 3 |  | 
| 4 4 | 
             
            #define CHECK(_db, _status) rb_sqlite3_raise(_db, _status);
         | 
| 5 | 
            +
            #define CHECK_MSG(_db, _status, _msg) rb_sqlite3_raise_msg(_db, _status, _msg);
         | 
| 5 6 |  | 
| 6 | 
            -
            void rb_sqlite3_raise(sqlite3 * | 
| 7 | 
            +
            void rb_sqlite3_raise(sqlite3 *db, int status);
         | 
| 8 | 
            +
            void rb_sqlite3_raise_msg(sqlite3 *db, int status, const char *msg);
         | 
| 7 9 |  | 
| 8 10 | 
             
            #endif
         | 
    
        data/ext/sqlite3/extconf.rb
    CHANGED
    
    | @@ -19,7 +19,7 @@ module Sqlite3 | |
| 19 19 |  | 
| 20 20 | 
             
                    configure_extension
         | 
| 21 21 |  | 
| 22 | 
            -
                    create_makefile( | 
| 22 | 
            +
                    create_makefile("sqlite3/sqlite3_native")
         | 
| 23 23 | 
             
                  end
         | 
| 24 24 |  | 
| 25 25 | 
             
                  def configure_cross_compiler
         | 
| @@ -52,7 +52,7 @@ module Sqlite3 | |
| 52 52 | 
             
                      recipe.configure_options += [
         | 
| 53 53 | 
             
                        "--enable-shared=no",
         | 
| 54 54 | 
             
                        "--enable-static=yes",
         | 
| 55 | 
            -
                        "--enable-fts5" | 
| 55 | 
            +
                        "--enable-fts5"
         | 
| 56 56 | 
             
                      ]
         | 
| 57 57 | 
             
                      ENV.to_h.tap do |env|
         | 
| 58 58 | 
             
                        user_cflags = with_config("sqlite-cflags")
         | 
| @@ -60,11 +60,11 @@ module Sqlite3 | |
| 60 60 | 
             
                          "-fPIC", # needed for linking the static library into a shared library
         | 
| 61 61 | 
             
                          "-O2", # see https://github.com/sparklemotion/sqlite3-ruby/issues/335 for some benchmarks
         | 
| 62 62 | 
             
                          "-fvisibility=hidden", # see https://github.com/rake-compiler/rake-compiler-dock/issues/87
         | 
| 63 | 
            -
                          "-DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1" | 
| 63 | 
            +
                          "-DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1"
         | 
| 64 64 | 
             
                        ]
         | 
| 65 65 | 
             
                        env["CFLAGS"] = [user_cflags, env["CFLAGS"], more_cflags].flatten.join(" ")
         | 
| 66 | 
            -
                        recipe.configure_options += env.select { |k,v| ENV_ALLOWLIST.include?(k) }
         | 
| 67 | 
            -
             | 
| 66 | 
            +
                        recipe.configure_options += env.select { |k, v| ENV_ALLOWLIST.include?(k) }
         | 
| 67 | 
            +
                          .map { |key, value| "#{key}=#{value.strip}" }
         | 
| 68 68 | 
             
                      end
         | 
| 69 69 |  | 
| 70 70 | 
             
                      unless File.exist?(File.join(recipe.target, recipe.host, recipe.name, recipe.version))
         | 
| @@ -97,10 +97,6 @@ module Sqlite3 | |
| 97 97 | 
             
                  end
         | 
| 98 98 |  | 
| 99 99 | 
             
                  def configure_extension
         | 
| 100 | 
            -
                    if Gem::Requirement.new("< 2.7").satisfied_by?(Gem::Version.new(RUBY_VERSION))
         | 
| 101 | 
            -
                      append_cppflags("-DTAINTING_SUPPORT")
         | 
| 102 | 
            -
                    end
         | 
| 103 | 
            -
             | 
| 104 100 | 
             
                    append_cflags("-fvisibility=hidden") # see https://github.com/rake-compiler/rake-compiler-dock/issues/87
         | 
| 105 101 |  | 
| 106 102 | 
             
                    if find_header("sqlite3.h")
         | 
| @@ -113,26 +109,30 @@ module Sqlite3 | |
| 113 109 |  | 
| 114 110 | 
             
                    abort_could_not_find(libname) unless find_library(libname, "sqlite3_libversion_number", "sqlite3.h")
         | 
| 115 111 |  | 
| 112 | 
            +
                    # Truffle Ruby doesn't support this yet:
         | 
| 113 | 
            +
                    # https://github.com/oracle/truffleruby/issues/3408
         | 
| 114 | 
            +
                    have_func("rb_enc_interned_str_cstr")
         | 
| 115 | 
            +
             | 
| 116 116 | 
             
                    # Functions defined in 1.9 but not 1.8
         | 
| 117 | 
            -
                    have_func( | 
| 117 | 
            +
                    have_func("rb_proc_arity")
         | 
| 118 118 |  | 
| 119 119 | 
             
                    # Functions defined in 2.1 but not 2.0
         | 
| 120 | 
            -
                    have_func( | 
| 120 | 
            +
                    have_func("rb_integer_pack")
         | 
| 121 121 |  | 
| 122 122 | 
             
                    # These functions may not be defined
         | 
| 123 | 
            -
                    have_func( | 
| 124 | 
            -
                    have_func( | 
| 125 | 
            -
                    have_func( | 
| 126 | 
            -
                    have_func( | 
| 127 | 
            -
                    have_func( | 
| 123 | 
            +
                    have_func("sqlite3_initialize")
         | 
| 124 | 
            +
                    have_func("sqlite3_backup_init")
         | 
| 125 | 
            +
                    have_func("sqlite3_column_database_name")
         | 
| 126 | 
            +
                    have_func("sqlite3_enable_load_extension")
         | 
| 127 | 
            +
                    have_func("sqlite3_load_extension")
         | 
| 128 128 |  | 
| 129 | 
            -
                    unless have_func( | 
| 129 | 
            +
                    unless have_func("sqlite3_open_v2") # https://www.sqlite.org/releaselog/3_5_0.html
         | 
| 130 130 | 
             
                      abort("\nPlease use a version of SQLite3 >= 3.5.0\n\n")
         | 
| 131 131 | 
             
                    end
         | 
| 132 132 |  | 
| 133 | 
            -
                    have_func( | 
| 134 | 
            -
                    have_type( | 
| 135 | 
            -
                    have_type( | 
| 133 | 
            +
                    have_func("sqlite3_prepare_v2")
         | 
| 134 | 
            +
                    have_type("sqlite3_int64", "sqlite3.h")
         | 
| 135 | 
            +
                    have_type("sqlite3_uint64", "sqlite3.h")
         | 
| 136 136 | 
             
                  end
         | 
| 137 137 |  | 
| 138 138 | 
             
                  def minimal_recipe
         | 
| @@ -158,8 +158,7 @@ module Sqlite3 | |
| 158 158 | 
             
                  end
         | 
| 159 159 |  | 
| 160 160 | 
             
                  def mini_portile_config
         | 
| 161 | 
            -
                     | 
| 162 | 
            -
                    YAML.load_file(File.join(package_root_dir, "dependencies.yml"))
         | 
| 161 | 
            +
                    YAML.load_file(File.join(package_root_dir, "dependencies.yml"), symbolize_names: true)
         | 
| 163 162 | 
             
                  end
         | 
| 164 163 |  | 
| 165 164 | 
             
                  def abort_could_not_find(missing)
         | 
    
        data/ext/sqlite3/sqlite3.c
    CHANGED
    
    | @@ -3,162 +3,206 @@ | |
| 3 3 | 
             
            VALUE mSqlite3;
         | 
| 4 4 | 
             
            VALUE cSqlite3Blob;
         | 
| 5 5 |  | 
| 6 | 
            -
            int | 
| 6 | 
            +
            int
         | 
| 7 | 
            +
            bignum_to_int64(VALUE value, sqlite3_int64 *result)
         | 
| 7 8 | 
             
            {
         | 
| 8 9 | 
             
            #ifdef HAVE_RB_INTEGER_PACK
         | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 10 | 
            +
                const int nails = 0;
         | 
| 11 | 
            +
                int t = rb_integer_pack(value, result, 1, sizeof(*result), nails,
         | 
| 12 | 
            +
                                        INTEGER_PACK_NATIVE_BYTE_ORDER |
         | 
| 13 | 
            +
                                        INTEGER_PACK_2COMP);
         | 
| 14 | 
            +
                switch (t) {
         | 
| 15 | 
            +
                    case -2:
         | 
| 16 | 
            +
                    case +2:
         | 
| 17 | 
            +
                        return 0;
         | 
| 18 | 
            +
                    case +1:
         | 
| 19 | 
            +
                        if (!nails) {
         | 
| 20 | 
            +
                            if (*result < 0) { return 0; }
         | 
| 21 | 
            +
                        }
         | 
| 22 | 
            +
                        break;
         | 
| 23 | 
            +
                    case -1:
         | 
| 24 | 
            +
                        if (!nails) {
         | 
| 25 | 
            +
                            if (*result >= 0) { return 0; }
         | 
| 26 | 
            +
                        } else {
         | 
| 27 | 
            +
                            *result += INT64_MIN;
         | 
| 28 | 
            +
                        }
         | 
| 29 | 
            +
                        break;
         | 
| 19 30 | 
             
                }
         | 
| 20 | 
            -
                 | 
| 21 | 
            -
              case -1:
         | 
| 22 | 
            -
                if (!nails) {
         | 
| 23 | 
            -
                  if (*result >= 0) return 0;
         | 
| 24 | 
            -
                }
         | 
| 25 | 
            -
                else {
         | 
| 26 | 
            -
                  *result += INT64_MIN;
         | 
| 27 | 
            -
                }
         | 
| 28 | 
            -
                break;
         | 
| 29 | 
            -
              }
         | 
| 30 | 
            -
              return 1;
         | 
| 31 | 
            +
                return 1;
         | 
| 31 32 | 
             
            #else
         | 
| 32 33 | 
             
            # ifndef RBIGNUM_LEN
         | 
| 33 34 | 
             
            #   define RBIGNUM_LEN(x) RBIGNUM(x)->len
         | 
| 34 35 | 
             
            # endif
         | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 40 | 
            -
             | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 48 | 
            -
             | 
| 49 | 
            -
             | 
| 50 | 
            -
             | 
| 51 | 
            -
             | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 54 | 
            -
             | 
| 55 | 
            -
             | 
| 36 | 
            +
                const long len = RBIGNUM_LEN(value);
         | 
| 37 | 
            +
                if (len == 0) {
         | 
| 38 | 
            +
                    *result = 0;
         | 
| 39 | 
            +
                    return 1;
         | 
| 40 | 
            +
                }
         | 
| 41 | 
            +
                if (len > 63 / (SIZEOF_BDIGITS * CHAR_BIT) + 1) { return 0; }
         | 
| 42 | 
            +
                if (len == 63 / (SIZEOF_BDIGITS * CHAR_BIT) + 1) {
         | 
| 43 | 
            +
                    const BDIGIT *digits = RBIGNUM_DIGITS(value);
         | 
| 44 | 
            +
                    BDIGIT blast = digits[len - 1];
         | 
| 45 | 
            +
                    BDIGIT bmax = (BDIGIT)1UL << (63 % (CHAR_BIT * SIZEOF_BDIGITS));
         | 
| 46 | 
            +
                    if (blast > bmax) { return 0; }
         | 
| 47 | 
            +
                    if (blast == bmax) {
         | 
| 48 | 
            +
                        if (RBIGNUM_POSITIVE_P(value)) {
         | 
| 49 | 
            +
                            return 0;
         | 
| 50 | 
            +
                        } else {
         | 
| 51 | 
            +
                            long i = len - 1;
         | 
| 52 | 
            +
                            while (i) {
         | 
| 53 | 
            +
                                if (digits[--i]) { return 0; }
         | 
| 54 | 
            +
                            }
         | 
| 55 | 
            +
                        }
         | 
| 56 | 
            +
                    }
         | 
| 56 57 | 
             
                }
         | 
| 57 | 
            -
             | 
| 58 | 
            -
             | 
| 59 | 
            -
              return 1;
         | 
| 58 | 
            +
                *result = (sqlite3_int64)NUM2LL(value);
         | 
| 59 | 
            +
                return 1;
         | 
| 60 60 | 
             
            #endif
         | 
| 61 61 | 
             
            }
         | 
| 62 62 |  | 
| 63 | 
            -
            static VALUE | 
| 63 | 
            +
            static VALUE
         | 
| 64 | 
            +
            libversion(VALUE UNUSED(klass))
         | 
| 64 65 | 
             
            {
         | 
| 65 | 
            -
             | 
| 66 | 
            +
                return INT2NUM(sqlite3_libversion_number());
         | 
| 66 67 | 
             
            }
         | 
| 67 68 |  | 
| 68 | 
            -
            static VALUE | 
| 69 | 
            +
            static VALUE
         | 
| 70 | 
            +
            using_sqlcipher(VALUE UNUSED(klass))
         | 
| 69 71 | 
             
            {
         | 
| 70 72 | 
             
            #ifdef USING_SQLCIPHER
         | 
| 71 | 
            -
             | 
| 73 | 
            +
                return Qtrue;
         | 
| 72 74 | 
             
            #else
         | 
| 73 | 
            -
             | 
| 75 | 
            +
                return Qfalse;
         | 
| 74 76 | 
             
            #endif
         | 
| 75 77 | 
             
            }
         | 
| 76 78 |  | 
| 77 79 | 
             
            /* Returns the compile time setting of the SQLITE_THREADSAFE flag.
         | 
| 78 80 | 
             
             * See: https://www.sqlite.org/c3ref/threadsafe.html
         | 
| 79 81 | 
             
             */
         | 
| 80 | 
            -
            static VALUE | 
| 82 | 
            +
            static VALUE
         | 
| 83 | 
            +
            threadsafe_p(VALUE UNUSED(klass))
         | 
| 84 | 
            +
            {
         | 
| 85 | 
            +
                return INT2NUM(sqlite3_threadsafe());
         | 
| 86 | 
            +
            }
         | 
| 87 | 
            +
             | 
| 88 | 
            +
            /*
         | 
| 89 | 
            +
             * call-seq:
         | 
| 90 | 
            +
             *   status(parameter) → Hash
         | 
| 91 | 
            +
             *   status(parameter, reset_flag = false) → Hash
         | 
| 92 | 
            +
             *
         | 
| 93 | 
            +
             * Queries the SQLite3 library for run-time status information. Passing a truthy +reset_flag+ will
         | 
| 94 | 
            +
             * reset the highwater mark to the current value.
         | 
| 95 | 
            +
             *
         | 
| 96 | 
            +
             * [Parameters]
         | 
| 97 | 
            +
             * - +parameter+ (Integer, SQLite3::Constants::Status): The status parameter to query.
         | 
| 98 | 
            +
             * - +reset_flag+ (Boolean): Whether to reset the highwater mark. (default is +false+)
         | 
| 99 | 
            +
             *
         | 
| 100 | 
            +
             * [Returns]
         | 
| 101 | 
            +
             * A Hash containing +:current+ and +:highwater+ keys for integer values.
         | 
| 102 | 
            +
             */
         | 
| 103 | 
            +
            static VALUE
         | 
| 104 | 
            +
            rb_sqlite3_status(int argc, VALUE *argv, VALUE klass)
         | 
| 81 105 | 
             
            {
         | 
| 82 | 
            -
             | 
| 106 | 
            +
                VALUE opArg, resetFlagArg;
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                rb_scan_args(argc, argv, "11", &opArg, &resetFlagArg);
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                int op = NUM2INT(opArg);
         | 
| 111 | 
            +
                bool resetFlag = RTEST(resetFlagArg);
         | 
| 112 | 
            +
             | 
| 113 | 
            +
                int pCurrent = 0;
         | 
| 114 | 
            +
                int pHighwater = 0;
         | 
| 115 | 
            +
                sqlite3_status(op, &pCurrent, &pHighwater, resetFlag);
         | 
| 116 | 
            +
             | 
| 117 | 
            +
                VALUE hash = rb_hash_new();
         | 
| 118 | 
            +
                rb_hash_aset(hash, ID2SYM(rb_intern("current")), INT2FIX(pCurrent));
         | 
| 119 | 
            +
                rb_hash_aset(hash, ID2SYM(rb_intern("highwater")), INT2FIX(pHighwater));
         | 
| 120 | 
            +
             | 
| 121 | 
            +
                return hash;
         | 
| 83 122 | 
             
            }
         | 
| 84 123 |  | 
| 85 | 
            -
            void | 
| 124 | 
            +
            void
         | 
| 125 | 
            +
            init_sqlite3_constants(void)
         | 
| 86 126 | 
             
            {
         | 
| 87 | 
            -
             | 
| 88 | 
            -
             | 
| 89 | 
            -
             | 
| 90 | 
            -
             | 
| 91 | 
            -
             | 
| 92 | 
            -
             | 
| 93 | 
            -
             | 
| 94 | 
            -
             | 
| 95 | 
            -
             | 
| 96 | 
            -
             | 
| 97 | 
            -
             | 
| 98 | 
            -
             | 
| 99 | 
            -
             | 
| 100 | 
            -
             | 
| 101 | 
            -
             | 
| 102 | 
            -
             | 
| 103 | 
            -
             | 
| 104 | 
            -
             | 
| 105 | 
            -
             | 
| 106 | 
            -
             | 
| 107 | 
            -
             | 
| 108 | 
            -
             | 
| 109 | 
            -
             | 
| 110 | 
            -
             | 
| 111 | 
            -
             | 
| 112 | 
            -
             | 
| 127 | 
            +
                VALUE mSqlite3Constants;
         | 
| 128 | 
            +
                VALUE mSqlite3Open;
         | 
| 129 | 
            +
             | 
| 130 | 
            +
                mSqlite3Constants = rb_define_module_under(mSqlite3, "Constants");
         | 
| 131 | 
            +
             | 
| 132 | 
            +
                /* sqlite3_open_v2 flags for Database::new */
         | 
| 133 | 
            +
                mSqlite3Open = rb_define_module_under(mSqlite3Constants, "Open");
         | 
| 134 | 
            +
             | 
| 135 | 
            +
                /* symbols = IO.readlines('sqlite3.h').map { |n| /\A#define\s+(SQLITE_OPEN_\w+)\s/ =~ n && $1 }.compact
         | 
| 136 | 
            +
                 * pad = symbols.map(&:length).max - 9
         | 
| 137 | 
            +
                 * symbols.each { |s| printf %Q{  rb_define_const(mSqlite3Open, %-#{pad}s INT2FIX(#{s}));\n}, '"' + s[12..-1] + '",' }
         | 
| 138 | 
            +
                 */
         | 
| 139 | 
            +
                rb_define_const(mSqlite3Open, "READONLY",       INT2FIX(SQLITE_OPEN_READONLY));
         | 
| 140 | 
            +
                rb_define_const(mSqlite3Open, "READWRITE",      INT2FIX(SQLITE_OPEN_READWRITE));
         | 
| 141 | 
            +
                rb_define_const(mSqlite3Open, "CREATE",         INT2FIX(SQLITE_OPEN_CREATE));
         | 
| 142 | 
            +
                rb_define_const(mSqlite3Open, "DELETEONCLOSE",  INT2FIX(SQLITE_OPEN_DELETEONCLOSE));
         | 
| 143 | 
            +
                rb_define_const(mSqlite3Open, "EXCLUSIVE",      INT2FIX(SQLITE_OPEN_EXCLUSIVE));
         | 
| 144 | 
            +
                rb_define_const(mSqlite3Open, "MAIN_DB",        INT2FIX(SQLITE_OPEN_MAIN_DB));
         | 
| 145 | 
            +
                rb_define_const(mSqlite3Open, "TEMP_DB",        INT2FIX(SQLITE_OPEN_TEMP_DB));
         | 
| 146 | 
            +
                rb_define_const(mSqlite3Open, "TRANSIENT_DB",   INT2FIX(SQLITE_OPEN_TRANSIENT_DB));
         | 
| 147 | 
            +
                rb_define_const(mSqlite3Open, "MAIN_JOURNAL",   INT2FIX(SQLITE_OPEN_MAIN_JOURNAL));
         | 
| 148 | 
            +
                rb_define_const(mSqlite3Open, "TEMP_JOURNAL",   INT2FIX(SQLITE_OPEN_TEMP_JOURNAL));
         | 
| 149 | 
            +
                rb_define_const(mSqlite3Open, "SUBJOURNAL",     INT2FIX(SQLITE_OPEN_SUBJOURNAL));
         | 
| 150 | 
            +
                rb_define_const(mSqlite3Open, "MASTER_JOURNAL",
         | 
| 151 | 
            +
                                INT2FIX(SQLITE_OPEN_MASTER_JOURNAL)); /* pre-3.33.0 */
         | 
| 152 | 
            +
                rb_define_const(mSqlite3Open, "SUPER_JOURNAL",  INT2FIX(SQLITE_OPEN_MASTER_JOURNAL));
         | 
| 153 | 
            +
                rb_define_const(mSqlite3Open, "NOMUTEX",        INT2FIX(SQLITE_OPEN_NOMUTEX));
         | 
| 154 | 
            +
                rb_define_const(mSqlite3Open, "FULLMUTEX",      INT2FIX(SQLITE_OPEN_FULLMUTEX));
         | 
| 113 155 | 
             
            #ifdef SQLITE_OPEN_AUTOPROXY
         | 
| 114 | 
            -
             | 
| 115 | 
            -
             | 
| 116 | 
            -
             | 
| 117 | 
            -
             | 
| 118 | 
            -
             | 
| 156 | 
            +
                /* SQLITE_VERSION_NUMBER>=3007002 */
         | 
| 157 | 
            +
                rb_define_const(mSqlite3Open, "AUTOPROXY",      INT2FIX(SQLITE_OPEN_AUTOPROXY));
         | 
| 158 | 
            +
                rb_define_const(mSqlite3Open, "SHAREDCACHE",    INT2FIX(SQLITE_OPEN_SHAREDCACHE));
         | 
| 159 | 
            +
                rb_define_const(mSqlite3Open, "PRIVATECACHE",   INT2FIX(SQLITE_OPEN_PRIVATECACHE));
         | 
| 160 | 
            +
                rb_define_const(mSqlite3Open, "WAL",            INT2FIX(SQLITE_OPEN_WAL));
         | 
| 119 161 | 
             
            #endif
         | 
| 120 162 | 
             
            #ifdef SQLITE_OPEN_URI
         | 
| 121 | 
            -
             | 
| 122 | 
            -
             | 
| 163 | 
            +
                /* SQLITE_VERSION_NUMBER>=3007007 */
         | 
| 164 | 
            +
                rb_define_const(mSqlite3Open, "URI",            INT2FIX(SQLITE_OPEN_URI));
         | 
| 123 165 | 
             
            #endif
         | 
| 124 166 | 
             
            #ifdef SQLITE_OPEN_MEMORY
         | 
| 125 | 
            -
             | 
| 126 | 
            -
             | 
| 167 | 
            +
                /* SQLITE_VERSION_NUMBER>=3007013 */
         | 
| 168 | 
            +
                rb_define_const(mSqlite3Open, "MEMORY",         INT2FIX(SQLITE_OPEN_MEMORY));
         | 
| 127 169 | 
             
            #endif
         | 
| 128 170 | 
             
            }
         | 
| 129 171 |  | 
| 130 172 | 
             
            RUBY_FUNC_EXPORTED
         | 
| 131 | 
            -
            void | 
| 173 | 
            +
            void
         | 
| 174 | 
            +
            Init_sqlite3_native(void)
         | 
| 132 175 | 
             
            {
         | 
| 133 | 
            -
             | 
| 134 | 
            -
             | 
| 135 | 
            -
             | 
| 136 | 
            -
             | 
| 137 | 
            -
             | 
| 138 | 
            -
             | 
| 139 | 
            -
             | 
| 140 | 
            -
             | 
| 141 | 
            -
             | 
| 142 | 
            -
             | 
| 143 | 
            -
             | 
| 144 | 
            -
             | 
| 145 | 
            -
             | 
| 146 | 
            -
             | 
| 176 | 
            +
                /*
         | 
| 177 | 
            +
                 * SQLite3 is a wrapper around the popular database
         | 
| 178 | 
            +
                 * sqlite[http://sqlite.org].
         | 
| 179 | 
            +
                 *
         | 
| 180 | 
            +
                 * For an example of usage, see SQLite3::Database.
         | 
| 181 | 
            +
                 */
         | 
| 182 | 
            +
                mSqlite3     = rb_define_module("SQLite3");
         | 
| 183 | 
            +
             | 
| 184 | 
            +
                /* A class for differentiating between strings and blobs, when binding them
         | 
| 185 | 
            +
                 * into statements.
         | 
| 186 | 
            +
                 */
         | 
| 187 | 
            +
                cSqlite3Blob = rb_define_class_under(mSqlite3, "Blob", rb_cString);
         | 
| 188 | 
            +
             | 
| 189 | 
            +
                /* Initialize the sqlite3 library */
         | 
| 147 190 | 
             
            #ifdef HAVE_SQLITE3_INITIALIZE
         | 
| 148 | 
            -
             | 
| 191 | 
            +
                sqlite3_initialize();
         | 
| 149 192 | 
             
            #endif
         | 
| 150 193 |  | 
| 151 | 
            -
             | 
| 152 | 
            -
             | 
| 153 | 
            -
             | 
| 194 | 
            +
                init_sqlite3_constants();
         | 
| 195 | 
            +
                init_sqlite3_database();
         | 
| 196 | 
            +
                init_sqlite3_statement();
         | 
| 154 197 | 
             
            #ifdef HAVE_SQLITE3_BACKUP_INIT
         | 
| 155 | 
            -
             | 
| 198 | 
            +
                init_sqlite3_backup();
         | 
| 156 199 | 
             
            #endif
         | 
| 157 | 
            -
             | 
| 158 | 
            -
             | 
| 159 | 
            -
             | 
| 160 | 
            -
             | 
| 161 | 
            -
             | 
| 162 | 
            -
             | 
| 200 | 
            +
                rb_define_singleton_method(mSqlite3, "sqlcipher?", using_sqlcipher, 0);
         | 
| 201 | 
            +
                rb_define_singleton_method(mSqlite3, "libversion", libversion, 0);
         | 
| 202 | 
            +
                rb_define_singleton_method(mSqlite3, "threadsafe", threadsafe_p, 0);
         | 
| 203 | 
            +
                rb_define_singleton_method(mSqlite3, "status", rb_sqlite3_status, -1);
         | 
| 204 | 
            +
                rb_define_const(mSqlite3, "SQLITE_VERSION", rb_str_new2(SQLITE_VERSION));
         | 
| 205 | 
            +
                rb_define_const(mSqlite3, "SQLITE_VERSION_NUMBER", INT2FIX(SQLITE_VERSION_NUMBER));
         | 
| 206 | 
            +
                rb_define_const(mSqlite3, "SQLITE_LOADED_VERSION", rb_str_new2(sqlite3_libversion()));
         | 
| 163 207 |  | 
| 164 208 | 
             
            }
         |