sequel 0.4.1 → 0.4.1.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.
data/CHANGELOG CHANGED
@@ -1,3 +1,7 @@
1
+ === 0.4.1.1 (2007-11-27)
2
+
3
+ * Fixed #first and #last functionality in Informix::Dataset (thanks Gerardo Santana).
4
+
1
5
  === 0.4.1 (2007-11-25)
2
6
 
3
7
  * Put adapter files in lib/sequel/adapters. Requiring sequel/<adapter> is now deprecated. Users can now just require 'sequel' and adapters are automagically loaded (#93).
data/README CHANGED
@@ -30,13 +30,14 @@ Sequel currently supports:
30
30
 
31
31
  * ADO (on Windows)
32
32
  * DBI
33
+ * Informix
33
34
  * MySQL
34
35
  * ODBC
35
36
  * Oracle
36
37
  * PostgreSQL
37
38
  * SQLite 3
38
39
 
39
- There are also experimental adapters for DB2 and Informix.
40
+ There is also an experimental adapter for DB2.
40
41
 
41
42
  == The Sequel Console
42
43
 
data/Rakefile CHANGED
@@ -6,7 +6,7 @@ require 'fileutils'
6
6
  include FileUtils
7
7
 
8
8
  NAME = "sequel"
9
- VERS = "0.4.1"
9
+ VERS = "0.4.1.1"
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",
@@ -49,6 +49,18 @@ module Sequel
49
49
  end
50
50
  end
51
51
 
52
+ def select_sql(opts = nil)
53
+ limit = opts.delete(:limit)
54
+ offset = opts.delete(:offset)
55
+ sql = super
56
+ if limit
57
+ limit = "FIRST #{limit}"
58
+ offset = offset ? "SKIP #{offset}" : ""
59
+ sql.sub!(/^select /i,"SELECT #{offset} #{limit} ")
60
+ end
61
+ sql
62
+ end
63
+
52
64
  def fetch_rows(sql, &block)
53
65
  @db.synchronize do
54
66
  @db.query(sql) do |cursor|
@@ -14,7 +14,7 @@ module Sequel
14
14
  # Called when a database is opened in order to automatically associate the
15
15
  # first opened database with model classes.
16
16
  def self.database_opened(db)
17
- @db = db if self == Model && !@db
17
+ @db = db if (self == Model) && !@db
18
18
  end
19
19
 
20
20
  # Returns the dataset associated with the Model class.
@@ -0,0 +1,139 @@
1
+ require File.join(File.dirname(__FILE__), '../../lib/sequel')
2
+
3
+ INFORMIX_DB = Sequel('informix://localhost/mydb')
4
+ if INFORMIX_DB.table_exists?(:test)
5
+ INFORMIX_DB.drop_table :test
6
+ end
7
+ INFORMIX_DB.create_table :test do
8
+ text :name
9
+ integer :value
10
+
11
+ index :value
12
+ end
13
+
14
+ context "A Informix database" do
15
+ specify "should provide disconnect functionality" do
16
+ INFORMIX_DB.execute("select user from dual")
17
+ INFORMIX_DB.pool.size.should == 1
18
+ INFORMIX_DB.disconnect
19
+ INFORMIX_DB.pool.size.should == 0
20
+ end
21
+ end
22
+
23
+ context "A Informix dataset" do
24
+ setup do
25
+ @d = INFORMIX_DB[:test]
26
+ @d.delete # remove all records
27
+ end
28
+
29
+ specify "should return the correct record count" do
30
+ @d.count.should == 0
31
+ @d << {:name => 'abc', :value => 123}
32
+ @d << {:name => 'abc', :value => 456}
33
+ @d << {:name => 'def', :value => 789}
34
+ @d.count.should == 3
35
+ end
36
+
37
+ specify "should return the correct records" do
38
+ @d.to_a.should == []
39
+ @d << {:name => 'abc', :value => 123}
40
+ @d << {:name => 'abc', :value => 456}
41
+ @d << {:name => 'def', :value => 789}
42
+
43
+ @d.order(:value).to_a.should == [
44
+ {:name => 'abc', :value => 123},
45
+ {:name => 'abc', :value => 456},
46
+ {:name => 'def', :value => 789}
47
+ ]
48
+ end
49
+
50
+ specify "should update records correctly" do
51
+ @d << {:name => 'abc', :value => 123}
52
+ @d << {:name => 'abc', :value => 456}
53
+ @d << {:name => 'def', :value => 789}
54
+ @d.filter(:name => 'abc').update(:value => 530)
55
+
56
+ # the third record should stay the same
57
+ # floating-point precision bullshit
58
+ @d[:name => 'def'][:value].should == 789
59
+ @d.filter(:value => 530).count.should == 2
60
+ end
61
+
62
+ specify "should delete records correctly" do
63
+ @d << {:name => 'abc', :value => 123}
64
+ @d << {:name => 'abc', :value => 456}
65
+ @d << {:name => 'def', :value => 789}
66
+ @d.filter(:name => 'abc').delete
67
+
68
+ @d.count.should == 1
69
+ @d.first[:name].should == 'def'
70
+ end
71
+
72
+ specify "should be able to literalize booleans" do
73
+ proc {@d.literal(true)}.should_not raise_error
74
+ proc {@d.literal(false)}.should_not raise_error
75
+ end
76
+
77
+ specify "should support transactions" do
78
+ INFORMIX_DB.transaction do
79
+ @d << {:name => 'abc', :value => 1}
80
+ end
81
+
82
+ @d.count.should == 1
83
+ end
84
+
85
+ specify "should support #first and #last" do
86
+ @d << {:name => 'abc', :value => 123}
87
+ @d << {:name => 'abc', :value => 456}
88
+ @d << {:name => 'def', :value => 789}
89
+
90
+ @d.order(:value).first.should == {:name => 'abc', :value => 123}
91
+ @d.order(:value).last.should == {:name => 'def', :value => 789}
92
+ end
93
+ end
94
+
95
+ context "A Informix dataset in array tuples mode" do
96
+ setup do
97
+ @d = INFORMIX_DB[:test]
98
+ @d.delete # remove all records
99
+ Sequel.use_array_tuples
100
+ end
101
+
102
+ teardown do
103
+ Sequel.use_hash_tuples
104
+ end
105
+
106
+ specify "should return the correct records" do
107
+ @d.to_a.should == []
108
+ @d << {:name => 'abc', :value => 123}
109
+ @d << {:name => 'abc', :value => 456}
110
+ @d << {:name => 'def', :value => 789}
111
+
112
+ @d.order(:value).select(:name, :value).to_a.should == [
113
+ ['abc', 123],
114
+ ['abc', 456],
115
+ ['def', 789]
116
+ ]
117
+ end
118
+
119
+ specify "should work correctly with transforms" do
120
+ @d.transform(:value => [proc {|v| v.to_s}, proc {|v| v.to_i}])
121
+
122
+ @d.to_a.should == []
123
+ @d << {:name => 'abc', :value => 123}
124
+ @d << {:name => 'abc', :value => 456}
125
+ @d << {:name => 'def', :value => 789}
126
+
127
+ @d.order(:value).select(:name, :value).to_a.should == [
128
+ ['abc', '123'],
129
+ ['abc', '456'],
130
+ ['def', '789']
131
+ ]
132
+
133
+ a = @d.order(:value).first
134
+ a.values.should == ['abc', '123']
135
+ a.keys.should == [:name, :value]
136
+ a[:name].should == 'abc'
137
+ a[:value].should == '123'
138
+ end
139
+ end
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '../../lib/sequel/mysql')
1
+ require File.join(File.dirname(__FILE__), '../../lib/sequel')
2
2
 
