sequel 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
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