sequel_core 1.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/CHANGELOG +1003 -0
- data/COPYING +18 -0
- data/README +81 -0
- data/Rakefile +176 -0
- data/bin/sequel +41 -0
- data/lib/sequel_core.rb +59 -0
- data/lib/sequel_core/adapters/adapter_skeleton.rb +68 -0
- data/lib/sequel_core/adapters/ado.rb +100 -0
- data/lib/sequel_core/adapters/db2.rb +158 -0
- data/lib/sequel_core/adapters/dbi.rb +126 -0
- data/lib/sequel_core/adapters/informix.rb +87 -0
- data/lib/sequel_core/adapters/jdbc.rb +108 -0
- data/lib/sequel_core/adapters/mysql.rb +269 -0
- data/lib/sequel_core/adapters/odbc.rb +145 -0
- data/lib/sequel_core/adapters/odbc_mssql.rb +93 -0
- data/lib/sequel_core/adapters/openbase.rb +90 -0
- data/lib/sequel_core/adapters/oracle.rb +99 -0
- data/lib/sequel_core/adapters/postgres.rb +519 -0
- data/lib/sequel_core/adapters/sqlite.rb +192 -0
- data/lib/sequel_core/array_keys.rb +296 -0
- data/lib/sequel_core/connection_pool.rb +152 -0
- data/lib/sequel_core/core_ext.rb +59 -0
- data/lib/sequel_core/core_sql.rb +191 -0
- data/lib/sequel_core/database.rb +433 -0
- data/lib/sequel_core/dataset.rb +409 -0
- data/lib/sequel_core/dataset/convenience.rb +321 -0
- data/lib/sequel_core/dataset/sequelizer.rb +354 -0
- data/lib/sequel_core/dataset/sql.rb +586 -0
- data/lib/sequel_core/exceptions.rb +45 -0
- data/lib/sequel_core/migration.rb +191 -0
- data/lib/sequel_core/model.rb +8 -0
- data/lib/sequel_core/pretty_table.rb +73 -0
- data/lib/sequel_core/schema.rb +8 -0
- data/lib/sequel_core/schema/schema_generator.rb +131 -0
- data/lib/sequel_core/schema/schema_sql.rb +131 -0
- data/lib/sequel_core/worker.rb +58 -0
- data/spec/adapters/informix_spec.rb +139 -0
- data/spec/adapters/mysql_spec.rb +330 -0
- data/spec/adapters/oracle_spec.rb +130 -0
- data/spec/adapters/postgres_spec.rb +189 -0
- data/spec/adapters/sqlite_spec.rb +345 -0
- data/spec/array_keys_spec.rb +679 -0
- data/spec/connection_pool_spec.rb +356 -0
- data/spec/core_ext_spec.rb +67 -0
- data/spec/core_sql_spec.rb +301 -0
- data/spec/database_spec.rb +812 -0
- data/spec/dataset_spec.rb +2381 -0
- data/spec/migration_spec.rb +261 -0
- data/spec/pretty_table_spec.rb +66 -0
- data/spec/rcov.opts +4 -0
- data/spec/schema_generator_spec.rb +86 -0
- data/spec/schema_spec.rb +230 -0
- data/spec/sequelizer_spec.rb +448 -0
- data/spec/spec.opts +5 -0
- data/spec/spec_helper.rb +44 -0
- data/spec/worker_spec.rb +96 -0
- metadata +162 -0
| @@ -0,0 +1,130 @@ | |
| 1 | 
            +
            require File.join(File.dirname(__FILE__), '../../lib/sequel')
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            ORACLE_DB = Sequel('oracle://hr:hr@loalhost/XE')
         | 
| 4 | 
            +
            if ORACLE_DB.table_exists?(:test)
         | 
| 5 | 
            +
              ORACLE_DB.drop_table :test
         | 
| 6 | 
            +
            end
         | 
| 7 | 
            +
            ORACLE_DB.create_table :test do
         | 
| 8 | 
            +
              text :name
         | 
| 9 | 
            +
              integer :value
         | 
| 10 | 
            +
              
         | 
| 11 | 
            +
              index :value
         | 
| 12 | 
            +
            end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            context "A Oracle database" do
         | 
| 15 | 
            +
              specify "should provide disconnect functionality" do
         | 
| 16 | 
            +
                ORACLE_DB.execute("select user from dual")
         | 
| 17 | 
            +
                ORACLE_DB.pool.size.should == 1
         | 
| 18 | 
            +
                ORACLE_DB.disconnect
         | 
| 19 | 
            +
                ORACLE_DB.pool.size.should == 0
         | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
            end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            context "A Oracle dataset" do
         | 
| 24 | 
            +
              setup do
         | 
| 25 | 
            +
                @d = ORACLE_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 | 
            +
                ORACLE_DB.transaction do
         | 
| 79 | 
            +
                  @d << {:name => 'abc', :value => 1}
         | 
| 80 | 
            +
                end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                @d.count.should == 1
         | 
| 83 | 
            +
              end
         | 
| 84 | 
            +
            end
         | 
| 85 | 
            +
             | 
| 86 | 
            +
            context "A Oracle dataset in array tuples mode" do
         | 
| 87 | 
            +
              setup do
         | 
