sequel 0.4.0 → 0.4.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.
- data/CHANGELOG +4 -0
- data/README +1 -6
- data/Rakefile +1 -1
- data/bin/sequel +1 -3
- data/lib/sequel.rb +18 -1
- data/lib/sequel/adapters/ado.rb +104 -0
- data/lib/sequel/adapters/db2.rb +160 -0
- data/lib/sequel/adapters/dbi.rb +130 -0
- data/lib/sequel/adapters/informix.rb +78 -0
- data/lib/sequel/adapters/mysql.rb +256 -0
- data/lib/sequel/adapters/odbc.rb +144 -0
- data/lib/sequel/adapters/oracle.rb +109 -0
- data/lib/sequel/adapters/postgres.rb +507 -0
- data/lib/sequel/adapters/sqlite.rb +186 -0
- data/lib/sequel/ado.rb +2 -104
- data/lib/{sequel-core → sequel}/array_keys.rb +0 -0
- data/lib/{sequel-core → sequel}/connection_pool.rb +0 -0
- data/lib/{sequel-core → sequel}/core_ext.rb +0 -0
- data/lib/{sequel-core → sequel}/core_sql.rb +0 -0
- data/lib/{sequel-core → sequel}/database.rb +10 -20
- data/lib/{sequel-core → sequel}/dataset.rb +0 -0
- data/lib/{sequel-core → sequel}/dataset/convenience.rb +0 -0
- data/lib/{sequel-core → sequel}/dataset/sequelizer.rb +0 -0
- data/lib/{sequel-core → sequel}/dataset/sql.rb +0 -0
- data/lib/sequel/db2.rb +2 -160
- data/lib/sequel/dbi.rb +2 -130
- data/lib/{sequel-core → sequel}/error.rb +0 -0
- data/lib/sequel/informix.rb +2 -78
- data/lib/{sequel-core → sequel}/migration.rb +0 -0
- data/lib/{sequel-core → sequel}/model.rb +0 -0
- data/lib/{sequel-core → sequel}/model/base.rb +0 -0
- data/lib/{sequel-core → sequel}/model/caching.rb +0 -0
- data/lib/{sequel-core → sequel}/model/hooks.rb +0 -0
- data/lib/{sequel-core → sequel}/model/record.rb +0 -0
- data/lib/{sequel-core → sequel}/model/relations.rb +0 -0
- data/lib/{sequel-core → sequel}/model/schema.rb +0 -0
- data/lib/sequel/mysql.rb +2 -256
- data/lib/sequel/odbc.rb +2 -144
- data/lib/sequel/oracle.rb +2 -109
- data/lib/sequel/postgres.rb +2 -507
- data/lib/{sequel-core → sequel}/pretty_table.rb +0 -0
- data/lib/{sequel-core → sequel}/schema.rb +0 -0
- data/lib/{sequel-core → sequel}/schema/schema_generator.rb +0 -0
- data/lib/{sequel-core → sequel}/schema/schema_sql.rb +0 -0
- data/lib/sequel/sqlite.rb +2 -186
- data/lib/{sequel-core → sequel}/worker.rb +0 -0
- data/spec/database_spec.rb +7 -9
- metadata +39 -29
data/lib/sequel/dbi.rb
CHANGED
@@ -1,130 +1,2 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
end
|
4
|
-
|
5
|
-
require 'dbi'
|
6
|
-
|
7
|
-
module Sequel
|
8
|
-
module DBI
|
9
|
-
class Database < Sequel::Database
|
10
|
-
set_adapter_scheme :dbi
|
11
|
-
|
12
|
-
DBI_ADAPTERS = {
|
13
|
-
:ado => "ADO",
|
14
|
-
:db2 => "DB2",
|
15
|
-
:frontbase => "FrontBase",
|
16
|
-
:interbase => "InterBase",
|
17
|
-
:msql => "Msql",
|
18
|
-
:mysql => "Mysql",
|
19
|
-
:odbc => "ODBC",
|
20
|
-
:oracle => "Oracle",
|
21
|
-
:pg => "Pg",
|
22
|
-
:proxy => "Proxy",
|
23
|
-
:sqlite => "SQLite",
|
24
|
-
:sqlrelay => "SQLRelay"
|
25
|
-
}
|
26
|
-
|
27
|
-
# Converts a uri to an options hash. These options are then passed
|
28
|
-
# to a newly created database object.
|
29
|
-
def self.uri_to_options(uri)
|
30
|
-
database = (uri.path =~ /\/(.*)/) && ($1)
|
31
|
-
if uri.scheme =~ /dbi-(.+)/
|
32
|
-
adapter = DBI_ADAPTERS[$1.to_sym] || $1
|
33
|
-
database = "#{adapter}:#{database}"
|
34
|
-
end
|
35
|
-
{
|
36
|
-
:user => uri.user,
|
37
|
-
:password => uri.password,
|
38
|
-
:host => uri.host,
|
39
|
-
:port => uri.port,
|
40
|
-
:database => database
|
41
|
-
}
|
42
|
-
end
|
43
|
-
|
44
|
-
|
45
|
-
def connect
|
46
|
-
dbname = @opts[:database]
|
47
|
-
dbname = 'DBI:' + dbname unless dbname =~ /^DBI:/
|
48
|
-
::DBI.connect(dbname, @opts[:user], @opts[:password])
|
49
|
-
end
|
50
|
-
|
51
|
-
def disconnect
|
52
|
-
@pool.disconnect {|c| c.disconnect}
|
53
|
-
end
|
54
|
-
|
55
|
-
def dataset(opts = nil)
|
56
|
-
DBI::Dataset.new(self, opts)
|
57
|
-
end
|
58
|
-
|
59
|
-
def execute(sql)
|
60
|
-
@logger.info(sql) if @logger
|
61
|
-
@pool.hold do |conn|
|
62
|
-
conn.execute(sql)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def do(sql)
|
67
|
-
@logger.info(sql) if @logger
|
68
|
-
@pool.hold do |conn|
|
69
|
-
conn.do(sql)
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
class Dataset < Sequel::Dataset
|
75
|
-
def literal(v)
|
76
|
-
case v
|
77
|
-
when Time: literal(v.iso8601)
|
78
|
-
else
|
79
|
-
super
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
def fetch_rows(sql, &block)
|
84
|
-
@db.synchronize do
|
85
|
-
s = @db.execute sql
|
86
|
-
begin
|
87
|
-
@columns = s.column_names.map {|c| c.to_sym}
|
88
|
-
s.fetch {|r| yield hash_row(s, r)}
|
89
|
-
ensure
|
90
|
-
s.finish rescue nil
|
91
|
-
end
|
92
|
-
end
|
93
|
-
self
|
94
|
-
end
|
95
|
-
|
96
|
-
def array_tuples_fetch_rows(sql, &block)
|
97
|
-
@db.synchronize do
|
98
|
-
s = @db.execute sql
|
99
|
-
begin
|
100
|
-
@columns = s.column_names.map {|c| c.to_sym}
|
101
|
-
s.fetch {|r| r.keys = @columns; yield r}
|
102
|
-
ensure
|
103
|
-
s.finish rescue nil
|
104
|
-
end
|
105
|
-
end
|
106
|
-
self
|
107
|
-
end
|
108
|
-
|
109
|
-
def hash_row(stmt, row)
|
110
|
-
@columns.inject({}) do |m, c|
|
111
|
-
m[c] = row.shift
|
112
|
-
m
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
def insert(*values)
|
117
|
-
@db.do insert_sql(*values)
|
118
|
-
end
|
119
|
-
|
120
|
-
def update(values, opts = nil)
|
121
|
-
@db.do update_sql(values, opts)
|
122
|
-
self
|
123
|
-
end
|
124
|
-
|
125
|
-
def delete(opts = nil)
|
126
|
-
@db.do delete_sql(opts)
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
130
|
-
end
|
1
|
+
warn "Requiring 'sequel/dbi' is deprecated. Please modify your code to require 'sequel' instead."
|
2
|
+
require File.join(File.dirname(__FILE__), 'adapters/dbi')
|
File without changes
|
data/lib/sequel/informix.rb
CHANGED
@@ -1,78 +1,2 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
end
|
4
|
-
|
5
|
-
require 'informix'
|
6
|
-
|
7
|
-
module Sequel
|
8
|
-
module Informix
|
9
|
-
class Database < Sequel::Database
|
10
|
-
set_adapter_scheme :informix
|
11
|
-
|
12
|
-
# AUTO_INCREMENT = 'IDENTITY(1,1)'.freeze
|
13
|
-
#
|
14
|
-
# def auto_increment_sql
|
15
|
-
# AUTO_INCREMENT
|
16
|
-
# end
|
17
|
-
|
18
|
-
def connect
|
19
|
-
::Informix.connect(@opts[:database], @opts[:user], @opts[:password])
|
20
|
-
end
|
21
|
-
|
22
|
-
def disconnect
|
23
|
-
@pool.disconnect {|c| c.close}
|
24
|
-
end
|
25
|
-
|
26
|
-
def dataset(opts = nil)
|
27
|
-
Sequel::Informix::Dataset.new(self, opts)
|
28
|
-
end
|
29
|
-
|
30
|
-
# Returns number of rows affected
|
31
|
-
def execute(sql)
|
32
|
-
@logger.info(sql) if @logger
|
33
|
-
@pool.hold {|c| c.do(sql)}
|
34
|
-
end
|
35
|
-
alias_method :do, :execute
|
36
|
-
|
37
|
-
def query(sql, &block)
|
38
|
-
@logger.info(sql) if @logger
|
39
|
-
@pool.hold {|c| block[c.cursor(sql)]}
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
class Dataset < Sequel::Dataset
|
44
|
-
def literal(v)
|
45
|
-
case v
|
46
|
-
when Time: literal(v.iso8601)
|
47
|
-
else
|
48
|
-
super
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def fetch_rows(sql, &block)
|
53
|
-
@db.synchronize do
|
54
|
-
@db.query(sql) do |cursor|
|
55
|
-
begin
|
56
|
-
cursor.open.each_hash {|r| block[r]}
|
57
|
-
ensure
|
58
|
-
cursor.drop
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
self
|
63
|
-
end
|
64
|
-
|
65
|
-
def insert(*values)
|
66
|
-
@db.do insert_sql(*values)
|
67
|
-
end
|
68
|
-
|
69
|
-
def update(values, opts = nil)
|
70
|
-
@db.do update_sql(values, opts)
|
71
|
-
end
|
72
|
-
|
73
|
-
def delete(opts = nil)
|
74
|
-
@db.do delete_sql(opts)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
1
|
+
warn "Requiring 'sequel/informix' is deprecated. Please modify your code to require 'sequel' instead."
|
2
|
+
require File.join(File.dirname(__FILE__), 'adapters/informix')
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
data/lib/sequel/mysql.rb
CHANGED
@@ -1,256 +1,2 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
end
|
4
|
-
|
5
|
-
require 'mysql'
|
6
|
-
|
7
|
-
# Monkey patch Mysql::Result to yield hashes with symbol keys
|
8
|
-
class Mysql::Result
|
9
|
-
MYSQL_TYPES = {
|
10
|
-
0 => :to_d, # MYSQL_TYPE_DECIMAL
|
11
|
-
1 => :to_i, # MYSQL_TYPE_TINY
|
12
|
-
2 => :to_i, # MYSQL_TYPE_SHORT
|
13
|
-
3 => :to_i, # MYSQL_TYPE_LONG
|
14
|
-
4 => :to_f, # MYSQL_TYPE_FLOAT
|
15
|
-
5 => :to_f, # MYSQL_TYPE_DOUBLE
|
16
|
-
# 6 => ??, # MYSQL_TYPE_NULL
|
17
|
-
7 => :to_time, # MYSQL_TYPE_TIMESTAMP
|
18
|
-
8 => :to_i, # MYSQL_TYPE_LONGLONG
|
19
|
-
9 => :to_i, # MYSQL_TYPE_INT24
|
20
|
-
10 => :to_time, # MYSQL_TYPE_DATE
|
21
|
-
11 => :to_time, # MYSQL_TYPE_TIME
|
22
|
-
12 => :to_time, # MYSQL_TYPE_DATETIME
|
23
|
-
13 => :to_i, # MYSQL_TYPE_YEAR
|
24
|
-
14 => :to_time, # MYSQL_TYPE_NEWDATE
|
25
|
-
# 15 => :to_s # MYSQL_TYPE_VARCHAR
|
26
|
-
# 16 => :to_s, # MYSQL_TYPE_BIT
|
27
|
-
246 => :to_d, # MYSQL_TYPE_NEWDECIMAL
|
28
|
-
247 => :to_i, # MYSQL_TYPE_ENUM
|
29
|
-
248 => :to_i # MYSQL_TYPE_SET
|
30
|
-
# 249 => :to_s, # MYSQL_TYPE_TINY_BLOB
|
31
|
-
# 250 => :to_s, # MYSQL_TYPE_MEDIUM_BLOB
|
32
|
-
# 251 => :to_s, # MYSQL_TYPE_LONG_BLOB
|
33
|
-
# 252 => :to_s, # MYSQL_TYPE_BLOB
|
34
|
-
# 253 => :to_s, # MYSQL_TYPE_VAR_STRING
|
35
|
-
# 254 => :to_s, # MYSQL_TYPE_STRING
|
36
|
-
# 255 => :to_s # MYSQL_TYPE_GEOMETRY
|
37
|
-
}
|
38
|
-
|
39
|
-
def convert_type(v, type)
|
40
|
-
v ? ((t = MYSQL_TYPES[type]) ? v.send(t) : v) : nil
|
41
|
-
end
|
42
|
-
|
43
|
-
def columns(with_table = nil)
|
44
|
-
unless @columns
|
45
|
-
@column_types = []
|
46
|
-
@columns = fetch_fields.map do |f|
|
47
|
-
@column_types << f.type
|
48
|
-
(with_table ? (f.table + "." + f.name) : f.name).to_sym
|
49
|
-
end
|
50
|
-
end
|
51
|
-
@columns
|
52
|
-
end
|
53
|
-
|
54
|
-
def each_array(with_table = nil)
|
55
|
-
c = columns
|
56
|
-
while row = fetch_row
|
57
|
-
c.each_with_index do |f, i|
|
58
|
-
if (t = MYSQL_TYPES[@column_types[i]]) && (v = row[i])
|
59
|
-
row[i] = v.send(t)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
row.keys = c
|
63
|
-
yield row
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def each_hash(with_table = nil)
|
68
|
-
c = columns
|
69
|
-
while row = fetch_row
|
70
|
-
h = {}
|
71
|
-
c.each_with_index {|f, i| h[f] = convert_type(row[i], @column_types[i])}
|
72
|
-
yield h
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
module Sequel
|
78
|
-
module MySQL
|
79
|
-
class Database < Sequel::Database
|
80
|
-
set_adapter_scheme :mysql
|
81
|
-
|
82
|
-
def serial_primary_key_options
|
83
|
-
{:primary_key => true, :type => :integer, :auto_increment => true}
|
84
|
-
end
|
85
|
-
|
86
|
-
AUTO_INCREMENT = 'AUTO_INCREMENT'.freeze
|
87
|
-
|
88
|
-
def auto_increment_sql
|
89
|
-
AUTO_INCREMENT
|
90
|
-
end
|
91
|
-
|
92
|
-
def connect
|
93
|
-
conn = Mysql.real_connect(@opts[:host], @opts[:user], @opts[:password],
|
94
|
-
@opts[:database], @opts[:port], nil, Mysql::CLIENT_MULTI_RESULTS)
|
95
|
-
conn.query_with_result = false
|
96
|
-
if encoding = @opts[:encoding] || @opts[:charset]
|
97
|
-
conn.query("set character_set_connection = '#{encoding}'")
|
98
|
-
conn.query("set character_set_client = '#{encoding}'")
|
99
|
-
conn.query("set character_set_results = '#{encoding}'")
|
100
|
-
end
|
101
|
-
conn.reconnect = true
|
102
|
-
conn
|
103
|
-
end
|
104
|
-
|
105
|
-
def disconnect
|
106
|
-
@pool.disconnect {|c| c.close}
|
107
|
-
end
|
108
|
-
|
109
|
-
def tables
|
110
|
-
@pool.hold do |conn|
|
111
|
-
conn.list_tables.map {|t| t.to_sym}
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
def dataset(opts = nil)
|
116
|
-
MySQL::Dataset.new(self, opts)
|
117
|
-
end
|
118
|
-
|
119
|
-
def execute(sql)
|
120
|
-
@logger.info(sql) if @logger
|
121
|
-
@pool.hold do |conn|
|
122
|
-
conn.query(sql)
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
def execute_select(sql)
|
127
|
-
@logger.info(sql) if @logger
|
128
|
-
@pool.hold do |conn|
|
129
|
-
conn.query(sql)
|
130
|
-
conn.use_result
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
def execute_insert(sql)
|
135
|
-
@logger.info(sql) if @logger
|
136
|
-
@pool.hold do |conn|
|
137
|
-
conn.query(sql)
|
138
|
-
conn.insert_id
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
def execute_affected(sql)
|
143
|
-
@logger.info(sql) if @logger
|
144
|
-
@pool.hold do |conn|
|
145
|
-
conn.query(sql)
|
146
|
-
conn.affected_rows
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
def transaction
|
151
|
-
@pool.hold do |conn|
|
152
|
-
@transactions ||= []
|
153
|
-
if @transactions.include? Thread.current
|
154
|
-
return yield(conn)
|
155
|
-
end
|
156
|
-
conn.query(SQL_BEGIN)
|
157
|
-
begin
|
158
|
-
@transactions << Thread.current
|
159
|
-
result = yield(conn)
|
160
|
-
conn.query(SQL_COMMIT)
|
161
|
-
result
|
162
|
-
rescue => e
|
163
|
-
conn.query(SQL_ROLLBACK)
|
164
|
-
raise e unless SequelRollbackError === e
|
165
|
-
ensure
|
166
|
-
@transactions.delete(Thread.current)
|
167
|
-
end
|
168
|
-
end
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
class Dataset < Sequel::Dataset
|
173
|
-
def quote_column_ref(c); "`#{c}`"; end
|
174
|
-
|
175
|
-
TRUE = '1'
|
176
|
-
FALSE = '0'
|
177
|
-
|
178
|
-
def literal(v)
|
179
|
-
case v
|
180
|
-
when LiteralString: v
|
181
|
-
when String: "'#{v.gsub(/'|\\/, '\&\&')}'"
|
182
|
-
when true: TRUE
|
183
|
-
when false: FALSE
|
184
|
-
else
|
185
|
-
super
|
186
|
-
end
|
187
|
-
end
|
188
|
-
|
189
|
-
def match_expr(l, r)
|
190
|
-
case r
|
191
|
-
when Regexp:
|
192
|
-
r.casefold? ? \
|
193
|
-
"(#{literal(l)} REGEXP #{literal(r.source)})" :
|
194
|
-
"(#{literal(l)} REGEXP BINARY #{literal(r.source)})"
|
195
|
-
else
|
196
|
-
super
|
197
|
-
end
|
198
|
-
end
|
199
|
-
|
200
|
-
# MySQL supports ORDER and LIMIT clauses in UPDATE statements.
|
201
|
-
def update_sql(values, opts = nil)
|
202
|
-
sql = super
|
203
|
-
|
204
|
-
opts = opts ? @opts.merge(opts) : @opts
|
205
|
-
|
206
|
-
if order = opts[:order]
|
207
|
-
sql << " ORDER BY #{column_list(order)}"
|
208
|
-
end
|
209
|
-
|
210
|
-
if limit = opts[:limit]
|
211
|
-
sql << " LIMIT #{limit}"
|
212
|
-
end
|
213
|
-
|
214
|
-
sql
|
215
|
-
end
|
216
|
-
|
217
|
-
def insert(*values)
|
218
|
-
@db.execute_insert(insert_sql(*values))
|
219
|
-
end
|
220
|
-
|
221
|
-
def update(values, opts = nil)
|
222
|
-
@db.execute_affected(update_sql(values, opts))
|
223
|
-
end
|
224
|
-
|
225
|
-
def delete(opts = nil)
|
226
|
-
@db.execute_affected(delete_sql(opts))
|
227
|
-
end
|
228
|
-
|
229
|
-
def fetch_rows(sql)
|
230
|
-
@db.synchronize do
|
231
|
-
r = @db.execute_select(sql)
|
232
|
-
begin
|
233
|
-
@columns = r.columns
|
234
|
-
r.each_hash {|row| yield row}
|
235
|
-
ensure
|
236
|
-
r.free
|
237
|
-
end
|
238
|
-
end
|
239
|
-
self
|
240
|
-
end
|
241
|
-
|
242
|
-
def array_tuples_fetch_rows(sql, &block)
|
243
|
-
@db.synchronize do
|
244
|
-
r = @db.execute_select(sql)
|
245
|
-
begin
|
246
|
-
@columns = r.columns
|
247
|
-
r.each_array(&block)
|
248
|
-
ensure
|
249
|
-
r.free
|
250
|
-
end
|
251
|
-
end
|
252
|
-
self
|
253
|
-
end
|
254
|
-
end
|
255
|
-
end
|
256
|
-
end
|
1
|
+
warn "Requiring 'sequel/mysql' is deprecated. Please modify your code to require 'sequel' instead."
|
2
|
+
require File.join(File.dirname(__FILE__), 'adapters/mysql')
|