sequel 0.1.2 → 0.1.3

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 CHANGED
@@ -1,3 +1,9 @@
1
+ *0.1.3*
2
+
3
+ * Implemented DBI adapter.
4
+
5
+ * Refactored database connection code. Now handled through Database#connect.
6
+
1
7
  *0.1.2*
2
8
 
3
9
  * The first opened database is automatically assigned to to Model.db.
data/README CHANGED
@@ -30,7 +30,8 @@ Sequel currently supports:
30
30
 
31
31
  * Postgresql
32
32
  * SQLite 3
33
- * MySQL (preliminary support)
33
+ * DBI
34
+ * MySQL (basic support)
34
35
 
35
36
  == The Sequel Console
36
37
 
data/Rakefile CHANGED
@@ -6,7 +6,7 @@ require 'fileutils'
6
6
  include FileUtils
7
7
 
8
8
  NAME = "sequel"
9
- VERS = "0.1.2"
9
+ VERS = "0.1.3"
10
10
  CLEAN.include ['**/.*.sw?', 'pkg/*', '.config', 'doc/*', 'coverage/*']
11
11
  RDOC_OPTS = ['--quiet', '--title', "Sequel: Concise ORM for Ruby",
12
12
  "--opname", "index.html",
@@ -20,6 +20,11 @@ module Sequel
20
20
  @opts = opts
21
21
  @pool = ConnectionPool.new(@opts[:max_connections] || 4, &block)
22
22
  @logger = opts[:logger]
23
+ @pool.connection_proc = block || proc {connect}
24
+ end
25
+
26
+ def connect
27
+ true # we can't return nil or false, because then pool will block forever
23
28
  end
24
29
 
25
30
  def uri
@@ -0,0 +1,80 @@
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
+
10
+ class Database < Sequel::Database
11
+ set_adapter_scheme :dbi
12
+
13
+ def connect
14
+ dbname = @opts[:database] =~ /^DBI:/ ? \
15
+ @opts[:database] : @opts[:database] = 'DBI:' + @opts[:database]
16
+ ::DBI.connect(dbname, @opts[:user], @opts[:password])
17
+ end
18
+
19
+ def dataset(opts = nil)
20
+ DBI::Dataset.new(self, opts)
21
+ end
22
+
23
+ def execute(sql)
24
+ @logger.info(sql) if @logger
25
+ @pool.hold do |conn|
26
+ conn.execute(sql)
27
+ end
28
+ end
29
+
30
+ def do(sql)
31
+ @logger.info(sql) if @logger
32
+ @pool.hold do |conn|
33
+ conn.do(sql)
34
+ end
35
+ end
36
+ end
37
+
38
+ class Dataset < Sequel::Dataset
39
+ def literal(v)
40
+ case v
41
+ when Time: literal(v.iso8601)
42
+ else
43
+ super
44
+ end
45
+ end
46
+
47
+ def each(opts = nil, &block)
48
+ @db.synchronize do
49
+ s = @db.execute select_sql(opts)
50
+ begin
51
+ s.fetch {|r| yield hash_row(s, r)}
52
+ ensure
53
+ s.finish rescue nil
54
+ end
55
+ end
56
+ self
57
+ end
58
+
59
+ def hash_row(stmt, row)
60
+ stmt.column_names.inject({}) do |m, n|
61
+ m[n.to_sym] = row.shift
62
+ m
63
+ end
64
+ end
65
+
66
+ def insert(*values)
67
+ @db.do insert_sql(*values)
68
+ end
69
+
70
+ def update(values, opts = nil)
71
+ @db.do update_sql(values, opts)
72
+ self
73
+ end
74
+
75
+ def delete(opts = nil)
76
+ @db.do delete_sql(opts)
77
+ end
78
+ end
79
+ end
80
+ end
@@ -2,7 +2,7 @@ if !Object.const_defined?('Sequel')
2
2
  require File.join(File.dirname(__FILE__), '../sequel')
3
3
  end
4
4
 
5
- #require 'mysql'
5
+ require 'mysql'
6
6
 
7
7
  module Sequel
8
8
  module MySQL
@@ -10,12 +10,9 @@ module Sequel
10
10
  class Database < Sequel::Database
11
11
  set_adapter_scheme :mysql
12
12
 
13
- def initialize(opts = {})
14
- super
15
- @pool.connection_proc = proc do
16
- Mysql.real_connect(@opts[:host], @opts[:user], @opts[:password],
17
- @opts[:database], @opts[:port])
18
- end
13
+ def connect
14
+ Mysql.real_connect(@opts[:host], @opts[:user], @opts[:password],
15
+ @opts[:database], @opts[:port])
19
16
  end
20
17
 
21
18
  def dataset(opts = nil)
@@ -35,30 +35,8 @@ class PGconn
35
35
  end
36
36
  end
37
37
 
38
- attr_reader :transaction_in_progress
38
+ attr_accessor :transaction_in_progress
39
39
 
40
- SQL_BEGIN = 'BEGIN'.freeze
41
- SQL_COMMIT = 'COMMIT'.freeze
42
- SQL_ROLLBACK = 'ROLLBACK'.freeze
43
-
44
- def transaction
45
- if @transaction_in_progress
46
- return yield
47
- end
48
- async_exec(SQL_BEGIN)
49
- begin
50
- @transaction_in_progress = true
51
- result = yield
52
- async_exec(SQL_COMMIT)
53
- result
54
- rescue => e
55
- async_exec(SQL_ROLLBACK)
56
- raise e
57
- ensure
58
- @transaction_in_progress = nil
59
- end
60
- end
61
-
62
40
  SELECT_CURRVAL = "SELECT currval('%s')".freeze
63
41
 
64
42
  def last_insert_id(table)
@@ -140,21 +118,17 @@ module Sequel
140
118
  class Database < Sequel::Database
141
119
  set_adapter_scheme :postgres
142
120
 
143
- def initialize(opts = {})
144
- super
145
- @pool.connection_proc = proc do
146
- PGconn.connect(
147
- @opts[:host] || 'localhost',
148
- @opts[:port] || 5432,
149
- '', '',
150
- @opts[:database],
151
- @opts[:user],
152
- @opts[:password]
153
- )
154
- end
121
+ def connect
122
+ PGconn.connect(
123
+ @opts[:host] || 'localhost',
124
+ @opts[:port] || 5432,
125
+ '', '',
126
+ @opts[:database],
127
+ @opts[:user],
128
+ @opts[:password]
129
+ )
155
130
  end
156
131
 
157
-
158
132
  def dataset(opts = nil)
159
133
  Postgres::Dataset.new(self, opts)
160
134
  end
@@ -177,11 +151,17 @@ module Sequel
177
151
  def execute(sql)
178
152
  @logger.info(sql) if @logger
179
153
  @pool.hold {|conn| conn.execute(sql)}
154
+ rescue => e
155
+ @logger.error(e.message) if @logger
156
+ raise e
180
157
  end
181
158
 
182
159
  def execute_and_forget(sql)
183
160
  @logger.info(sql) if @logger
184
161
  @pool.hold {|conn| conn.execute(sql).clear}
162
+ rescue => e
163
+ @logger.error(e.message) if @logger
164
+ raise e
185
165
  end
186
166
 
187
167
  def execute_insert(sql, table)
@@ -190,15 +170,48 @@ module Sequel
190
170
  conn.execute(sql).clear
191
171
  conn.last_insert_id(table)
192
172
  end
173
+ rescue => e
174
+ @logger.error(e.message) if @logger
175
+ raise e
193
176
  end
194
177
 
195
178
  def synchronize(&block)
196
179
  @pool.hold(&block)
197
180
  end
198
181
 
199
- def transaction(&block)
200
- @pool.hold {|conn| conn.transaction(&block)}
182
+ SQL_BEGIN = 'BEGIN'.freeze
183
+ SQL_COMMIT = 'COMMIT'.freeze
184
+ SQL_ROLLBACK = 'ROLLBACK'.freeze
185
+
186
+ def transaction
187
+ @pool.hold do |conn|
188
+ if conn.transaction_in_progress
189
+ yield conn
190
+ else
191
+ @logger.info(SQL_BEGIN) if @logger
192
+ conn.async_exec(SQL_BEGIN)
193
+ begin
194
+ conn.transaction_in_progress = true
195
+ result = yield
196
+ begin
197
+ @logger.info(SQL_COMMIT) if @logger
198
+ conn.async_exec(SQL_COMMIT)
199
+ rescue => e
200
+ @logger.error(e.message) if @logger
201
+ raise e
202
+ end
203
+ result
204
+ rescue => e
205
+ @logger.info(SQL_ROLLBACK) if @logger
206
+ conn.async_exec(SQL_ROLLBACK) rescue nil
207
+ raise e
208
+ ensure
209
+ conn.transaction_in_progress = nil
210
+ end
211
+ end
212
+ end
201
213
  end
214
+
202
215
  end
203
216
 
204
217
  class Dataset < Sequel::Dataset
@@ -10,13 +10,10 @@ module Sequel
10
10
  class Database < Sequel::Database
11
11
  set_adapter_scheme :sqlite
12
12
 
13
- def initialize(opts = {})
14
- super
15
- @pool.connection_proc = proc do
16
- db = SQLite3::Database.new(@opts[:database])
17
- db.type_translation = true
18
- db
19
- end
13
+ def connect
14
+ db = SQLite3::Database.new(@opts[:database])
15
+ db.type_translation = true
16
+ db
20
17
  end
21
18
 
22
19
  def dataset(opts = nil)
metadata CHANGED
@@ -1,10 +1,10 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.0
2
+ rubygems_version: 0.9.2
3
3
  specification_version: 1
4
4
  name: sequel
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.1.2
7
- date: 2007-05-19 00:00:00 +03:00
6
+ version: 0.1.3
7
+ date: 2007-05-20 00:00:00 +03:00
8
8
  summary: Concise ORM for Ruby.
9
9
  require_paths:
10
10
  - lib
@@ -34,19 +34,20 @@ files:
34
34
  - Rakefile
35
35
  - bin/sequel
36
36
  - lib/sequel
37
- - lib/sequel.rb
38
- - lib/sequel/connection_pool.rb
39
- - lib/sequel/core_ext.rb
37
+ - lib/sequel/pretty_table.rb
38
+ - lib/sequel/model.rb
39
+ - lib/sequel/schema.rb
40
+ - lib/sequel/sqlite.rb
40
41
  - lib/sequel/database.rb
41
42
  - lib/sequel/dataset.rb
42
- - lib/sequel/error.rb
43
- - lib/sequel/expressions.rb
44
- - lib/sequel/model.rb
45
43
  - lib/sequel/mysql.rb
46
44
  - lib/sequel/postgres.rb
47
- - lib/sequel/pretty_table.rb
48
- - lib/sequel/schema.rb
49
- - lib/sequel/sqlite.rb
45
+ - lib/sequel/connection_pool.rb
46
+ - lib/sequel/core_ext.rb
47
+ - lib/sequel/error.rb
48
+ - lib/sequel/expressions.rb
49
+ - lib/sequel/dbi.rb
50
+ - lib/sequel.rb
50
51
  - CHANGELOG
51
52
  test_files: []
52
53