| 88 | 
            +
                @d = ORACLE_DB[:test]
         | 
| 89 | 
            +
                @d.delete # remove all records
         | 
| 90 | 
            +
                Sequel.use_array_tuples
         | 
| 91 | 
            +
              end
         | 
| 92 | 
            +
              
         | 
| 93 | 
            +
              teardown do
         | 
| 94 | 
            +
                Sequel.use_hash_tuples
         | 
| 95 | 
            +
              end
         | 
| 96 | 
            +
              
         | 
| 97 | 
            +
              specify "should return the correct records" do
         | 
| 98 | 
            +
                @d.to_a.should == []
         | 
| 99 | 
            +
                @d << {:name => 'abc', :value => 123}
         | 
| 100 | 
            +
                @d << {:name => 'abc', :value => 456}
         | 
| 101 | 
            +
                @d << {:name => 'def', :value => 789}
         | 
| 102 | 
            +
             | 
| 103 | 
            +
                @d.order(:value).select(:name, :value).to_a.should == [
         | 
| 104 | 
            +
                  ['abc', 123],
         | 
| 105 | 
            +
                  ['abc', 456],
         | 
| 106 | 
            +
                  ['def', 789]
         | 
| 107 | 
            +
                ]
         | 
| 108 | 
            +
              end
         | 
| 109 | 
            +
              
         | 
| 110 | 
            +
              specify "should work correctly with transforms" do
         | 
| 111 | 
            +
                @d.transform(:value => [proc {|v| v.to_s}, proc {|v| v.to_i}])
         | 
| 112 | 
            +
             | 
| 113 | 
            +
                @d.to_a.should == []
         | 
| 114 | 
            +
                @d << {:name => 'abc', :value => 123}
         | 
| 115 | 
            +
                @d << {:name => 'abc', :value => 456}
         | 
| 116 | 
            +
                @d << {:name => 'def', :value => 789}
         | 
| 117 | 
            +
             | 
| 118 | 
            +
                @d.order(:value).select(:name, :value).to_a.should == [
         | 
| 119 | 
            +
                  ['abc', '123'],
         | 
| 120 | 
            +
                  ['abc', '456'],
         | 
| 121 | 
            +
                  ['def', '789']
         | 
| 122 | 
            +
                ]
         | 
| 123 | 
            +
                
         | 
| 124 | 
            +
                a = @d.order(:value).first
         | 
| 125 | 
            +
                a.values.should == ['abc', '123']
         | 
| 126 | 
            +
                a.keys.should == [:name, :value]
         | 
| 127 | 
            +
                a[:name].should == 'abc'
         | 
| 128 | 
            +
                a[:value].should == '123'
         | 
| 129 | 
            +
              end
         | 
| 130 | 
            +
            end
         | 
| @@ -0,0 +1,189 @@ | |
| 1 | 
            +
            require File.join(File.dirname(__FILE__), '../../lib/sequel')
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            PGSQL_DB = Sequel('postgres://postgres:postgres@localhost:5432/reality_spec')
         | 
| 4 | 
            +
            PGSQL_DB.drop_table(:test) if PGSQL_DB.table_exists?(:test)
         | 
| 5 | 
            +
            PGSQL_DB.drop_table(:test2) if PGSQL_DB.table_exists?(:test2)
         | 
| 6 | 
            +
              
         | 
| 7 | 
            +
            PGSQL_DB.create_table :test do
         | 
| 8 | 
            +
              text :name
         | 
| 9 | 
            +
              integer :value, :index => true
         | 
| 10 | 
            +
            end
         | 
| 11 | 
            +
            PGSQL_DB.create_table :test2 do
         | 
| 12 | 
            +
              text :name
         | 
| 13 | 
            +
              integer :value
         | 
| 14 | 
            +
            end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            context "A PostgreSQL database" do
         | 
| 17 | 
            +
              setup do
         | 
| 18 | 
            +
                @db = PGSQL_DB
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
              
         | 
| 21 | 
            +
              specify "should provide disconnect functionality" do
         | 
| 22 | 
            +
                @db.tables
         | 
| 23 | 
            +
                @db.pool.size.should == 1
         | 
| 24 | 
            +
                @db.disconnect
         | 
| 25 | 
            +
                @db.pool.size.should == 0
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
            end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            context "A PostgreSQL dataset" do
         | 
| 30 | 
            +
              setup do
         | 
| 31 | 
            +
                @d = PGSQL_DB[:test]
         | 
| 32 | 
            +
                @d.delete # remove all records
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
              
         | 
| 35 | 
            +
              specify "should return the correct record count" do
         | 
| 36 | 
            +
                @d.count.should == 0
         | 
| 37 | 
            +
                @d << {:name => 'abc', :value => 123}
         | 
| 38 | 
            +
                @d << {:name => 'abc', :value => 456}
         | 
| 39 | 
            +
                @d << {:name => 'def', :value => 789}
         | 
| 40 | 
            +
                @d.count.should == 3
         | 
| 41 | 
            +
              end
         | 
| 42 | 
            +
              
         | 
| 43 | 
            +
              specify "should return the correct records" do
         | 
| 44 | 
            +
                @d.to_a.should == []
         | 
| 45 | 
            +
                @d << {:name => 'abc', :value => 123}
         | 
