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.
Files changed (48) hide show
  1. data/CHANGELOG +4 -0
  2. data/README +1 -6
  3. data/Rakefile +1 -1
  4. data/bin/sequel +1 -3
  5. data/lib/sequel.rb +18 -1
  6. data/lib/sequel/adapters/ado.rb +104 -0
  7. data/lib/sequel/adapters/db2.rb +160 -0
  8. data/lib/sequel/adapters/dbi.rb +130 -0
  9. data/lib/sequel/adapters/informix.rb +78 -0
  10. data/lib/sequel/adapters/mysql.rb +256 -0
  11. data/lib/sequel/adapters/odbc.rb +144 -0
  12. data/lib/sequel/adapters/oracle.rb +109 -0
  13. data/lib/sequel/adapters/postgres.rb +507 -0
  14. data/lib/sequel/adapters/sqlite.rb +186 -0
  15. data/lib/sequel/ado.rb +2 -104
  16. data/lib/{sequel-core → sequel}/array_keys.rb +0 -0
  17. data/lib/{sequel-core → sequel}/connection_pool.rb +0 -0
  18. data/lib/{sequel-core → sequel}/core_ext.rb +0 -0
  19. data/lib/{sequel-core → sequel}/core_sql.rb +0 -0
  20. data/lib/{sequel-core → sequel}/database.rb +10 -20
  21. data/lib/{sequel-core → sequel}/dataset.rb +0 -0
  22. data/lib/{sequel-core → sequel}/dataset/convenience.rb +0 -0
  23. data/lib/{sequel-core → sequel}/dataset/sequelizer.rb +0 -0
  24. data/lib/{sequel-core → sequel}/dataset/sql.rb +0 -0
  25. data/lib/sequel/db2.rb +2 -160
  26. data/lib/sequel/dbi.rb +2 -130
  27. data/lib/{sequel-core → sequel}/error.rb +0 -0
  28. data/lib/sequel/informix.rb +2 -78
  29. data/lib/{sequel-core → sequel}/migration.rb +0 -0
  30. data/lib/{sequel-core → sequel}/model.rb +0 -0
  31. data/lib/{sequel-core → sequel}/model/base.rb +0 -0
  32. data/lib/{sequel-core → sequel}/model/caching.rb +0 -0
  33. data/lib/{sequel-core → sequel}/model/hooks.rb +0 -0
  34. data/lib/{sequel-core → sequel}/model/record.rb +0 -0
  35. data/lib/{sequel-core → sequel}/model/relations.rb +0 -0
  36. data/lib/{sequel-core → sequel}/model/schema.rb +0 -0
  37. data/lib/sequel/mysql.rb +2 -256
  38. data/lib/sequel/odbc.rb +2 -144
  39. data/lib/sequel/oracle.rb +2 -109
  40. data/lib/sequel/postgres.rb +2 -507
  41. data/lib/{sequel-core → sequel}/pretty_table.rb +0 -0
  42. data/lib/{sequel-core → sequel}/schema.rb +0 -0
  43. data/lib/{sequel-core → sequel}/schema/schema_generator.rb +0 -0
  44. data/lib/{sequel-core → sequel}/schema/schema_sql.rb +0 -0
  45. data/lib/sequel/sqlite.rb +2 -186
  46. data/lib/{sequel-core → sequel}/worker.rb +0 -0
  47. data/spec/database_spec.rb +7 -9
  48. metadata +39 -29
data/lib/sequel/dbi.rb CHANGED
@@ -1,130 +1,2 @@
1
- if !Object.const_defined?('Sequel')
2
- require File.join(File.dirname(__FILE__), '../sequel')
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
@@ -1,78 +1,2 @@
1
- if !Object.const_defined?('Sequel')
2
- require File.join(File.dirname(__FILE__), '../sequel')
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
- if !Object.const_defined?('Sequel')
2
- require File.join(File.dirname(__FILE__), '../sequel')
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')