swift 1.0.2 → 1.0.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/API.rdoc CHANGED
@@ -13,18 +13,26 @@ Public API minus the optional stuff like Pool, IdentityMap, Migrations etc.
13
13
  # Abstract.
14
14
  Adapter
15
15
  .new #=> Adapter
16
- #begin #=> Adapter
17
- #commit
18
16
  #create #=> Record or Result
19
17
  #delete #=> Result
20
18
  #execute #=> Result
21
- #async_execute #=> Result
22
19
  #get #=> Record
23
20
  #prepare #=> Statement
21
+ #update #=> Record or Result
22
+
23
+ # Adapter::Sql
24
+ #begin
25
+ #commit
24
26
  #rollback
25
27
  #transaction #=> Adapter
26
- #update #=> Record or Result
27
- #reconnect
28
+ #ping #=> true or false
29
+ #close #=> true or false
30
+ #closed? #=> true or false
31
+ #escape #=> String
32
+ #query
33
+ #fileno #=> Integer
34
+ #result #=> Result
35
+ #write #=> Result
28
36
 
29
37
  # Concrete.
30
38
  DB
@@ -34,17 +42,16 @@ Public API minus the optional stuff like Pool, IdentityMap, Migrations etc.
34
42
 
35
43
  # Enumerable collection of Record or Hash tuples.
36
44
  Result
37
- .new #=> Result
38
- #insert_id #=> Numeric
39
- #fields #=> [Symbol, ...] # Field names identical to .first.keys if rows > 0
40
- #field_types #=> [String, ...] # Type names: boolean, integer, float, numeric, timestamp, date, time, blob, text
41
- #rows #=> Fixnum
42
- #columns #=> Fixnum
45
+ .new #=> Result
46
+ #insert_id #=> Numeric
47
+ #fields #=> [Symbol, ...] # Field names identical to .first.keys if rows > 0
48
+ #types #=> [String, ...] # Type names: boolean, integer, float, numeric, timestamp, date, time, blob, text
49
+ #selected_rows #=> Fixnum
50
+ #affected_rows #=> Fixnum
43
51
 
44
52
  Statement
45
53
  .new #=> Statement
46
54
  #execute #=> Result
47
- #command #=> String # The SQL command executed or to be executed
48
55
 
49
56
  Record
50
57
  .attribute #=> Type
data/README.md CHANGED
@@ -236,25 +236,26 @@ creating temporary files.
236
236
 
237
237
  ### Asynchronous API
238
238
 
239
- `Swift::Adapter#async_execute` returns a `Swift::Result` instance. You can either poll the corresponding
240
- `Swift::Adapter#fileno` and then call `Swift::Result#retrieve` when ready or use a block form like below
239
+ `Swift::Adapter::Sql#query` runs a query asynchronously. You can either poll the corresponding
240
+ `Swift::Adapter::Sql#fileno` and then call `Swift::Adapter::Sql#result` when ready or use a block form like below
241
241
  which implicitly uses `rb_thread_wait_fd`
242
242
 
243
243
  ```ruby
244
244
  require 'swift'
245
+ require 'swift/adapter/postgres'
245
246
 
246
247
  pool = 3.times.map.with_index {|n| Swift.setup n, Swift::Adapter::Postgres, db: 'swift' }
247
248
 
248
249
  Thread.new do
249
- pool[0].async_execute('select pg_sleep(3), 1 as qid') {|row| p row}
250
+ pool[0].query('select pg_sleep(3), 1 as qid') {|row| p row}
250
251
  end
251
252
 
252
253
  Thread.new do
253
- pool[1].async_execute('select pg_sleep(2), 2 as qid') {|row| p row}
254
+ pool[1].query('select pg_sleep(2), 2 as qid') {|row| p row}
254
255
  end
255
256
 
256
257
  Thread.new do
257
- pool[2].async_execute('select pg_sleep(1), 3 as qid') {|row| p row}
258
+ pool[2].query('select pg_sleep(1), 3 as qid') {|row| p row}
258
259
  end
259
260
 
260
261
  Thread.list.reject {|thread| Thread.current == thread}.each(&:join)
@@ -264,6 +265,7 @@ or use the `swift/eventmachine` api.
264
265
 
265
266
  ```ruby
266
267
  require 'swift/eventmachine'
268
+ require 'swift/adapter/postgres'
267
269
 
268
270
  EM.run do
269
271
  pool = 3.times.map { Swift.setup(:default, Swift::Adapter::Postgres, db: "swift") }
@@ -286,6 +288,7 @@ or use the `em-synchrony` api for `swift`
286
288
 