| 46 | 
            +
                @d << {:name => 'abc', :value => 456}
         | 
| 47 | 
            +
                @d << {:name => 'def', :value => 789}
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                @d.order(:value).to_a.should == [
         | 
| 50 | 
            +
                  {:name => 'abc', :value => 123},
         | 
| 51 | 
            +
                  {:name => 'abc', :value => 456},
         | 
| 52 | 
            +
                  {:name => 'def', :value => 789}
         | 
| 53 | 
            +
                ]
         | 
| 54 | 
            +
              end
         | 
| 55 | 
            +
              
         | 
| 56 | 
            +
              specify "should update records correctly" do
         | 
| 57 | 
            +
                @d << {:name => 'abc', :value => 123}
         | 
| 58 | 
            +
                @d << {:name => 'abc', :value => 456}
         | 
| 59 | 
            +
                @d << {:name => 'def', :value => 789}
         | 
| 60 | 
            +
                @d.filter(:name => 'abc').update(:value => 530)
         | 
| 61 | 
            +
                
         | 
| 62 | 
            +
                # the third record should stay the same
         | 
| 63 | 
            +
                # floating-point precision bullshit
         | 
| 64 | 
            +
                @d[:name => 'def'][:value].should == 789
         | 
| 65 | 
            +
                @d.filter(:value => 530).count.should == 2
         | 
| 66 | 
            +
              end
         | 
| 67 | 
            +
              
         | 
| 68 | 
            +
              specify "should delete records correctly" do
         | 
| 69 | 
            +
                @d << {:name => 'abc', :value => 123}
         | 
| 70 | 
            +
                @d << {:name => 'abc', :value => 456}
         | 
| 71 | 
            +
                @d << {:name => 'def', :value => 789}
         | 
| 72 | 
            +
                @d.filter(:name => 'abc').delete
         | 
| 73 | 
            +
                
         | 
| 74 | 
            +
                @d.count.should == 1
         | 
| 75 | 
            +
                @d.first[:name].should == 'def'
         | 
| 76 | 
            +
              end
         | 
| 77 | 
            +
              
         | 
| 78 | 
            +
              specify "should be able to literalize booleans" do
         | 
| 79 | 
            +
                proc {@d.literal(true)}.should_not raise_error
         | 
| 80 | 
            +
                proc {@d.literal(false)}.should_not raise_error
         | 
| 81 | 
            +
              end
         | 
| 82 | 
            +
              
         | 
| 83 | 
            +
              specify "should support transactions" do
         | 
| 84 | 
            +
                PGSQL_DB.transaction do
         | 
| 85 | 
            +
                  @d << {:name => 'abc', :value => 1}
         | 
| 86 | 
            +
                end
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                @d.count.should == 1
         | 
| 89 | 
            +
              end
         | 
| 90 | 
            +
              
         | 
| 91 | 
            +
              specify "should support regexps" do
         | 
| 92 | 
            +
                @d << {:name => 'abc', :value => 1}
         | 
| 93 | 
            +
                @d << {:name => 'bcd', :value => 2}
         | 
| 94 | 
            +
                @d.filter(:name => /bc/).count.should == 2
         | 
| 95 | 
            +
                @d.filter(:name => /^bc/).count.should == 1
         | 
| 96 | 
            +
              end
         | 
| 97 | 
            +
             | 
| 98 | 
            +
              specify "should consider strings containing backslashes to be escaped string literals" do
         | 
| 99 | 
            +
                PGconn.quote("\\dingo").should == "E'\\\\dingo'"   # literally, E'\\dingo'
         | 
| 100 | 
            +
                PGconn.quote("dingo").should == "'dingo'"
         | 
| 101 | 
            +
              end
         | 
| 102 | 
            +
            end
         | 
| 103 | 
            +
             | 
| 104 | 
            +
            context "A PostgreSQL dataset in array tuples mode" do
         | 
| 105 | 
            +
              setup do
         | 
| 106 | 
            +
                @d = PGSQL_DB[:test]
         | 
| 107 | 
            +
                @d.delete # remove all records
         | 
| 108 | 
            +
                Sequel.use_array_tuples
         | 
| 109 | 
            +
              end
         | 
| 110 | 
            +
              
         | 
| 111 | 
            +
              teardown do
         | 
| 112 | 
            +
                Sequel.use_hash_tuples
         | 
| 113 | 
            +
              end
         | 
| 114 | 
            +
              
         | 
| 115 | 
            +
              specify "should return the correct records" do
         | 
| 116 | 
            +
                @d.to_a.should == []
         | 
| 117 | 
            +
                @d << {:name => 'abc', :value => 123}
         | 
| 118 | 
            +
                @d << {:name => 'abc', :value => 456}
         | 
| 119 | 
            +
                @d << {:name => 'def', :value => 789}
         | 
| 120 | 
            +
             | 
| 121 | 
            +
                @d.order(:value).select(:name, :value).to_a.should == [
         | 
| 122 | 
            +
                  ['abc', 123],
         | 
| 123 | 
            +
                  ['abc', 456],
         | 
| 124 | 
            +
                  ['def', 789]
         | 
| 125 | 
            +
                ]
         | 
| 126 | 
            +
              end
         | 