3
3
  MYSQL_DB = Sequel('mysql://root@localhost/sandbox')
4
4
  if MYSQL_DB.table_exists?(:items)
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '../../lib/sequel/oracle')
1
+ require File.join(File.dirname(__FILE__), '../../lib/sequel')
2
2
 
3
3
  ORACLE_DB = Sequel('oracle://hr:hr@loalhost/XE')
4
4
  if ORACLE_DB.table_exists?(:test)
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '../../lib/sequel/postgres')
1
+ require File.join(File.dirname(__FILE__), '../../lib/sequel')
2
2
 
3
3
  PGSQL_DB = Sequel('postgres://postgres:postgres@localhost:5432/reality_spec')
4
4
  if PGSQL_DB.table_exists?(:test)
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '../../lib/sequel/sqlite')
1
+ require File.join(File.dirname(__FILE__), '../../lib/sequel')
2
2
 
3
3
  SQLITE_DB = Sequel('sqlite:/')
4
4
  SQLITE_DB.create_table :items do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sequel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sharon Rosner
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2007-11-25 00:00:00 +02:00
12
+ date: 2007-11-27 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -54,8 +54,8 @@ files:
54
54
  - README
55
55
  - Rakefile
56
56
  - bin/sequel
57
- - doc/rdoc
58
57
  - spec/adapters
58
+ - spec/adapters/informix_spec.rb
59
59
  - spec/adapters/mysql_spec.rb
60
60
  - spec/adapters/oracle_spec.rb
61
61
  - spec/adapters/postgres_spec.rb