sqlite3-full 1.3.9.1
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 +7 -0
- data/.gemtest +0 -0
- data/API_CHANGES.rdoc +50 -0
- data/CHANGELOG.rdoc +278 -0
- data/ChangeLog.cvs +88 -0
- data/Gemfile +15 -0
- data/LICENSE +34 -0
- data/Manifest.txt +52 -0
- data/README.rdoc +90 -0
- data/Rakefile +10 -0
- data/ext/sqlite3/backup.c +168 -0
- data/ext/sqlite3/backup.h +15 -0
- data/ext/sqlite3/database.c +825 -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 +86 -0
- data/ext/sqlite3/sqlite3.c +97 -0
- data/ext/sqlite3/sqlite3_ruby.h +52 -0
- data/ext/sqlite3/sqlite3amalgamation.c +153367 -0
- data/ext/sqlite3/statement.c +447 -0
- data/ext/sqlite3/statement.h +16 -0
- data/faq/faq.rb +145 -0
- data/faq/faq.yml +426 -0
- data/lib/sqlite3/constants.rb +49 -0
- data/lib/sqlite3/database.rb +590 -0
- data/lib/sqlite3/errors.rb +44 -0
- data/lib/sqlite3/pragmas.rb +280 -0
- data/lib/sqlite3/resultset.rb +195 -0
- data/lib/sqlite3/statement.rb +144 -0
- data/lib/sqlite3/translator.rb +118 -0
- data/lib/sqlite3/value.rb +57 -0
- data/lib/sqlite3/version.rb +25 -0
- data/lib/sqlite3.rb +10 -0
- data/setup.rb +1333 -0
- data/tasks/faq.rake +9 -0
- data/tasks/gem.rake +38 -0
- data/tasks/native.rake +52 -0
- data/tasks/vendor_sqlite3.rake +91 -0
- data/test/helper.rb +18 -0
- data/test/test_backup.rb +33 -0
- data/test/test_collation.rb +82 -0
- data/test/test_database.rb +367 -0
- data/test/test_database_readonly.rb +29 -0
- data/test/test_deprecated.rb +44 -0
- data/test/test_encoding.rb +153 -0
- data/test/test_integration.rb +572 -0
- data/test/test_integration_open_close.rb +30 -0
- data/test/test_integration_pending.rb +115 -0
- data/test/test_integration_resultset.rb +159 -0
- data/test/test_integration_statement.rb +194 -0
- data/test/test_result_set.rb +37 -0
- data/test/test_sqlite3.rb +9 -0
- data/test/test_statement.rb +260 -0
- data/test/test_statement_execute.rb +35 -0
- metadata +205 -0
@@ -0,0 +1,118 @@
|
|
1
|
+
require 'time'
|
2
|
+
require 'date'
|
3
|
+
|
4
|
+
module SQLite3
|
5
|
+
|
6
|
+
# The Translator class encapsulates the logic and callbacks necessary for
|
7
|
+
# converting string data to a value of some specified type. Every Database
|
8
|
+
# instance may have a Translator instance, in order to assist in type
|
9
|
+
# translation (Database#type_translation).
|
10
|
+
#
|
11
|
+
# Further, applications may define their own custom type translation logic
|
12
|
+
# by registering translator blocks with the corresponding database's
|
13
|
+
# translator instance (Database#translator).
|
14
|
+
class Translator
|
15
|
+
|
16
|
+
# Create a new Translator instance. It will be preinitialized with default
|
17
|
+
# translators for most SQL data types.
|
18
|
+
def initialize
|
19
|
+
@translators = Hash.new( proc { |type,value| value } )
|
20
|
+
@type_name_cache = {}
|
21
|
+
register_default_translators
|
22
|
+
end
|
23
|
+
|
24
|
+
# Add a new translator block, which will be invoked to process type
|
25
|
+
# translations to the given type. The type should be an SQL datatype, and
|
26
|
+
# may include parentheses (i.e., "VARCHAR(30)"). However, any parenthetical
|
27
|
+
# information is stripped off and discarded, so type translation decisions
|
28
|
+
# are made solely on the "base" type name.
|
29
|
+
#
|
30
|
+
# The translator block itself should accept two parameters, "type" and
|
31
|
+
# "value". In this case, the "type" is the full type name (including
|
32
|
+
# parentheses), so the block itself may include logic for changing how a
|
33
|
+
# type is translated based on the additional data. The "value" parameter
|
34
|
+
# is the (string) data to convert.
|
35
|
+
#
|
36
|
+
# The block should return the translated value.
|
37
|
+
def add_translator( type, &block ) # :yields: type, value
|
38
|
+
warn(<<-eowarn) if $VERBOSE
|
39
|
+
#{caller[0]} is calling `add_translator`.
|
40
|
+
Built in translators are deprecated and will be removed in version 2.0.0
|
41
|
+
eowarn
|
42
|
+
@translators[ type_name( type ) ] = block
|
43
|
+
end
|
44
|
+
|
45
|
+
# Translate the given string value to a value of the given type. In the
|
46
|
+
# absense of an installed translator block for the given type, the value
|
47
|
+
# itself is always returned. Further, +nil+ values are never translated,
|
48
|
+
# and are always passed straight through regardless of the type parameter.
|
49
|
+
def translate( type, value )
|
50
|
+
unless value.nil?
|
51
|
+
# FIXME: this is a hack to support Sequel
|
52
|
+
if type && %w{ datetime timestamp }.include?(type.downcase)
|
53
|
+
@translators[ type_name( type ) ].call( type, value.to_s )
|
54
|
+
else
|
55
|
+
@translators[ type_name( type ) ].call( type, value )
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# A convenience method for working with type names. This returns the "base"
|
61
|
+
# type name, without any parenthetical data.
|
62
|
+
def type_name( type )
|
63
|
+
@type_name_cache[type] ||= begin
|
64
|
+
type = "" if type.nil?
|
65
|
+
type = $1 if type =~ /^(.*?)\(/
|
66
|
+
type.upcase
|
67
|
+
end
|
68
|
+
end
|
69
|
+
private :type_name
|
70
|
+
|
71
|
+
# Register the default translators for the current Translator instance.
|
72
|
+
# This includes translators for most major SQL data types.
|
73
|
+
def register_default_translators
|
74
|
+
[ "time",
|
75
|
+
"timestamp" ].each { |type| add_translator( type ) { |t, v| Time.parse( v ) } }
|
76
|
+
|
77
|
+
add_translator( "date" ) { |t,v| Date.parse(v) }
|
78
|
+
add_translator( "datetime" ) { |t,v| DateTime.parse(v) }
|
79
|
+
|
80
|
+
[ "decimal",
|
81
|
+
"float",
|
82
|
+
"numeric",
|
83
|
+
"double",
|
84
|
+
"real",
|
85
|
+
"dec",
|
86
|
+
"fixed" ].each { |type| add_translator( type ) { |t,v| v.to_f } }
|
87
|
+
|
88
|
+
[ "integer",
|
89
|
+
"smallint",
|
90
|
+
"mediumint",
|
91
|
+
"int",
|
92
|
+
"bigint" ].each { |type| add_translator( type ) { |t,v| v.to_i } }
|
93
|
+
|
94
|
+
[ "bit",
|
95
|
+
"bool",
|
96
|
+
"boolean" ].each do |type|
|
97
|
+
add_translator( type ) do |t,v|
|
98
|
+
!( v.strip.gsub(/00+/,"0") == "0" ||
|
99
|
+
v.downcase == "false" ||
|
100
|
+
v.downcase == "f" ||
|
101
|
+
v.downcase == "no" ||
|
102
|
+
v.downcase == "n" )
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
add_translator( "tinyint" ) do |type, value|
|
107
|
+
if type =~ /\(\s*1\s*\)/
|
108
|
+
value.to_i == 1
|
109
|
+
else
|
110
|
+
value.to_i
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
private :register_default_translators
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'sqlite3/constants'
|
2
|
+
|
3
|
+
module SQLite3
|
4
|
+
|
5
|
+
class Value
|
6
|
+
attr_reader :handle
|
7
|
+
|
8
|
+
def initialize( db, handle )
|
9
|
+
@driver = db.driver
|
10
|
+
@handle = handle
|
11
|
+
end
|
12
|
+
|
13
|
+
def null?
|
14
|
+
type == :null
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_blob
|
18
|
+
@driver.value_blob( @handle )
|
19
|
+
end
|
20
|
+
|
21
|
+
def length( utf16=false )
|
22
|
+
if utf16
|
23
|
+
@driver.value_bytes16( @handle )
|
24
|
+
else
|
25
|
+
@driver.value_bytes( @handle )
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_f
|
30
|
+
@driver.value_double( @handle )
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_i
|
34
|
+
@driver.value_int( @handle )
|
35
|
+
end
|
36
|
+
|
37
|
+
def to_int64
|
38
|
+
@driver.value_int64( @handle )
|
39
|
+
end
|
40
|
+
|
41
|
+
def to_s( utf16=false )
|
42
|
+
@driver.value_text( @handle, utf16 )
|
43
|
+
end
|
44
|
+
|
45
|
+
def type
|
46
|
+
case @driver.value_type( @handle )
|
47
|
+
when Constants::ColumnType::INTEGER then :int
|
48
|
+
when Constants::ColumnType::FLOAT then :float
|
49
|
+
when Constants::ColumnType::TEXT then :text
|
50
|
+
when Constants::ColumnType::BLOB then :blob
|
51
|
+
when Constants::ColumnType::NULL then :null
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module SQLite3
|
2
|
+
|
3
|
+
VERSION = '1.3.9.1'
|
4
|
+
|
5
|
+
module VersionProxy
|
6
|
+
|
7
|
+
MAJOR = 1
|
8
|
+
MINOR = 3
|
9
|
+
TINY = 9
|
10
|
+
BUILD = nil
|
11
|
+
|
12
|
+
STRING = [ MAJOR, MINOR, TINY, BUILD ].compact.join( "." )
|
13
|
+
#:beta-tag:
|
14
|
+
|
15
|
+
VERSION = ::SQLite3::VERSION
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.const_missing(name)
|
19
|
+
return super unless name == :Version
|
20
|
+
warn(<<-eowarn) if $VERBOSE
|
21
|
+
#{caller[0]}: SQLite::Version will be removed in sqlite3-ruby version 2.0.0
|
22
|
+
eowarn
|
23
|
+
VersionProxy
|
24
|
+
end
|
25
|
+
end
|
data/lib/sqlite3.rb
ADDED