| 127 | 
            +
              
         | 
| 128 | 
            +
              specify "should work correctly with transforms" do
         | 
| 129 | 
            +
                @d.transform(:value => [proc {|v| v.to_s}, proc {|v| v.to_i}])
         | 
| 130 | 
            +
             | 
| 131 | 
            +
                @d.to_a.should == []
         | 
| 132 | 
            +
                @d << {:name => 'abc', :value => 123}
         | 
| 133 | 
            +
                @d << {:name => 'abc', :value => 456}
         | 
| 134 | 
            +
                @d << {:name => 'def', :value => 789}
         | 
| 135 | 
            +
             | 
| 136 | 
            +
                @d.order(:value).select(:name, :value).to_a.should == [
         | 
| 137 | 
            +
                  ['abc', '123'],
         | 
| 138 | 
            +
                  ['abc', '456'],
         | 
| 139 | 
            +
                  ['def', '789']
         | 
| 140 | 
            +
                ]
         | 
| 141 | 
            +
                
         | 
| 142 | 
            +
                a = @d.order(:value).first
         | 
| 143 | 
            +
                a.values.should == ['abc', '123']
         | 
| 144 | 
            +
                a.keys.should == [:name, :value]
         | 
| 145 | 
            +
                a[:name].should == 'abc'
         | 
| 146 | 
            +
                a[:value].should == '123'
         | 
| 147 | 
            +
              end
         | 
| 148 | 
            +
            end
         | 
| 149 | 
            +
             | 
| 150 | 
            +
            context "A PostgreSQL database" do
         | 
| 151 | 
            +
              setup do
         | 
| 152 | 
            +
                @db = PGSQL_DB
         | 
| 153 | 
            +
              end
         | 
| 154 | 
            +
             | 
| 155 | 
            +
              specify "should support add_column operations" do
         | 
| 156 | 
            +
                @db.add_column :test2, :xyz, :text, :default => '000'
         | 
| 157 | 
            +
                
         | 
| 158 | 
            +
                @db[:test2].columns.should == [:name, :value, :xyz]
         | 
| 159 | 
            +
                @db[:test2] << {:name => 'mmm', :value => 111}
         | 
| 160 | 
            +
                @db[:test2].first[:xyz].should == '000'
         | 
| 161 | 
            +
              end
         | 
| 162 | 
            +
              
         | 
| 163 | 
            +
              specify "should support drop_column operations" do
         | 
| 164 | 
            +
                @db[:test2].columns.should == [:name, :value, :xyz]
         | 
| 165 | 
            +
                @db.drop_column :test2, :xyz
         | 
| 166 | 
            +
                
         | 
| 167 | 
            +
                @db[:test2].columns.should == [:name, :value]
         | 
| 168 | 
            +
              end
         | 
| 169 | 
            +
              
         | 
| 170 | 
            +
              specify "should support rename_column operations" do
         | 
| 171 | 
            +
                @db[:test2].delete
         | 
| 172 | 
            +
                @db.add_column :test2, :xyz, :text, :default => '000'
         | 
| 173 | 
            +
                @db[:test2] << {:name => 'mmm', :value => 111, :xyz => 'qqqq'}
         | 
| 174 | 
            +
             | 
| 175 | 
            +
                @db[:test2].columns.should == [:name, :value, :xyz]
         | 
| 176 | 
            +
                @db.rename_column :test2, :xyz, :zyx
         | 
| 177 | 
            +
                @db[:test2].columns.should == [:name, :value, :zyx]
         | 
| 178 | 
            +
                @db[:test2].first[:zyx].should == 'qqqq'
         | 
| 179 | 
            +
              end
         | 
| 180 | 
            +
              
         | 
| 181 | 
            +
              specify "should support set_column_type operations" do
         | 
| 182 | 
            +
                @db.add_column :test2, :xyz, :float
         | 
| 183 | 
            +
                @db[:test2].delete
         | 
| 184 | 
            +
                @db[:test2] << {:name => 'mmm', :value => 111, :xyz => 56.78}
         | 
| 185 | 
            +
                @db.set_column_type :test2, :xyz, :integer
         | 
| 186 | 
            +
                
         | 
| 187 | 
            +
                @db[:test2].first[:xyz].should == 57
         | 
| 188 | 
            +
              end
         | 
| 189 | 
            +
            end  
         | 
| @@ -0,0 +1,345 @@ | |
| 1 | 
            +
            require File.join(File.dirname(__FILE__), '../../lib/sequel')
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            SQLITE_DB = Sequel('sqlite:/')
         | 
| 4 | 
            +
            SQLITE_DB.create_table :items do
         | 
| 5 | 
            +
              integer :id, :primary_key => true, :auto_increment => true
         | 
| 6 | 
            +
              text :name
         | 
| 7 | 
            +
              float :value
         | 
| 8 | 
            +
            end
         | 
| 9 | 
            +
            SQLITE_DB.create_table :test2 do
         | 
| 10 | 
            +
              text :name
         | 
| 11 | 
            +
              integer :value
         | 
| 12 | 
            +
            end
         | 
| 13 | 
            +
            SQLITE_DB.create_table(:time) {timestamp :t}
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            context "An SQLite database" do
         | 
