swift 0.6.1 → 0.7.0
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 +1 -0
- data/README.rdoc +60 -22
- data/VERSION +1 -1
- data/examples/scheme.rb +1 -1
- data/ext/adapter.cc +12 -8
- data/ext/attribute.cc +22 -0
- data/ext/attribute.h +8 -0
- data/ext/extconf.rb +1 -1
- data/ext/pool.cc +20 -13
- data/ext/query.cc +21 -1
- data/ext/query.h +2 -1
- data/ext/result.cc +136 -85
- data/ext/result.h +14 -4
- data/ext/statement.cc +38 -11
- data/ext/statement.h +11 -1
- data/ext/swift.cc +19 -7
- data/ext/swift.h +1 -0
- data/lib/swift/adapter.rb +12 -3
- data/lib/swift/attribute.rb +7 -15
- data/lib/swift/db.rb +41 -2
- data/lib/swift/pool.rb +10 -5
- data/lib/swift/type.rb +1 -1
- data/swift.gemspec +4 -2
- data/test/helper.rb +6 -5
- data/test/test_adapter.rb +83 -86
- data/test/test_encoding.rb +3 -3
- data/test/test_io.rb +1 -1
- data/test/test_pool.rb +19 -15
- data/test/test_scheme.rb +1 -1
- data/test/test_timestamps.rb +20 -3
- data/test/test_transactions.rb +37 -14
- data/test/test_types.rb +17 -3
- metadata +6 -4
data/lib/swift/pool.rb
CHANGED
@@ -17,12 +17,19 @@ module Swift
|
|
17
17
|
@pool.detach self
|
18
18
|
end
|
19
19
|
end
|
20
|
+
|
21
|
+
def notify_writable
|
22
|
+
notify_readable
|
23
|
+
end
|
20
24
|
end # Handler
|
21
25
|
|
22
26
|
|
23
27
|
def initialize size, options
|
24
28
|
@pool = Swift::DB::Pool.new size, options
|
25
|
-
|
29
|
+
|
30
|
+
# TODO move driver specific options to extension.
|
31
|
+
@writable = options[:driver] == 'db2'
|
32
|
+
|
26
33
|
@pending = {}
|
27
34
|
@queue = []
|
28
35
|
end
|
@@ -33,9 +40,7 @@ module Swift
|
|
33
40
|
|
34
41
|
def detach c
|
35
42
|
@pending.delete(c)
|
36
|
-
|
37
|
-
EM.stop if @stop_reactor && @pending.empty?
|
38
|
-
else
|
43
|
+
unless @queue.empty?
|
39
44
|
sql, bind, callback = @queue.shift
|
40
45
|
execute(sql, *bind, &callback)
|
41
46
|
end
|
@@ -54,7 +59,7 @@ module Swift
|
|
54
59
|
if request && !attached?(request.socket)
|
55
60
|
EM.watch(request.socket, Handler, request, self) do |c|
|
56
61
|
attach c
|
57
|
-
c.notify_writable =
|
62
|
+
c.notify_writable = @writable
|
58
63
|
c.notify_readable = true
|
59
64
|
end
|
60
65
|
else
|
data/lib/swift/type.rb
CHANGED
data/swift.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{swift}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.7.0"
|
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 = %q{2010-09-
|
12
|
+
s.date = %q{2010-09-20}
|
13
13
|
s.description = %q{A rational rudimentary database abstraction.}
|
14
14
|
s.email = ["shane.hanna@gmail.com", "deepfryed@gmail.com"]
|
15
15
|
s.extensions = ["ext/extconf.rb"]
|
@@ -25,6 +25,8 @@ Gem::Specification.new do |s|
|
|
25
25
|
"VERSION",
|
26
26
|
"ext/adapter.cc",
|
27
27
|
"ext/adapter.h",
|
28
|
+
"ext/attribute.cc",
|
29
|
+
"ext/attribute.h",
|
28
30
|
"ext/extconf.rb",
|
29
31
|
"ext/iostream.cc",
|
30
32
|
"ext/iostream.h",
|
data/test/helper.rb
CHANGED
@@ -3,23 +3,24 @@ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
3
3
|
require 'minitest/spec'
|
4
4
|
require 'minitest/unit'
|
5
5
|
require 'swift'
|
6
|
+
require 'etc'
|
6
7
|
|
7
|
-
|
8
|
-
end
|
8
|
+
# db2 database name is limited to 8 characters, gonna use swift instead of swift_test
|
9
9
|
|
10
10
|
class MiniTest::Spec
|
11
11
|
def self.supported_by *adapters, &block
|
12
|
+
connection_defaults = { db: 'swift', user: Etc.getlogin, host: '127.0.0.1' }
|
12
13
|
adapters.each do |adapter|
|
13
14
|
begin
|
14
|
-
Swift.setup :default, adapter,
|
15
|
+
Swift.setup :default, adapter, connection_defaults
|
15
16
|
rescue => error
|
16
|
-
warn "Unable to setup '
|
17
|
+
warn "Unable to setup 'swift' db for #{adapter}, #{error.message}. Skipping..."
|
17
18
|
next
|
18
19
|
end
|
19
20
|
|
20
21
|
describe("Adapter #{adapter.name}") do
|
21
22
|
before do
|
22
|
-
Swift.setup :default, adapter,
|
23
|
+
Swift.setup :default, adapter, connection_defaults
|
23
24
|
end
|
24
25
|
block.call(adapter)
|
25
26
|
end
|
data/test/test_adapter.rb
CHANGED
@@ -2,122 +2,119 @@ require_relative 'helper'
|
|
2
2
|
require 'stringio'
|
3
3
|
|
4
4
|
describe 'Adapter' do
|
5
|
-
supported_by Swift::DB::Postgres, Swift::DB::Mysql do
|
5
|
+
supported_by Swift::DB::Postgres, Swift::DB::Mysql, Swift::DB::DB2 do
|
6
6
|
describe 'db' do
|
7
|
+
before do
|
8
|
+
@db = Swift.db
|
9
|
+
@db.execute('drop table users') rescue nil
|
10
|
+
type = case @db
|
11
|
+
when Swift::DB::DB2 then 'integer not null generated by default as identity'
|
12
|
+
else 'serial'
|
13
|
+
end
|
14
|
+
@db.execute %Q{create table users(id #{type}, name varchar(512), email varchar(512), created_at timestamp)}
|
15
|
+
end
|
16
|
+
|
7
17
|
it 'yields db to block' do
|
8
18
|
Swift.db do |db|
|
9
19
|
assert_kind_of Swift::Adapter, db
|
10
20
|
end
|
11
21
|
end
|
12
|
-
end
|
13
22
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
23
|
+
describe 'execute' do
|
24
|
+
it 'executes without bind values' do
|
25
|
+
assert @db.execute %q{select count(*) from users}
|
26
|
+
end
|
18
27
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
assert Swift.db.execute 'insert into users (name, created_at) values (?, now())', 'Benny Arthurton'
|
28
|
+
it 'executes with bind values' do
|
29
|
+
assert @db.execute 'insert into users (name, created_at) values (?, current_timestamp)', 'Benny Arthurton'
|
30
|
+
end
|
23
31
|
end
|
24
|
-
end
|
25
32
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
db.execute
|
30
|
-
|
33
|
+
describe 'prepared statements' do
|
34
|
+
it 'executes via Statement#new' do
|
35
|
+
result = []
|
36
|
+
Swift::Statement.new(@db, 'select count(*) as n from users').execute {|r| result << r[:n] }
|
37
|
+
assert_kind_of Integer, result[0]
|
31
38
|
end
|
32
|
-
end
|
33
39
|
|
34
|
-
|
35
|
-
|
36
|
-
|
40
|
+
it 'executes without bind values' do
|
41
|
+
assert @db.prepare(%q{insert into users (name) values ('Apple Arthurton')}).execute
|
42
|
+
end
|
37
43
|
|
38
|
-
|
39
|
-
|
40
|
-
|
44
|
+
it 'executes with bind values' do
|
45
|
+
assert @db.prepare(%q{insert into users (name) values (?)}).execute('Apple Arthurton')
|
46
|
+
end
|
41
47
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
48
|
+
it 'executes multiple times' do
|
49
|
+
sth = @db.prepare(%q{insert into users (name, created_at) values (?, current_timestamp)})
|
50
|
+
assert sth.execute('Apple Arthurton')
|
51
|
+
assert sth.execute('Benny Arthurton')
|
52
|
+
end
|
47
53
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
54
|
+
it 'has insert_id' do
|
55
|
+
sql = case @db
|
56
|
+
when Swift::DB::Postgres then %q{insert into users (name) values (?) returning id}
|
57
|
+
when Swift::DB::Mysql then %q{insert into users (name) values (?)}
|
58
|
+
when Swift::DB::DB2 then %q{select id from final table(insert into users(name) values(?))}
|
59
|
+
end
|
60
|
+
assert_kind_of Numeric, @db.prepare(sql).execute('Connie Arthurton').insert_id
|
52
61
|
end
|
53
|
-
assert_kind_of Numeric, @db.prepare(sql).execute('Connie Arthurton').insert_id
|
54
62
|
end
|
55
|
-
end
|
56
63
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
sth = db.prepare(
|
63
|
-
|
64
|
-
sth.execute('Benny Arthurton')
|
65
|
-
end
|
66
|
-
@sth = @db.prepare('select * from users').execute
|
67
|
-
end
|
64
|
+
describe 'executed prepared statements' do
|
65
|
+
before do
|
66
|
+
insert = @db.prepare(%q{insert into users (name, created_at) values (?, current_timestamp)})
|
67
|
+
insert.execute('Apple Arthurton')
|
68
|
+
insert.execute('Benny Arthurton')
|
69
|
+
@sth = @db.prepare('select * from users').execute
|
70
|
+
end
|
68
71
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
+
it 'enumerates' do
|
73
|
+
assert_kind_of Enumerable, @sth
|
74
|
+
end
|
72
75
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
76
|
+
it 'enumerates block' do
|
77
|
+
begin
|
78
|
+
@sth.execute{|row| row}
|
79
|
+
rescue => error
|
80
|
+
flunk error.message
|
81
|
+
else
|
82
|
+
pass
|
83
|
+
end
|
80
84
|
end
|
81
|
-
end
|
82
85
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
+
it 'returns hash tuples for enumerable methods' do
|
87
|
+
assert_kind_of Hash, @sth.first
|
88
|
+
end
|
86
89
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
+
it 'returns a result set on Adapter#execute{}' do
|
91
|
+
@db.execute('select * from users') {|r| assert_kind_of Hash, r }
|
92
|
+
end
|
90
93
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
94
|
+
it 'returns a result set on Adapter#results' do
|
95
|
+
@db.execute('select * from users')
|
96
|
+
assert_kind_of Swift::Result, @db.results
|
97
|
+
end
|
95
98
|
|
96
|
-
|
97
|
-
|
99
|
+
it 'returns fields' do
|
100
|
+
assert_equal [ :id, :name, :email, :created_at ], @sth.fields
|
101
|
+
end
|
98
102
|
end
|
99
|
-
end
|
100
103
|
|
101
104
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
db.
|
109
|
-
db.execute %q{create table users(id serial, name text, email text)}
|
105
|
+
#--
|
106
|
+
# TODO: Not sure how I feel about the block in write; feels like it's just there to get around the fields in the
|
107
|
+
# argument list. How about write('users', %w{name, email, balance}, data)?
|
108
|
+
describe 'bulk writes!' do
|
109
|
+
it 'writes from an IO object' do
|
110
|
+
data = StringIO.new "Sally Arthurton\tsally@local\nJonas Arthurton\tjonas@local\n"
|
111
|
+
assert_equal 2, @db.write('users', %w{name email}, data)
|
110
112
|
end
|
111
|
-
end
|
112
|
-
|
113
|
-
it 'writes from an IO object' do
|
114
|
-
data = StringIO.new "Sally Arthurton\tsally@local\nJonas Arthurton\tjonas@local\n"
|
115
|
-
assert_equal 2, Swift.db.write('users', %w{name email}, data)
|
116
|
-
end
|
117
113
|
|
118
|
-
|
119
|
-
|
120
|
-
|
114
|
+
it 'writes from a string' do
|
115
|
+
data = "Sally Arthurton\tsally@local\nJonas Arthurton\tjonas@local\n"
|
116
|
+
assert_equal 2, @db.write('users', %w{name email}, data)
|
117
|
+
end
|
121
118
|
end
|
122
119
|
end
|
123
120
|
end
|
data/test/test_encoding.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
require_relative 'helper'
|
2
2
|
|
3
3
|
describe 'Adapter' do
|
4
|
-
supported_by Swift::DB::Postgres, Swift::DB::Mysql do
|
4
|
+
supported_by Swift::DB::Postgres, Swift::DB::Mysql, Swift::DB::DB2 do
|
5
5
|
describe 'character encoding' do
|
6
6
|
before do
|
7
7
|
Swift.db do |db|
|
8
|
-
db.execute %q{drop table
|
9
|
-
db.execute %q{create table users(
|
8
|
+
db.execute %q{drop table users} rescue nil
|
9
|
+
db.execute %q{create table users(name varchar(128))}
|
10
10
|
|
11
11
|
# Mysql on debian at least doesn't default to utf8.
|
12
12
|
if db.kind_of? Swift::DB::Mysql
|
data/test/test_io.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require_relative 'helper'
|
2
2
|
|
3
3
|
describe 'Adapter' do
|
4
|
-
supported_by Swift::DB::Postgres, Swift::DB::Mysql do
|
4
|
+
supported_by Swift::DB::Postgres, Swift::DB::Mysql, Swift::DB::DB2 do
|
5
5
|
describe 'Storing binary objects' do
|
6
6
|
before do
|
7
7
|
user = Class.new(Swift::Scheme) do
|
data/test/test_pool.rb
CHANGED
@@ -6,28 +6,32 @@ describe 'Adapter' do
|
|
6
6
|
describe 'Asynchronous connection pool' do
|
7
7
|
before do
|
8
8
|
Swift.db do |db|
|
9
|
-
db.execute %q{drop table
|
10
|
-
db.execute %Q{create table users(
|
9
|
+
db.execute %q{drop table users} rescue nil
|
10
|
+
db.execute %Q{create table users(name varchar(64))}
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
-
it 'creates connection pool' do
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
describe 'Running queries' do
|
20
|
-
it 'should select data' do
|
21
|
-
rows = []
|
14
|
+
it 'creates connection pool and runs queries' do
|
15
|
+
rows = []
|
16
|
+
Swift.pool(5) do |pool|
|
17
|
+
assert pool
|
22
18
|
assert Swift.db.write('users', %w{name}, StringIO.new("user1\nuser2\nuser3\n"))
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
19
|
+
pool.execute('select * from users') do |rs|
|
20
|
+
rows += rs.to_a
|
21
|
+
Thread.new do
|
22
|
+
sleep 0.25
|
23
|
+
pool.execute('select * from users order by name desc') {|rs| rows += rs.to_a; EM.stop }
|
27
24
|
end
|
28
25
|
end
|
29
|
-
|
26
|
+
pool.execute('select * from users') do |rs|
|
27
|
+
rows += rs.to_a
|
28
|
+
end
|
30
29
|
end
|
30
|
+
|
31
|
+
data = %w(user1 user2 user3)
|
32
|
+
|
33
|
+
assert_equal 9, rows.length
|
34
|
+
assert_equal data*2 + data.reverse, rows.map {|r| r[:name] }
|
31
35
|
end
|
32
36
|
end
|
33
37
|
end
|
data/test/test_scheme.rb
CHANGED
@@ -9,7 +9,7 @@ describe 'scheme' do
|
|
9
9
|
attribute :age, Swift::Type::Integer, default: 18
|
10
10
|
attribute :email, Swift::Type::String
|
11
11
|
attribute :verified, Swift::Type::Boolean, default: false
|
12
|
-
attribute :created_at, Swift::Type::
|
12
|
+
attribute :created_at, Swift::Type::Time, default: proc { Time.now }
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
data/test/test_timestamps.rb
CHANGED
@@ -25,15 +25,32 @@ describe 'Adapter' do
|
|
25
25
|
assert_timestamp_like time, fetch_timestamp_at(time), 'DST off'
|
26
26
|
end
|
27
27
|
|
28
|
-
|
29
|
-
|
28
|
+
describe 'Adapter timezone' do
|
29
|
+
%w(+05:30 -05:30).each do |offset|
|
30
|
+
it 'should parse timestamps and do conversion accordingly for offset ' + offset do
|
31
|
+
@db = Swift::DB::Postgres.new(@db.options.merge(timezone: offset))
|
32
|
+
server = DateTime.parse('2010-01-01 10:00:00')
|
33
|
+
local = DateTime.parse('2010-01-01 10:00:00 ' + offset)
|
34
|
+
assert_timestamp_like local, fetch_timestamp_at(server, ''), 'parses correctly'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def fetch_timestamp_at value, zone='%z'
|
40
|
+
sql = if zone.empty?
|
41
|
+
"select '%s'::timestamp as now"
|
42
|
+
else
|
43
|
+
"select '%s'::timestamp with time zone as now"
|
44
|
+
end
|
45
|
+
|
46
|
+
sql = sql % value.strftime('%F %T' + zone)
|
30
47
|
@db.execute(sql)
|
31
48
|
@db.results.first.fetch(:now)
|
32
49
|
end
|
33
50
|
|
34
51
|
def assert_timestamp_like expect, given, comment
|
35
52
|
match = Regexp.new expect.to_time.strftime('%F %T')
|
36
|
-
assert_kind_of
|
53
|
+
assert_kind_of Time, given
|
37
54
|
assert_match match, given.strftime('%F %T'), comment
|
38
55
|
end
|
39
56
|
end
|
data/test/test_transactions.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
require_relative 'helper'
|
2
|
-
describe 'Adapter' do
|
3
|
-
supported_by Swift::DB::Postgres do #, Swift::DB::Mysql do
|
4
|
-
before do
|
5
|
-
Swift.db.execute %q{drop table if exists users}
|
6
|
-
Swift.db.execute %q{create table users(id serial, name text, created_at timestamp)}
|
7
|
-
end
|
8
2
|
|
3
|
+
describe 'Adapter' do
|
4
|
+
supported_by Swift::DB::Postgres, Swift::DB::Mysql, Swift::DB::DB2 do
|
9
5
|
describe 'transactions' do
|
10
6
|
before do
|
11
7
|
@name = 'test1 - transaction 1'
|
12
8
|
@db = Swift.db
|
9
|
+
@db.execute %q{drop table users} rescue nil
|
10
|
+
@db.execute %q{create table users(name varchar(512), created_at timestamp)}
|
11
|
+
@db.execute %q{alter table users engine=innodb} if @db.kind_of?(Swift::DB::Mysql) # In case of MyISAM default.
|
12
|
+
@sth = @db.prepare('select count(*) as c from users where name = ?')
|
13
13
|
end
|
14
14
|
|
15
15
|
it 'yields db to block' do
|
@@ -28,7 +28,7 @@ describe 'Adapter' do
|
|
28
28
|
end
|
29
29
|
|
30
30
|
after do
|
31
|
-
@
|
31
|
+
assert_equal 1, @sth.execute(@name).first[:c]
|
32
32
|
end
|
33
33
|
|
34
34
|
it 'should allow explicit commits' do
|
@@ -43,16 +43,15 @@ describe 'Adapter' do
|
|
43
43
|
db.execute('insert into users(name) values(?)', @name)
|
44
44
|
end
|
45
45
|
end
|
46
|
-
end
|
46
|
+
end # commits work
|
47
47
|
|
48
48
|
describe 'rollbacks work' do
|
49
|
-
|
50
49
|
before do
|
51
50
|
@db.execute('truncate users')
|
52
51
|
end
|
53
52
|
|
54
53
|
after do
|
55
|
-
@
|
54
|
+
assert_equal 0, @sth.execute(@name).first[:c]
|
56
55
|
end
|
57
56
|
|
58
57
|
it 'should allow explicit rollbacks' do
|
@@ -70,7 +69,31 @@ describe 'Adapter' do
|
|
70
69
|
end
|
71
70
|
end
|
72
71
|
end
|
73
|
-
end
|
74
|
-
|
75
|
-
|
76
|
-
|
72
|
+
end # rollbacks work
|
73
|
+
|
74
|
+
describe 'nested transactions' do
|
75
|
+
before do
|
76
|
+
@db.execute('truncate users')
|
77
|
+
end
|
78
|
+
|
79
|
+
after do
|
80
|
+
assert_equal 1, @sth.execute(@name).first[:c]
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'should autocommit and autorollback' do
|
84
|
+
@db.transaction do |db|
|
85
|
+
db.execute('insert into users(name) values(?)', @name)
|
86
|
+
begin
|
87
|
+
db.transaction do
|
88
|
+
db.execute('insert into users(name) values(?)', @name)
|
89
|
+
raise 'foo'
|
90
|
+
end
|
91
|
+
rescue RuntimeError
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end # nested transactions
|
96
|
+
|
97
|
+
end # transactions
|
98
|
+
end # supported_by
|
99
|
+
end # adapter
|
data/test/test_types.rb
CHANGED
@@ -7,13 +7,23 @@ describe 'Adapter' do
|
|
7
7
|
@db = Swift.db
|
8
8
|
@db.execute %q{drop table if exists users}
|
9
9
|
@db.execute %q{
|
10
|
-
create table users(
|
10
|
+
create table users(
|
11
|
+
id serial,
|
12
|
+
name text,
|
13
|
+
age integer,
|
14
|
+
height float,
|
15
|
+
hacker bool,
|
16
|
+
slacker bool,
|
17
|
+
created date,
|
18
|
+
updated timestamp
|
19
|
+
)
|
11
20
|
}
|
12
21
|
end
|
13
22
|
|
14
23
|
it 'query result is typecast correctly' do
|
15
|
-
|
16
|
-
|
24
|
+
dt = '2010-01-01 23:22:21'
|
25
|
+
bind = [ 1, 'jim', 32, 178.71, true, false, '2010-01-02', "#{dt}.012345+11:00" ]
|
26
|
+
@db.execute %q{insert into users values(?, ?, ?, ?, ?, ?, ?, ?)}, *bind
|
17
27
|
|
18
28
|
result = @db.prepare(%q{select * from users limit 1}).execute.first
|
19
29
|
assert_kind_of Integer, result[:id]
|
@@ -23,6 +33,10 @@ describe 'Adapter' do
|
|
23
33
|
assert_kind_of TrueClass, result[:hacker]
|
24
34
|
assert_kind_of FalseClass, result[:slacker]
|
25
35
|
assert_kind_of Date, result[:created]
|
36
|
+
assert_kind_of Time, result[:updated]
|
37
|
+
|
38
|
+
assert_equal dt, result[:updated].strftime('%F %T')
|
39
|
+
assert_equal 12345, result[:updated].usec if @db.kind_of?(Swift::DB::Postgres)
|
26
40
|
end
|
27
41
|
end
|
28
42
|
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 7
|
8
|
+
- 0
|
9
|
+
version: 0.7.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Shane Hanna
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-09-
|
18
|
+
date: 2010-09-20 00:00:00 +10:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -63,6 +63,8 @@ files:
|
|
63
63
|
- VERSION
|
64
64
|
- ext/adapter.cc
|
65
65
|
- ext/adapter.h
|
66
|
+
- ext/attribute.cc
|
67
|
+
- ext/attribute.h
|
66
68
|
- ext/extconf.rb
|
67
69
|
- ext/iostream.cc
|
68
70
|
- ext/iostream.h
|