287
289
  ```ruby
288
290
  require 'swift/synchrony'
291
+ require 'swift/adapter/postgres'
289
292
 
290
293
  EM.run do
291
294
  3.times.each do |n|
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.2
1
+ 1.0.3
data/lib/swift.rb CHANGED
@@ -1,12 +1,3 @@
1
- # try to require home_run in older rubies
2
- unless %r{^1\.9\.[3-9]|^2\.}.match(RUBY_VERSION)
3
- begin
4
- require 'home_run'
5
- rescue LoadError => e
6
- warn "WARNING: DateTime parsing will be slow without home_run gem on Rubies older than 1.9.3"
7
- end
8
- end
9
-
10
1
  # Extension.
11
2
  require_relative 'swift/adapter'
12
3
  require_relative 'swift/adapter/sql'
@@ -75,7 +66,6 @@ module Swift
75
66
  # @option options [Integer] :port (DB default)
76
67
  # @return [Swift::Adapter]
77
68
  #
78
- # @see Swift::DB
79
69
  # @see Swift::Adapter
80
70
  def setup name, type, options = {}
81
71
  unless type.kind_of?(Class) && type < Swift::Adapter
@@ -103,9 +93,8 @@ module Swift
103
93
  #--
104
94
  # I pilfered the logic from DM but I don't really understand what is/isn't thread safe.
105
95
  def db name = nil, &block
106
- scopes = (Thread.current[:swift_db] ||= [])
107
96
  repository = if name || scopes.empty?
108
- @repositories[name || :default] or raise "Unknown db '#{name || :default}', did you forget to #setup?"
97
+ @repositories[name || :default] or raise "Unknown db '#{name || :default}', did you forget to #setup ?"
109
98
  else
110
99
  scopes.last
111
100
  end
@@ -133,5 +122,12 @@ module Swift
133
122
  def trace io = $stdout, &block
134
123
  Swift.db.trace(io, &block)
135
124
  end
125
+
126
+ def scopes
127
+ Thread.current[:swift_db] ||= []
128
+ end
136
129
  end
130
+
131
+ class Error < StandardError; end
132
+ class RuntimeError < Error; end
137
133
  end # Swift
data/lib/swift/adapter.rb CHANGED
@@ -222,7 +222,9 @@ module Swift
222
222
  private
223
223
 
224
224
  def log_command start, command, bind
225
- @trace.print Time.now.strftime('%F %T.%N'), ' - ', (Time.now - start).to_f, ' - ', command, ' ', bind, $/
225
+ @trace.print Time.now.strftime('%F %T.%N'), ' - %.9f' % (Time.now - start).to_f, ' - ', command
226
+ @trace.print ' ', bind if bind && bind.size > 0
227
+ @trace.print $/
226
228
  end
227
229
  end # Adapter
228
230
  end # Swift
@@ -17,6 +17,7 @@ module Swift
17
17
 
18
18
  def notify_readable
19
19
  detach
20
+ @adapter.pending.shift
20
21
  begin
21
22
  @defer.succeed(@record ? Result.new(@record, @adapter.result) : @adapter.result)
22
23
  rescue Exception => e
@@ -38,12 +39,20 @@ module Swift
38
39
  #
39
40
  # @see [Swift::Adapter]
40
41
  def execute command, *bind
41
- start = Time.now
42
+ raise RuntimeError, 'Command already in progress' unless pending.empty?
43
+
44
+ pending << command
45
+ start = Time.now
42
46
  record, command = command, bind.shift if command.kind_of?(Class) && command < Record
43
47
  query(command, *bind)
48
+
44
49
  EM::DefaultDeferrable.new.tap do |defer|
45
50
  EM.watch(fileno, EMHandler, self, record, defer) {|c| c.notify_readable = true }
46
51
  end
47
52
  end
53
+
54
+ def pending
55
+ @pending ||= []
56
+ end
48
57
  end
49
58
  end
@@ -34,8 +34,8 @@ module Swift
34
34
  #
35
35
  # @see Swift::Adapter::Sql
36
36
  def migrate! record
37
- keys = record.header.keys
38
- fields = record.header.map{|p| field_definition(p)}.join(', ')
37
+ keys = record.header.keys
38
+ fields = record.header.map{|p| field_definition(p)}.join(', ')
39
39
  fields += ", primary key (#{keys.join(', ')})" unless keys.empty?
40
40
 
41
41
  execute("drop table if exists #{record.store} cascade")
@@ -45,7 +45,7 @@ module Swift
45
45
  end # Migrations
46
46
 
47
47
  def self.migrate! name = nil
48
- schema.each{|record| record.migrate!(db(name)) }
48
+ schema.each {|record| record.migrate!(db(name))}
49
49
  end
50
50
 
51
51
  class Record
@@ -30,9 +30,6 @@ module Swift
30
30
  raise res if res.kind_of?(Error)
31
31
  yield res if block_given?
32
32
  res
33
- rescue => e
34
- $stderr.puts e, e.backtrace.join($/)
35
- nil
36
33
  end
37
34
  end
38
35
  end
data/swift.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "swift"
8
- s.version = "1.0.2"
8
+ s.version = "1.0.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Shane Hanna", "Bharanee 'Barney' Rathna"]
12
- s.date = "2012-08-24"
12
+ s.date = "2012-09-21"
13
13
  s.description = "A rational rudimentary database abstraction."
14
14
  s.email = ["shane.hanna@gmail.com", "deepfryed@gmail.com"]
15
15
  s.extra_rdoc_files = [
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: swift
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-08-24 00:00:00.000000000 Z
13
+ date: 2012-09-21 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: minitest