| 16 | 
            +
              setup do
         | 
| 17 | 
            +
                @db = Sequel('sqlite:/')
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
              
         | 
| 20 | 
            +
              specify "should provide a list of existing tables" do
         | 
| 21 | 
            +
                @db.tables.should == []
         | 
| 22 | 
            +
                
         | 
| 23 | 
            +
                @db.create_table :testing do
         | 
| 24 | 
            +
                  text :name
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
                @db.tables.should include(:testing)
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
              
         | 
| 29 | 
            +
              specify "should support getting pragma values" do
         | 
| 30 | 
            +
                @db.pragma_get(:auto_vacuum).should == '0'
         | 
| 31 | 
            +
              end
         | 
| 32 | 
            +
              
         | 
| 33 | 
            +
              specify "should support setting pragma values" do
         | 
| 34 | 
            +
                @db.pragma_set(:auto_vacuum, '1')
         | 
| 35 | 
            +
                @db.pragma_get(:auto_vacuum).should == '1'
         | 
| 36 | 
            +
              end
         | 
| 37 | 
            +
              
         | 
| 38 | 
            +
              specify "should support getting and setting the auto_vacuum pragma" do
         | 
| 39 | 
            +
                @db.auto_vacuum = :full
         | 
| 40 | 
            +
                @db.auto_vacuum.should == :full
         | 
| 41 | 
            +
                @db.auto_vacuum = :none
         | 
| 42 | 
            +
                @db.auto_vacuum.should == :none
         | 
| 43 | 
            +
                
         | 
| 44 | 
            +
                proc {@db.auto_vacuum = :invalid}.should raise_error(Sequel::Error)
         | 
| 45 | 
            +
              end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
              specify "should support getting and setting the synchronous pragma" do
         | 
| 48 | 
            +
                @db.synchronous = :off
         | 
| 49 | 
            +
                @db.synchronous.should == :off
         | 
| 50 | 
            +
                @db.synchronous = :normal
         | 
| 51 | 
            +
                @db.synchronous.should == :normal
         | 
| 52 | 
            +
                @db.synchronous = :full
         | 
| 53 | 
            +
                @db.synchronous.should == :full
         | 
| 54 | 
            +
                
         | 
| 55 | 
            +
                proc {@db.synchronous = :invalid}.should raise_error(Sequel::Error)
         | 
| 56 | 
            +
              end
         | 
| 57 | 
            +
              
         | 
| 58 | 
            +
              specify "should support getting and setting the temp_store pragma" do
         | 
| 59 | 
            +
                @db.temp_store = :default
         | 
| 60 | 
            +
                @db.temp_store.should == :default
         | 
| 61 | 
            +
                @db.temp_store = :file
         | 
| 62 | 
            +
                @db.temp_store.should == :file
         | 
| 63 | 
            +
                @db.temp_store = :memory
         | 
| 64 | 
            +
                @db.temp_store.should == :memory
         | 
| 65 | 
            +
                
         | 
| 66 | 
            +
                proc {@db.temp_store = :invalid}.should raise_error(Sequel::Error)
         | 
| 67 | 
            +
              end
         | 
| 68 | 
            +
              
         | 
| 69 | 
            +
              specify "should be able to execute multiple statements at once" do
         | 
| 70 | 
            +
                @db.create_table :t do
         | 
| 71 | 
            +
                  text :name
         | 
| 72 | 
            +
                end
         | 
| 73 | 
            +
                
         | 
| 74 | 
            +
                @db << "insert into t (name) values ('abc');insert into t (name) values ('def')"
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                @db[:t].count.should == 2
         | 
| 77 | 
            +
                
         | 
| 78 | 
            +
                @db[:t].order(:name).map(:name).should == ['abc', 'def']
         | 
| 79 | 
            +
              end
         | 
| 80 | 
            +
              
         | 
| 81 | 
            +
              specify "should be able to execute transactions" do
         | 
| 82 | 
            +
                @db.transaction do
         | 
| 83 | 
            +
                  @db.create_table(:t) {text :name}
         | 
| 84 | 
            +
                end
         | 
| 85 | 
            +
                
         | 
| 86 | 
            +
                @db.tables.should == [:t]
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                proc {@db.transaction do
         | 
| 89 | 
            +
                  @db.create_table(:u) {text :name}
         | 
| 90 | 
            +
                  raise ArgumentError
         | 
| 91 | 
            +
                end}.should raise_error(ArgumentError)
         | 
| 92 | 
            +
                # no commit
         | 
| 93 | 
            +
                @db.tables.should == [:t]
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                proc {@db.transaction do
         | 
| 96 | 
            +
                  @db.create_table(:v) {text :name}
         | 
| 97 | 
            +
                  rollback!
         | 
| 98 | 
            +
                end}.should_not raise_error
         | 
| 99 | 
            +
                # no commit
         | 
| 100 | 
            +
                @db.tables.should == [:t]
         | 
| 101 | 
            +
              end
         | 
| 102 | 
            +
             | 
| 103 | 
            +
              specify "should support nested transactions" do
         | 
| 104 | 
            +
                @db.transaction do
         | 
| 105 | 
            +
                  @db.transaction do
         | 
| 106 | 
            +
                    @db.create_table(:t) {text :name}
         | 
