sqlite3 0.1.1 → 1.3.3.beta.1
Sign up to get free protection for your applications and to get access to all the features.
- data/API_CHANGES.rdoc +50 -0
- data/CHANGELOG.rdoc +177 -0
- data/ChangeLog.cvs +88 -0
- data/LICENSE +24 -17
- data/Manifest.txt +50 -0
- data/README.rdoc +100 -4
- data/Rakefile +10 -0
- data/ext/sqlite3/backup.c +164 -0
- data/ext/sqlite3/backup.h +15 -0
- data/ext/sqlite3/database.c +762 -0
- data/ext/sqlite3/database.h +15 -0
- data/ext/sqlite3/exception.c +94 -0
- data/ext/sqlite3/exception.h +8 -0
- data/ext/sqlite3/extconf.rb +47 -0
- data/ext/sqlite3/sqlite3.c +36 -0
- data/ext/sqlite3/sqlite3_ruby.h +44 -0
- data/ext/sqlite3/statement.c +419 -0
- data/ext/sqlite3/statement.h +16 -0
- data/faq/faq.rb +145 -0
- data/faq/faq.yml +426 -0
- data/lib/sqlite3.rb +9 -12
- data/lib/sqlite3/constants.rb +46 -72
- data/lib/sqlite3/database.rb +415 -140
- data/lib/sqlite3/errors.rb +1 -56
- data/lib/sqlite3/pragmas.rb +246 -63
- data/lib/sqlite3/resultset.rb +30 -112
- data/lib/sqlite3/statement.rb +42 -108
- data/lib/sqlite3/translator.rb +118 -0
- data/lib/sqlite3/value.rb +57 -0
- data/lib/sqlite3/version.rb +23 -1
- data/setup.rb +1333 -0
- data/tasks/faq.rake +9 -0
- data/tasks/gem.rake +31 -0
- data/tasks/native.rake +61 -0
- data/tasks/vendor_sqlite3.rake +104 -0
- data/test/helper.rb +3 -0
- data/test/test_backup.rb +33 -0
- data/test/test_collation.rb +82 -0
- data/test/test_database.rb +312 -0
- data/test/test_database_readonly.rb +29 -0
- data/test/test_deprecated.rb +37 -0
- data/test/test_encoding.rb +119 -0
- data/test/test_integration.rb +544 -0
- data/test/test_integration_open_close.rb +30 -0
- data/test/test_integration_pending.rb +115 -0
- data/test/test_integration_resultset.rb +156 -0
- data/test/test_integration_statement.rb +194 -0
- data/test/test_sqlite3.rb +9 -0
- data/test/test_statement.rb +207 -0
- data/test/test_statement_execute.rb +35 -0
- metadata +124 -67
- data/lib/sqlite3/api.rb +0 -52
- data/lib/sqlite3/driver.rb +0 -138
- data/lib/sqlite3/encoding.rb +0 -43
- data/lib/sqlite3/extensions.rb +0 -27
data/lib/sqlite3/api.rb
DELETED
@@ -1,52 +0,0 @@
|
|
1
|
-
module SQLite3
|
2
|
-
module API
|
3
|
-
extend FFI::Library
|
4
|
-
|
5
|
-
lib_paths = Array(ENV["SQLITE3_LIB"] || Dir["/{opt,usr}/{,local/}lib{,64}/libsqlite3.{dylib,so*}"])
|
6
|
-
fallback_names = ["libsqlite3", "sqlite3"]
|
7
|
-
ffi_lib(lib_paths + fallback_names)
|
8
|
-
|
9
|
-
attach_function :sqlite3_bind_blob, [:pointer, :int, :pointer, :int, :pointer], :int
|
10
|
-
attach_function :sqlite3_bind_double, [:pointer, :int, :double], :int
|
11
|
-
attach_function :sqlite3_bind_int, [:pointer, :int, :int], :int
|
12
|
-
attach_function :sqlite3_bind_int64, [:pointer, :int, :int64], :int
|
13
|
-
attach_function :sqlite3_bind_null, [:pointer, :int], :int
|
14
|
-
attach_function :sqlite3_bind_parameter_index, [:pointer, :string], :int
|
15
|
-
attach_function :sqlite3_bind_text, [:pointer, :int, :string, :int, :pointer], :int
|
16
|
-
attach_function :sqlite3_bind_text16, [:pointer, :int, :pointer, :int, :pointer], :int
|
17
|
-
attach_function :sqlite3_busy_timeout, [:pointer, :int], :int
|
18
|
-
attach_function :sqlite3_changes, [:pointer], :int
|
19
|
-
attach_function :sqlite3_close, [:pointer], :int
|
20
|
-
attach_function :sqlite3_column_blob, [:pointer, :int], :pointer
|
21
|
-
attach_function :sqlite3_column_bytes, [:pointer, :int], :int
|
22
|
-
attach_function :sqlite3_column_bytes16, [:pointer, :int], :int
|
23
|
-
attach_function :sqlite3_column_count, [:pointer], :int
|
24
|
-
attach_function :sqlite3_column_decltype, [:pointer, :int], :string
|
25
|
-
attach_function :sqlite3_column_double, [:pointer, :int], :double
|
26
|
-
attach_function :sqlite3_column_int64, [:pointer, :int], :int64
|
27
|
-
attach_function :sqlite3_column_name, [:pointer, :int], :string
|
28
|
-
attach_function :sqlite3_column_text, [:pointer, :int], :string
|
29
|
-
attach_function :sqlite3_column_text16, [:pointer, :int], :pointer
|
30
|
-
attach_function :sqlite3_column_type, [:pointer, :int], :int
|
31
|
-
attach_function :sqlite3_data_count, [:pointer], :int
|
32
|
-
attach_function :sqlite3_errcode, [:pointer], :int
|
33
|
-
attach_function :sqlite3_errmsg, [:pointer], :string
|
34
|
-
attach_function :sqlite3_errmsg16, [:pointer], :pointer
|
35
|
-
attach_function :sqlite3_finalize, [:pointer], :int
|
36
|
-
attach_function :sqlite3_last_insert_rowid, [:pointer], :int64
|
37
|
-
attach_function :sqlite3_libversion, [], :string
|
38
|
-
attach_function :sqlite3_open, [:string, :pointer], :int
|
39
|
-
attach_function :sqlite3_open16, [:pointer, :pointer], :int
|
40
|
-
attach_function :sqlite3_prepare, [:pointer, :string, :int, :pointer, :pointer], :int
|
41
|
-
attach_function :sqlite3_reset, [:pointer], :int
|
42
|
-
attach_function :sqlite3_step, [:pointer], :int
|
43
|
-
|
44
|
-
begin
|
45
|
-
attach_function :sqlite3_enable_load_extension, [:pointer, :int], :int
|
46
|
-
attach_function :sqlite3_load_extension, [:pointer, :string, :string, :string], :int
|
47
|
-
EXTENSION_SUPPORT = true
|
48
|
-
rescue FFI::NotFoundError
|
49
|
-
EXTENSION_SUPPORT = false
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
data/lib/sqlite3/driver.rb
DELETED
@@ -1,138 +0,0 @@
|
|
1
|
-
module SQLite3
|
2
|
-
class Driver
|
3
|
-
TRANSIENT = FFI::Pointer.new(-1)
|
4
|
-
|
5
|
-
def open(filename, utf_16 = false)
|
6
|
-
handle = FFI::MemoryPointer.new(:pointer)
|
7
|
-
if utf_16
|
8
|
-
filename = filename.encode(Encoding.utf_16native) if filename.respond_to?(:encode)
|
9
|
-
result = API.sqlite3_open16(c_string(filename), handle)
|
10
|
-
else
|
11
|
-
filename = filename.encode(Encoding.utf_8) if filename.respond_to?(:encode)
|
12
|
-
result = API.sqlite3_open(filename, handle)
|
13
|
-
end
|
14
|
-
[result, handle.get_pointer(0)]
|
15
|
-
end
|
16
|
-
|
17
|
-
def errmsg(db, utf_16 = false)
|
18
|
-
if utf_16
|
19
|
-
ptr = API.sqlite3_errmsg16(db)
|
20
|
-
result = get_string_utf_16(ptr)
|
21
|
-
result.force_encoding(Encoding.utf_16native) if result.respond_to?(:force_encoding)
|
22
|
-
result
|
23
|
-
else
|
24
|
-
result = API.sqlite3_errmsg(db)
|
25
|
-
result.force_encoding(Encoding.utf_8) if result.respond_to?(:force_encoding)
|
26
|
-
result
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def prepare(db, sql)
|
31
|
-
handle = FFI::MemoryPointer.new(:pointer)
|
32
|
-
remainder = FFI::MemoryPointer.new(:pointer)
|
33
|
-
|
34
|
-
if Encoding.utf_16?(sql)
|
35
|
-
str = c_string(sql)
|
36
|
-
result = API.sqlite3_prepare16(db, str, str.bytesize, handle, remainder)
|
37
|
-
remainder_string = get_string_utf_16(remainder.get_pointer(0))
|
38
|
-
else
|
39
|
-
result = API.sqlite3_prepare(db, sql, sql.bytesize, handle, remainder)
|
40
|
-
remainder_string = remainder.get_pointer(0).get_string(0)
|
41
|
-
end
|
42
|
-
|
43
|
-
[result, handle.get_pointer(0), remainder_string]
|
44
|
-
end
|
45
|
-
|
46
|
-
def bind_string(stmt, index, value)
|
47
|
-
case value.encoding
|
48
|
-
when Encoding.utf_8, Encoding.us_ascii
|
49
|
-
API.sqlite3_bind_text(stmt, index, value, value.bytesize, TRANSIENT)
|
50
|
-
when Encoding.utf_16le, Encoding.utf_16be
|
51
|
-
value = add_byte_order_mask(value)
|
52
|
-
API.sqlite3_bind_text16(stmt, index, value, value.bytesize, TRANSIENT)
|
53
|
-
else
|
54
|
-
API.sqlite3_bind_blob(stmt, index, value, value.bytesize, TRANSIENT)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
def column_blob(stmt, column)
|
59
|
-
blob = API.sqlite3_column_blob(stmt, column)
|
60
|
-
length = API.sqlite3_column_bytes(stmt, column)
|
61
|
-
blob.get_bytes(0, length) # free?
|
62
|
-
end
|
63
|
-
|
64
|
-
def column_text(stmt, column, utf_16 = false)
|
65
|
-
if utf_16
|
66
|
-
ptr = API.sqlite3_column_text16(stmt, column)
|
67
|
-
length = API.sqlite3_column_bytes16(stmt, column)
|
68
|
-
ptr.get_bytes(0, length).force_encoding(Encoding.utf_16native) # free?
|
69
|
-
else
|
70
|
-
API.sqlite3_column_text(stmt, column).force_encoding(Encoding.utf_8)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
def extension_support?
|
75
|
-
API::EXTENSION_SUPPORT
|
76
|
-
end
|
77
|
-
|
78
|
-
def load_extension(db, name, entry_point = nil)
|
79
|
-
result = API.sqlite3_load_extension(db, name, entry_point, nil)
|
80
|
-
[result, nil]
|
81
|
-
end
|
82
|
-
|
83
|
-
def enable_load_extension(db, onoff = false)
|
84
|
-
API.sqlite3_enable_load_extension(db, (onoff ? 1 : 0))
|
85
|
-
end
|
86
|
-
|
87
|
-
def self.api_delegate(name)
|
88
|
-
define_method(name) { |*args| API.send("sqlite3_#{name}", *args) }
|
89
|
-
end
|
90
|
-
|
91
|
-
api_delegate :bind_double
|
92
|
-
api_delegate :bind_int
|
93
|
-
api_delegate :bind_int64
|
94
|
-
api_delegate :bind_null
|
95
|
-
api_delegate :bind_parameter_index
|
96
|
-
api_delegate :busy_timeout
|
97
|
-
api_delegate :changes
|
98
|
-
api_delegate :close
|
99
|
-
api_delegate :column_count
|
100
|
-
api_delegate :column_decltype
|
101
|
-
api_delegate :column_double
|
102
|
-
api_delegate :column_int64
|
103
|
-
api_delegate :column_name
|
104
|
-
api_delegate :column_type
|
105
|
-
api_delegate :data_count
|
106
|
-
api_delegate :errcode
|
107
|
-
api_delegate :finalize
|
108
|
-
api_delegate :last_insert_rowid
|
109
|
-
api_delegate :libversion
|
110
|
-
api_delegate :reset
|
111
|
-
api_delegate :step
|
112
|
-
|
113
|
-
private
|
114
|
-
|
115
|
-
def c_string(string)
|
116
|
-
if Encoding.utf_16?(string)
|
117
|
-
result = add_byte_order_mask(string)
|
118
|
-
terminate_string!(result)
|
119
|
-
else
|
120
|
-
string # FFI does the job
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
def add_byte_order_mask(string)
|
125
|
-
"\uFEFF".encode(string.encoding) + string
|
126
|
-
end
|
127
|
-
|
128
|
-
def terminate_string!(string)
|
129
|
-
string << "\0\0".force_encoding(string.encoding)
|
130
|
-
end
|
131
|
-
|
132
|
-
def get_string_utf_16(ptr)
|
133
|
-
length = 0
|
134
|
-
length += 2 until ptr.get_bytes(length, 2) == "\0\0"
|
135
|
-
ptr.get_bytes(0, length)
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
data/lib/sqlite3/encoding.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
module SQLite3
|
2
|
-
class Encoding
|
3
|
-
class << self
|
4
|
-
def find(encoding)
|
5
|
-
enc = encoding.to_s
|
6
|
-
if enc.downcase == "utf-16"
|
7
|
-
utf_16native
|
8
|
-
else
|
9
|
-
::Encoding.find(enc).tap do |e|
|
10
|
-
if utf_16?(e) && e != utf_16native
|
11
|
-
raise ArgumentError, "requested to use byte order different than native"
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def utf_16?(str_or_enc)
|
18
|
-
enc = str_or_enc.kind_of?(::Encoding) ? str_or_enc : str_or_enc.encoding
|
19
|
-
[utf_16le, utf_16be].include?(enc)
|
20
|
-
end
|
21
|
-
|
22
|
-
def utf_16native
|
23
|
-
"Ruby".unpack("i")[0] == 2036495698 ? utf_16le : utf_16be
|
24
|
-
end
|
25
|
-
|
26
|
-
def us_ascii
|
27
|
-
::Encoding::US_ASCII
|
28
|
-
end
|
29
|
-
|
30
|
-
def utf_8
|
31
|
-
::Encoding::UTF_8
|
32
|
-
end
|
33
|
-
|
34
|
-
def utf_16le
|
35
|
-
::Encoding::UTF_16LE
|
36
|
-
end
|
37
|
-
|
38
|
-
def utf_16be
|
39
|
-
::Encoding::UTF_16BE
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
data/lib/sqlite3/extensions.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
module SQLite3
|
2
|
-
module Extensions
|
3
|
-
def enable_load_extension(onoff=true)
|
4
|
-
must_support_extensions!
|
5
|
-
result = @driver.enable_load_extension(@handle, onoff)
|
6
|
-
Error.check(result, self)
|
7
|
-
end
|
8
|
-
|
9
|
-
def disable_load_extension
|
10
|
-
must_support_extensions!
|
11
|
-
result = @driver.enable_load_extension(@handle, false)
|
12
|
-
Error.check(result, self)
|
13
|
-
end
|
14
|
-
|
15
|
-
def load_extension(name, entry_point=nil)
|
16
|
-
must_support_extensions!
|
17
|
-
result, message = @driver.load_extension(@handle, name, entry_point)
|
18
|
-
Error.check(result, self, message)
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
def must_support_extensions!
|
24
|
-
raise SQLite3::Exception, "extensions API not supported" unless @driver.extension_support?
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|