| 107 | 
            +
                  end
         | 
| 108 | 
            +
                end
         | 
| 109 | 
            +
                
         | 
| 110 | 
            +
                @db.tables.should == [:t]
         | 
| 111 | 
            +
             | 
| 112 | 
            +
                proc {@db.transaction do
         | 
| 113 | 
            +
                  @db.create_table(:v) {text :name}
         | 
| 114 | 
            +
                  @db.transaction do
         | 
| 115 | 
            +
                    rollback! # should roll back the top-level transaction
         | 
| 116 | 
            +
                  end
         | 
| 117 | 
            +
                end}.should_not raise_error
         | 
| 118 | 
            +
                # no commit
         | 
| 119 | 
            +
                @db.tables.should == [:t]
         | 
| 120 | 
            +
              end
         | 
| 121 | 
            +
              
         | 
| 122 | 
            +
              specify "should provide disconnect functionality" do
         | 
| 123 | 
            +
                @db.tables
         | 
| 124 | 
            +
                @db.pool.size.should == 1
         | 
| 125 | 
            +
                @db.disconnect
         | 
| 126 | 
            +
                @db.pool.size.should == 0
         | 
| 127 | 
            +
              end
         | 
| 128 | 
            +
             | 
| 129 | 
            +
              specify "should support timestamps" do
         | 
| 130 | 
            +
                t1 = Time.at(Time.now.to_i) #normalize time
         | 
| 131 | 
            +
                
         | 
| 132 | 
            +
                SQLITE_DB[:time] << {:t => t1}
         | 
| 133 | 
            +
                SQLITE_DB[:time].first[:t].should == t1
         | 
| 134 | 
            +
              end
         | 
| 135 | 
            +
            end
         | 
| 136 | 
            +
             | 
| 137 | 
            +
            context "An SQLite dataset" do
         | 
| 138 | 
            +
              setup do
         | 
| 139 | 
            +
                @d = SQLITE_DB[:items]
         | 
| 140 | 
            +
                @d.delete # remove all records
         | 
| 141 | 
            +
              end
         | 
| 142 | 
            +
              
         | 
| 143 | 
            +
              specify "should return the correct records" do
         | 
| 144 | 
            +
                @d.to_a.should == []
         | 
| 145 | 
            +
                @d << {:name => 'abc', :value => 1.23}
         | 
| 146 | 
            +
                @d << {:name => 'abc', :value => 4.56}
         | 
| 147 | 
            +
                @d << {:name => 'def', :value => 7.89}
         | 
| 148 | 
            +
                @d.select(:name, :value).to_a.sort_by {|h| h[:value]}.should == [
         | 
| 149 | 
            +
                  {:name => 'abc', :value => 1.23},
         | 
| 150 | 
            +
                  {:name => 'abc', :value => 4.56},
         | 
| 151 | 
            +
                  {:name => 'def', :value => 7.89}
         | 
| 152 | 
            +
                ]
         | 
| 153 | 
            +
              end
         | 
| 154 | 
            +
              
         | 
| 155 | 
            +
              specify "should return the correct record count" do
         | 
| 156 | 
            +
                @d.count.should == 0
         | 
| 157 | 
            +
                @d << {:name => 'abc', :value => 1.23}
         | 
| 158 | 
            +
                @d << {:name => 'abc', :value => 4.56}
         | 
| 159 | 
            +
                @d << {:name => 'def', :value => 7.89}
         | 
| 160 | 
            +
                @d.count.should == 3
         | 
| 161 | 
            +
              end
         | 
| 162 | 
            +
             | 
| 163 | 
            +
              specify "should return the last inserted id when inserting records" do
         | 
| 164 | 
            +
                id = @d << {:name => 'abc', :value => 1.23}
         | 
| 165 | 
            +
                id.should == @d.first[:id]
         | 
| 166 | 
            +
              end
         | 
| 167 | 
            +
              
         | 
| 168 | 
            +
              specify "should update records correctly" do
         | 
| 169 | 
            +
                @d << {:name => 'abc', :value => 1.23}
         | 
| 170 | 
            +
                @d << {:name => 'abc', :value => 4.56}
         | 
| 171 | 
            +
                @d << {:name => 'def', :value => 7.89}
         | 
| 172 | 
            +
                @d.filter(:name => 'abc').update(:value => 5.3)
         | 
| 173 | 
            +
                
         | 
| 174 | 
            +
                # the third record should stay the same
         | 
| 175 | 
            +
                @d[:name => 'def'][:value].should == 7.89
         | 
| 176 | 
            +
                @d.filter(:value => 5.3).count.should == 2
         | 
| 177 | 
            +
              end
         | 
| 178 | 
            +
              
         | 
| 179 | 
            +
              specify "should delete records correctly" do
         | 
| 180 | 
            +
                @d << {:name => 'abc', :value => 1.23}
         | 
| 181 | 
            +
                @d << {:name => 'abc', :value => 4.56}
         | 
| 182 | 
            +
                @d << {:name => 'def', :value => 7.89}
         | 
| 183 | 
            +
                @d.filter(:name => 'abc').delete
         | 
| 184 | 
            +
                
         | 
| 185 | 
            +
                @d.count.should == 1
         | 
| 186 | 
            +
                @d.first[:name].should == 'def'
         | 
| 187 | 
            +
              end
         | 
| 188 | 
            +
            end
         | 
| 189 | 
            +
             | 
| 190 | 
            +
            context "An SQLite dataset" do
         | 
| 191 | 
            +
              setup do
         | 
| 192 | 
            +
                @d = SQLITE_DB[:items]
         | 
| 193 | 
            +
                @d.delete # remove all records
         | 
| 194 | 
            +
                @d << {:name => 'abc', :value => 1.23}
         | 
| 195 | 
            +
                @d << {:name => 'def', :value => 4.56}
         | 
| 196 | 
            +
                @d << {:name => 'ghi', :value => 7.89}
         | 
| 197 | 
            +
              end
         | 
| 198 | 
            +
              
         | 
| 199 | 
            +
              specify "should correctly return avg" do
         | 
| 200 | 
            +
                @d.avg(:value).should == ((1.23 + 4.56 + 7.89) / 3).to_s
         | 
| 201 | 
            +
              end
         | 
| 202 | 
            +
              
         | 
| 203 | 
            +
              specify "should correctly return sum" do
         | 
| 204 | 
            +
                @d.sum(:value).should == (1.23 + 4.56 + 7.89).to_s
         | 
| 205 | 
            +
              end
         | 
| 206 | 
            +
              
         | 
| 207 | 
            +
              specify "should correctly return max" do
         | 
| 208 | 
            +
                @d.max(:value).should == 7.89.to_s
         | 
| 209 | 
            +
              end
         | 
| 210 | 
            +
              
         | 
| 211 | 
            +
              specify "should correctly return min" do
         | 
| 212 | 
            +
                @d.min(:value).should == 1.23.to_s
         | 
| 213 | 
            +
              end
         | 
| 214 | 
            +
            end
         | 
| 215 | 
            +
             | 
| 216 | 
            +
            context "SQLite::Dataset#delete" do
         | 
| 217 | 
            +
              setup do
         | 
| 218 | 
            +
                @d = SQLITE_DB[:items]
         | 
| 219 | 
            +
                @d.delete # remove all records
         | 
| 220 | 
            +
                @d << {:name => 'abc', :value => 1.23}
         | 
| 221 | 
            +
                @d << {:name => 'def', :value => 4.56}
         | 
| 222 | 
            +
                @d << {:name => 'ghi', :value => 7.89}
         | 
| 223 | 
            +
              end
         | 
| 224 | 
            +
              
         | 
| 225 | 
            +
              specify "should return the number of records affected when filtered" do
         | 
| 226 | 
            +
                @d.count.should == 3
         | 
| 227 | 
            +
                @d.filter {:value < 3}.delete.should == 1
         | 
| 228 | 
            +
                @d.count.should == 2
         | 
| 229 | 
            +
             | 
| 230 | 
            +
                @d.filter {:value < 3}.delete.should == 0
         | 
| 231 | 
            +
                @d.count.should == 2
         | 
| 232 | 
            +
              end
         | 
| 233 | 
            +
              
         | 
| 234 | 
            +
              specify "should return the number of records affected when unfiltered" do
         | 
| 235 | 
            +
                @d.count.should == 3
         | 
| 236 | 
            +
                @d.delete.should == 3
         | 
| 237 | 
            +
                @d.count.should == 0
         | 
| 238 | 
            +
             | 
| 239 | 
            +
                @d.delete.should == 0
         | 
| 240 | 
            +
              end
         | 
| 241 | 
            +
            end
         | 
| 242 | 
            +
             | 
| 243 | 
            +
            context "SQLite::Dataset#update" do
         | 
| 244 | 
            +
              setup do
         | 
| 245 | 
            +
                @d = SQLITE_DB[:items]
         | 
| 246 | 
            +
                @d.delete # remove all records
         | 
| 247 | 
            +
                @d << {:name => 'abc', :value => 1.23}
         | 
| 248 | 
            +
                @d << {:name => 'def', :value => 4.56}
         | 
| 249 | 
            +
                @d << {:name => 'ghi', :value => 7.89}
         | 
| 250 | 
            +
              end
         | 
| 251 | 
            +
              
         | 
| 252 | 
            +
              specify "should return the number of records affected" do
         | 
| 253 | 
            +
                @d.filter(:name => 'abc').update(:value => 2).should == 1
         | 
| 254 | 
            +
                
         | 
| 255 | 
            +
                @d.update(:value => 10).should == 3
         | 
| 256 | 
            +
                
         | 
| 257 | 
            +
                @d.filter(:name => 'xxx').update(:value => 23).should == 0
         | 
| 258 | 
            +
              end
         | 
| 259 | 
            +
            end
         | 
| 260 | 
            +
             | 
| 261 | 
            +
            context "An SQLite dataset in array tuples mode" do
         | 
| 262 | 
            +
              setup do
         | 
| 263 | 
            +
                @d = SQLITE_DB[:items]
         | 
| 264 | 
            +
                @d.delete # remove all records
         | 
| 265 | 
            +
                
         | 
| 266 | 
            +
                Sequel.use_array_tuples
         | 
| 267 | 
            +
              end
         | 
| 268 | 
            +
              
         | 
| 269 | 
            +
              teardown do
         | 
| 270 | 
            +
                Sequel.use_hash_tuples
         | 
| 271 | 
            +
              end
         | 
| 272 | 
            +
              
         | 
| 273 | 
            +
              specify "should return the correct records" do
         | 
| 274 | 
            +
                @d.to_a.should == []
         | 
| 275 | 
            +
                @d << {:name => 'abc', :value => 1.23}
         | 
| 276 | 
            +
                @d << {:name => 'abc', :value => 4.56}
         | 
| 277 | 
            +
                @d << {:name => 'def', :value => 7.89}
         | 
| 278 | 
            +
                @d.select(:name, :value).to_a.sort_by {|h| h[:value]}.should == [
         | 
| 279 | 
            +
                  ['abc', 1.23],
         | 
| 280 | 
            +
                  ['abc', 4.56],
         | 
| 281 | 
            +
                  ['def', 7.89]
         | 
| 282 | 
            +
                ]
         | 
| 283 | 
            +
              end
         | 
| 284 | 
            +
            end  
         | 
| 285 | 
            +
             | 
| 286 | 
            +
            context "SQLite dataset" do
         | 
| 287 | 
            +
              setup do
         | 
| 288 | 
            +
                SQLITE_DB.create_table :test do
         | 
| 289 | 
            +
                  integer :id, :primary_key => true, :auto_increment => true
         | 
| 290 | 
            +
                  text :name
         | 
| 291 | 
            +
                  float :value
         | 
| 292 | 
            +
                end
         | 
| 293 | 
            +
             | 
| 294 | 
            +
                @d = SQLITE_DB[:items]
         | 
| 295 | 
            +
                @d.delete # remove all records
         | 
| 296 | 
            +
                @d << {:name => 'abc', :value => 1.23}
         | 
| 297 | 
            +
                @d << {:name => 'def', :value => 4.56}
         | 
| 298 | 
            +
                @d << {:name => 'ghi', :value => 7.89}
         | 
| 299 | 
            +
              end
         | 
| 300 | 
            +
              
         | 
| 301 | 
            +
              teardown do
         | 
| 302 | 
            +
                SQLITE_DB.drop_table :test
         | 
| 303 | 
            +
              end
         | 
| 304 | 
            +
              
         | 
| 305 | 
            +
              specify "should be able to insert from a subquery" do
         | 
| 306 | 
            +
                SQLITE_DB[:test] << @d
         | 
| 307 | 
            +
                SQLITE_DB[:test].count.should == 3
         | 
| 308 | 
            +
                SQLITE_DB[:test].select(:name, :value).order(:value).to_a.should == \
         | 
| 309 | 
            +
                  @d.select(:name, :value).order(:value).to_a
         | 
| 310 | 
            +
              end
         | 
| 311 | 
            +
            end
         | 
| 312 | 
            +
             | 
| 313 | 
            +
            context "A SQLite database" do
         | 
| 314 | 
            +
              setup do
         | 
| 315 | 
            +
                @db = SQLITE_DB
         | 
| 316 | 
            +
              end
         | 
| 317 | 
            +
             | 
| 318 | 
            +
              specify "should support add_column operations" do
         | 
| 319 | 
            +
                @db.add_column :test2, :xyz, :text
         | 
| 320 | 
            +
                
         | 
| 321 | 
            +
                @db[:test2].columns.should == [:name, :value, :xyz]
         | 
| 322 | 
            +
                @db[:test2] << {:name => 'mmm', :value => 111}
         | 
| 323 | 
            +
                @db[:test2].first[:xyz].should == '000'
         | 
| 324 | 
            +
              end
         | 
| 325 | 
            +
              
         | 
| 326 | 
            +
              specify "should not support drop_column operations" do
         | 
| 327 | 
            +
                proc {@db.drop_column :test2, :xyz}.should raise_error(SequelError)
         | 
| 328 | 
            +
              end
         | 
| 329 | 
            +
              
         | 
| 330 | 
            +
              specify "should not support rename_column operations" do
         | 
| 331 | 
            +
                @db[:test2].delete
         | 
| 332 | 
            +
                @db.add_column :test2, :xyz, :text, :default => '000'
         | 
| 333 | 
            +
                @db[:test2] << {:name => 'mmm', :value => 111, :xyz => 'qqqq'}
         | 
| 334 | 
            +
             | 
| 335 | 
            +
                @db[:test2].columns.should == [:name, :value, :xyz]
         | 
| 336 | 
            +
                proc {@db.rename_column :test2, :xyz, :zyx}.should raise_error(SequelError)
         | 
| 337 | 
            +
              end
         | 
| 338 | 
            +
              
         | 
| 339 | 
            +
              specify "should not support set_column_type operations" do
         | 
| 340 | 
            +
                @db.add_column :test2, :xyz, :float
         | 
| 341 | 
            +
                @db[:test2].delete
         | 
| 342 | 
            +
                @db[:test2] << {:name => 'mmm', :value => 111, :xyz => 56.78}
         | 
| 343 | 
            +
                proc {@db.set_column_type :test2, :xyz, :integer}.should raise_error(SequelError)
         | 
| 344 | 
            +
              end
         | 
| 345 | 
            +
            end  
         |