sequel 3.40.0 → 3.41.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +40 -0
- data/README.rdoc +2 -2
- data/doc/advanced_associations.rdoc +12 -0
- data/doc/bin_sequel.rdoc +144 -0
- data/doc/migration.rdoc +1 -1
- data/doc/object_model.rdoc +29 -0
- data/doc/release_notes/3.41.0.txt +155 -0
- data/lib/sequel/adapters/ado.rb +4 -4
- data/lib/sequel/adapters/amalgalite.rb +0 -5
- data/lib/sequel/adapters/cubrid.rb +2 -2
- data/lib/sequel/adapters/db2.rb +9 -5
- data/lib/sequel/adapters/dbi.rb +4 -6
- data/lib/sequel/adapters/do.rb +4 -5
- data/lib/sequel/adapters/firebird.rb +8 -4
- data/lib/sequel/adapters/ibmdb.rb +2 -3
- data/lib/sequel/adapters/informix.rb +0 -6
- data/lib/sequel/adapters/jdbc.rb +11 -7
- data/lib/sequel/adapters/jdbc/db2.rb +22 -0
- data/lib/sequel/adapters/jdbc/derby.rb +5 -5
- data/lib/sequel/adapters/jdbc/h2.rb +0 -5
- data/lib/sequel/adapters/jdbc/jtds.rb +1 -1
- data/lib/sequel/adapters/jdbc/sqlserver.rb +6 -0
- data/lib/sequel/adapters/mock.rb +3 -3
- data/lib/sequel/adapters/mysql.rb +7 -7
- data/lib/sequel/adapters/mysql2.rb +0 -5
- data/lib/sequel/adapters/odbc.rb +4 -4
- data/lib/sequel/adapters/openbase.rb +4 -6
- data/lib/sequel/adapters/oracle.rb +14 -6
- data/lib/sequel/adapters/postgres.rb +12 -8
- data/lib/sequel/adapters/shared/db2.rb +5 -0
- data/lib/sequel/adapters/shared/firebird.rb +10 -0
- data/lib/sequel/adapters/shared/mssql.rb +43 -1
- data/lib/sequel/adapters/shared/mysql.rb +1 -0
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +1 -1
- data/lib/sequel/adapters/shared/postgres.rb +12 -0
- data/lib/sequel/adapters/shared/sqlite.rb +32 -0
- data/lib/sequel/adapters/sqlite.rb +9 -8
- data/lib/sequel/adapters/swift.rb +3 -8
- data/lib/sequel/adapters/tinytds.rb +5 -5
- data/lib/sequel/connection_pool.rb +13 -19
- data/lib/sequel/connection_pool/sharded_single.rb +12 -12
- data/lib/sequel/connection_pool/sharded_threaded.rb +37 -17
- data/lib/sequel/connection_pool/single.rb +6 -3
- data/lib/sequel/connection_pool/threaded.rb +33 -13
- data/lib/sequel/database/connecting.rb +28 -1
- data/lib/sequel/database/logging.rb +1 -1
- data/lib/sequel/database/misc.rb +2 -5
- data/lib/sequel/database/query.rb +2 -2
- data/lib/sequel/database/schema_generator.rb +1 -1
- data/lib/sequel/database/schema_methods.rb +3 -0
- data/lib/sequel/dataset/query.rb +8 -4
- data/lib/sequel/dataset/sql.rb +7 -0
- data/lib/sequel/extensions/arbitrary_servers.rb +1 -1
- data/lib/sequel/extensions/connection_validator.rb +109 -0
- data/lib/sequel/extensions/pg_array.rb +2 -0
- data/lib/sequel/extensions/pg_hstore.rb +2 -0
- data/lib/sequel/extensions/pg_json.rb +4 -0
- data/lib/sequel/extensions/pg_range.rb +1 -0
- data/lib/sequel/extensions/pg_row.rb +4 -0
- data/lib/sequel/plugins/prepared_statements.rb +2 -1
- data/lib/sequel/plugins/single_table_inheritance.rb +53 -10
- data/lib/sequel/plugins/touch.rb +18 -6
- data/lib/sequel/plugins/validation_class_methods.rb +1 -0
- data/lib/sequel/plugins/validation_helpers.rb +3 -1
- data/lib/sequel/sql.rb +61 -19
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/firebird_spec.rb +52 -38
- data/spec/adapters/mssql_spec.rb +67 -0
- data/spec/adapters/mysql_spec.rb +192 -116
- data/spec/adapters/postgres_spec.rb +133 -70
- data/spec/adapters/spec_helper.rb +7 -0
- data/spec/adapters/sqlite_spec.rb +34 -1
- data/spec/core/connection_pool_spec.rb +79 -75
- data/spec/core/database_spec.rb +9 -4
- data/spec/core/dataset_spec.rb +15 -0
- data/spec/core/expression_filters_spec.rb +40 -2
- data/spec/extensions/connection_validator_spec.rb +118 -0
- data/spec/extensions/pg_array_spec.rb +4 -0
- data/spec/extensions/single_table_inheritance_spec.rb +42 -0
- data/spec/extensions/touch_spec.rb +40 -0
- data/spec/extensions/validation_class_methods_spec.rb +19 -1
- data/spec/extensions/validation_helpers_spec.rb +17 -0
- data/spec/integration/database_test.rb +14 -0
- data/spec/integration/dataset_test.rb +3 -3
- data/spec/integration/plugin_test.rb +41 -12
- data/spec/integration/schema_test.rb +14 -0
- data/spec/integration/spec_helper.rb +7 -0
- data/spec/integration/type_test.rb +3 -0
- metadata +9 -3
data/spec/adapters/mssql_spec.rb
CHANGED
@@ -568,3 +568,70 @@ describe "MSSQL::Database#drop_column with a schema" do
|
|
568
568
|
MSSQL_DB[:test__items].columns.should == [:id]
|
569
569
|
end
|
570
570
|
end
|
571
|
+
|
572
|
+
describe "Database#foreign_key_list" do
|
573
|
+
before(:all) do
|
574
|
+
MSSQL_DB.create_table! :items do
|
575
|
+
primary_key :id
|
576
|
+
integer :sku
|
577
|
+
end
|
578
|
+
MSSQL_DB.create_table! :prices do
|
579
|
+
integer :item_id
|
580
|
+
datetime :valid_from
|
581
|
+
float :price
|
582
|
+
primary_key [:item_id, :valid_from]
|
583
|
+
foreign_key [:item_id], :items, :key => :id, :name => :fk_prices_items
|
584
|
+
end
|
585
|
+
MSSQL_DB.create_table! :sales do
|
586
|
+
integer :id
|
587
|
+
integer :price_item_id
|
588
|
+
datetime :price_valid_from
|
589
|
+
foreign_key [:price_item_id, :price_valid_from], :prices, :key => [:item_id, :valid_from], :name => :fk_sales_prices, :on_delete => :cascade
|
590
|
+
end
|
591
|
+
end
|
592
|
+
after(:all) do
|
593
|
+
MSSQL_DB.drop_table :sales
|
594
|
+
MSSQL_DB.drop_table :prices
|
595
|
+
MSSQL_DB.drop_table :items
|
596
|
+
end
|
597
|
+
it "should support typical foreign keys" do
|
598
|
+
MSSQL_DB.foreign_key_list(:prices).should == [{:name => :fk_prices_items,
|
599
|
+
:table => :items,
|
600
|
+
:columns => [:item_id],
|
601
|
+
:key => [:id],
|
602
|
+
:on_update => :no_action,
|
603
|
+
:on_delete => :no_action }]
|
604
|
+
end
|
605
|
+
it "should support a foreign key with multiple columns" do
|
606
|
+
MSSQL_DB.foreign_key_list(:sales).should == [{:name => :fk_sales_prices,
|
607
|
+
:table => :prices,
|
608
|
+
:columns => [:price_item_id, :price_valid_from],
|
609
|
+
:key => [:item_id, :valid_from],
|
610
|
+
:on_update => :no_action,
|
611
|
+
:on_delete => :cascade }]
|
612
|
+
end
|
613
|
+
|
614
|
+
context "with multiple schemas" do
|
615
|
+
before(:all) do
|
616
|
+
MSSQL_DB.execute_ddl "create schema vendor"
|
617
|
+
MSSQL_DB.create_table! :vendor__vendors do
|
618
|
+
primary_key :id
|
619
|
+
varchar :name
|
620
|
+
end
|
621
|
+
MSSQL_DB.create_table! :vendor__mapping do
|
622
|
+
integer :vendor_id
|
623
|
+
integer :item_id
|
624
|
+
foreign_key [:vendor_id], :vendor__vendors, :name => :fk_mapping_vendor
|
625
|
+
foreign_key [:item_id], :items, :name => :fk_mapping_item
|
626
|
+
end
|
627
|
+
end
|
628
|
+
after(:all) do
|
629
|
+
MSSQL_DB.drop_table :vendor__mapping
|
630
|
+
MSSQL_DB.drop_table :vendor__vendors
|
631
|
+
MSSQL_DB.execute_ddl "drop schema vendor"
|
632
|
+
end
|
633
|
+
it "should support mixed schema bound tables" do
|
634
|
+
MSSQL_DB.foreign_key_list(:vendor__mapping).sort_by{|h| h[:name].to_s}.should == [{:name => :fk_mapping_item, :table => :items, :columns => [:item_id], :key => [:id], :on_update => :no_action, :on_delete => :no_action }, {:name => :fk_mapping_vendor, :table => :vendor__vendors, :columns => [:vendor_id], :key => [:id], :on_update => :no_action, :on_delete => :no_action }]
|
635
|
+
end
|
636
|
+
end
|
637
|
+
end
|
data/spec/adapters/mysql_spec.rb
CHANGED
@@ -39,22 +39,30 @@ describe "MySQL", '#create_table' do
|
|
39
39
|
|
40
40
|
specify "should allow to specify options for MySQL" do
|
41
41
|
@db.create_table(:dolls, :engine => 'MyISAM', :charset => 'latin2'){text :name}
|
42
|
-
|
42
|
+
check_sqls do
|
43
|
+
@db.sqls.should == ["CREATE TABLE `dolls` (`name` text) ENGINE=MyISAM DEFAULT CHARSET=latin2"]
|
44
|
+
end
|
43
45
|
end
|
44
46
|
|
45
47
|
specify "should create a temporary table" do
|
46
48
|
@db.create_table(:tmp_dolls, :temp => true, :engine => 'MyISAM', :charset => 'latin2'){text :name}
|
47
|
-
|
49
|
+
check_sqls do
|
50
|
+
@db.sqls.should == ["CREATE TEMPORARY TABLE `tmp_dolls` (`name` text) ENGINE=MyISAM DEFAULT CHARSET=latin2"]
|
51
|
+
end
|
48
52
|
end
|
49
53
|
|
50
54
|
specify "should not use a default for a String :text=>true type" do
|
51
55
|
@db.create_table(:dolls){String :name, :text=>true, :default=>'blah'}
|
52
|
-
|
56
|
+
check_sqls do
|
57
|
+
@db.sqls.should == ["CREATE TABLE `dolls` (`name` text)"]
|
58
|
+
end
|
53
59
|
end
|
54
60
|
|
55
61
|
specify "should not use a default for a File type" do
|
56
62
|
@db.create_table(:dolls){File :name, :default=>'blah'}
|
57
|
-
|
63
|
+
check_sqls do
|
64
|
+
@db.sqls.should == ["CREATE TABLE `dolls` (`name` blob)"]
|
65
|
+
end
|
58
66
|
end
|
59
67
|
|
60
68
|
specify "should respect the size option for File type" do
|
@@ -464,17 +472,23 @@ describe "A MySQL database with table options" do
|
|
464
472
|
|
465
473
|
specify "should allow to pass custom options (engine, charset, collate) for table creation" do
|
466
474
|
@db.create_table(:items, @options){Integer :size; text :name}
|
467
|
-
|
475
|
+
check_sqls do
|
476
|
+
@db.sqls.should == ["CREATE TABLE `items` (`size` integer, `name` text) ENGINE=MyISAM DEFAULT CHARSET=latin1 DEFAULT COLLATE=latin1_swedish_ci"]
|
477
|
+
end
|
468
478
|
end
|
469
479
|
|
470
480
|
specify "should use default options if specified (engine, charset, collate) for table creation" do
|
471
481
|
@db.create_table(:items){Integer :size; text :name}
|
472
|
-
|
482
|
+
check_sqls do
|
483
|
+
@db.sqls.should == ["CREATE TABLE `items` (`size` integer, `name` text) ENGINE=InnoDB DEFAULT CHARSET=utf8 DEFAULT COLLATE=utf8_general_ci"]
|
484
|
+
end
|
473
485
|
end
|
474
486
|
|
475
487
|
specify "should not use default if option has a nil value" do
|
476
488
|
@db.create_table(:items, :engine=>nil, :charset=>nil, :collate=>nil){Integer :size; text :name}
|
477
|
-
|
489
|
+
check_sqls do
|
490
|
+
@db.sqls.should == ["CREATE TABLE `items` (`size` integer, `name` text)"]
|
491
|
+
end
|
478
492
|
end
|
479
493
|
end
|
480
494
|
|
@@ -490,27 +504,35 @@ describe "A MySQL database" do
|
|
490
504
|
|
491
505
|
specify "should support defaults for boolean columns" do
|
492
506
|
@db.create_table(:items){TrueClass :active1, :default=>true; FalseClass :active2, :default => false}
|
493
|
-
|
507
|
+
check_sqls do
|
508
|
+
@db.sqls.should == ["CREATE TABLE `items` (`active1` tinyint(1) DEFAULT 1, `active2` tinyint(1) DEFAULT 0)"]
|
509
|
+
end
|
494
510
|
end
|
495
511
|
|
496
512
|
specify "should correctly format CREATE TABLE statements with foreign keys" do
|
497
513
|
@db.create_table(:items){primary_key :id; foreign_key :p_id, :items, :key => :id, :null => false, :on_delete => :cascade}
|
498
|
-
|
514
|
+
check_sqls do
|
515
|
+
@db.sqls.should == ["CREATE TABLE `items` (`id` integer PRIMARY KEY AUTO_INCREMENT, `p_id` integer NOT NULL, UNIQUE (`id`), FOREIGN KEY (`p_id`) REFERENCES `items`(`id`) ON DELETE CASCADE)"]
|
516
|
+
end
|
499
517
|
end
|
500
518
|
|
501
519
|
specify "should correctly format ALTER TABLE statements with foreign keys" do
|
502
520
|
@db.create_table(:items){Integer :id}
|
503
521
|
@db.create_table(:users){primary_key :id}
|
504
522
|
@db.alter_table(:items){add_foreign_key :p_id, :users, :key => :id, :null => false, :on_delete => :cascade}
|
505
|
-
|
506
|
-
"CREATE TABLE `
|
507
|
-
|
523
|
+
check_sqls do
|
524
|
+
@db.sqls.should == ["CREATE TABLE `items` (`id` integer)",
|
525
|
+
"CREATE TABLE `users` (`id` integer PRIMARY KEY AUTO_INCREMENT)",
|
526
|
+
"ALTER TABLE `items` ADD COLUMN `p_id` integer NOT NULL, ADD FOREIGN KEY (`p_id`) REFERENCES `users`(`id`) ON DELETE CASCADE"]
|
527
|
+
end
|
508
528
|
end
|
509
529
|
|
510
530
|
specify "should have rename_column support keep existing options" do
|
511
531
|
@db.create_table(:items){String :id, :null=>false, :default=>'blah'}
|
512
532
|
@db.alter_table(:items){rename_column :id, :nid}
|
513
|
-
|
533
|
+
check_sqls do
|
534
|
+
@db.sqls.should == ["CREATE TABLE `items` (`id` varchar(255) NOT NULL DEFAULT 'blah')", "DESCRIBE `items`", "ALTER TABLE `items` CHANGE COLUMN `id` `nid` varchar(255) NOT NULL DEFAULT 'blah'"]
|
535
|
+
end
|
514
536
|
@db[:items].insert
|
515
537
|
@db[:items].all.should == [{:nid=>'blah'}]
|
516
538
|
proc{@db[:items].insert(:nid=>nil)}.should raise_error(Sequel::DatabaseError)
|
@@ -519,7 +541,9 @@ describe "A MySQL database" do
|
|
519
541
|
specify "should have set_column_type support keep existing options" do
|
520
542
|
@db.create_table(:items){Integer :id, :null=>false, :default=>5}
|
521
543
|
@db.alter_table(:items){set_column_type :id, Bignum}
|
522
|
-
|
544
|
+
check_sqls do
|
545
|
+
@db.sqls.should == ["CREATE TABLE `items` (`id` integer NOT NULL DEFAULT 5)", "DESCRIBE `items`", "ALTER TABLE `items` CHANGE COLUMN `id` `id` bigint NOT NULL DEFAULT 5"]
|
546
|
+
end
|
523
547
|
@db[:items].insert
|
524
548
|
@db[:items].all.should == [{:id=>5}]
|
525
549
|
proc{@db[:items].insert(:id=>nil)}.should raise_error(Sequel::DatabaseError)
|
@@ -531,13 +555,17 @@ describe "A MySQL database" do
|
|
531
555
|
specify "should have set_column_type pass through options" do
|
532
556
|
@db.create_table(:items){integer :id; enum :list, :elements=>%w[one]}
|
533
557
|
@db.alter_table(:items){set_column_type :id, :int, :unsigned=>true, :size=>8; set_column_type :list, :enum, :elements=>%w[two]}
|
534
|
-
|
558
|
+
check_sqls do
|
559
|
+
@db.sqls.should == ["CREATE TABLE `items` (`id` integer, `list` enum('one'))", "DESCRIBE `items`", "ALTER TABLE `items` CHANGE COLUMN `id` `id` int(8) UNSIGNED NULL, CHANGE COLUMN `list` `list` enum('two') NULL"]
|
560
|
+
end
|
535
561
|
end
|
536
562
|
|
537
563
|
specify "should have set_column_default support keep existing options" do
|
538
564
|
@db.create_table(:items){Integer :id, :null=>false, :default=>5}
|
539
565
|
@db.alter_table(:items){set_column_default :id, 6}
|
540
|
-
|
566
|
+
check_sqls do
|
567
|
+
@db.sqls.should == ["CREATE TABLE `items` (`id` integer NOT NULL DEFAULT 5)", "DESCRIBE `items`", "ALTER TABLE `items` CHANGE COLUMN `id` `id` int(11) NOT NULL DEFAULT 6"]
|
568
|
+
end
|
541
569
|
@db[:items].insert
|
542
570
|
@db[:items].all.should == [{:id=>6}]
|
543
571
|
proc{@db[:items].insert(:id=>nil)}.should raise_error(Sequel::DatabaseError)
|
@@ -546,7 +574,9 @@ describe "A MySQL database" do
|
|
546
574
|
specify "should have set_column_allow_null support keep existing options" do
|
547
575
|
@db.create_table(:items){Integer :id, :null=>false, :default=>5}
|
548
576
|
@db.alter_table(:items){set_column_allow_null :id, true}
|
549
|
-
|
577
|
+
check_sqls do
|
578
|
+
@db.sqls.should == ["CREATE TABLE `items` (`id` integer NOT NULL DEFAULT 5)", "DESCRIBE `items`", "ALTER TABLE `items` CHANGE COLUMN `id` `id` int(11) NULL DEFAULT 5"]
|
579
|
+
end
|
550
580
|
@db[:items].insert
|
551
581
|
@db[:items].all.should == [{:id=>5}]
|
552
582
|
proc{@db[:items].insert(:id=>nil)}.should_not
|
@@ -683,11 +713,13 @@ describe "A MySQL database" do
|
|
683
713
|
|
684
714
|
specify "should support fulltext indexes and full_text_search" do
|
685
715
|
@db.create_table(:posts, :engine=>:MyISAM){text :title; text :body; full_text_index :title; full_text_index [:title, :body]}
|
686
|
-
|
687
|
-
|
688
|
-
|
689
|
-
|
690
|
-
|
716
|
+
check_sqls do
|
717
|
+
@db.sqls.should == [
|
718
|
+
"CREATE TABLE `posts` (`title` text, `body` text) ENGINE=MyISAM",
|
719
|
+
"CREATE FULLTEXT INDEX `posts_title_index` ON `posts` (`title`)",
|
720
|
+
"CREATE FULLTEXT INDEX `posts_title_body_index` ON `posts` (`title`, `body`)"
|
721
|
+
]
|
722
|
+
end
|
691
723
|
|
692
724
|
@db[:posts].insert(:title=>'ruby rails', :body=>'y')
|
693
725
|
@db[:posts].insert(:title=>'sequel', :body=>'ruby')
|
@@ -697,10 +729,12 @@ describe "A MySQL database" do
|
|
697
729
|
@db[:posts].full_text_search(:title, 'rails').all.should == [{:title=>'ruby rails', :body=>'y'}]
|
698
730
|
@db[:posts].full_text_search([:title, :body], ['sequel', 'ruby']).all.should == [{:title=>'sequel', :body=>'ruby'}]
|
699
731
|
@db[:posts].full_text_search(:title, '+ruby -rails', :boolean => true).all.should == [{:title=>'ruby scooby', :body=>'x'}]
|
700
|
-
|
701
|
-
|
702
|
-
|
703
|
-
|
732
|
+
check_sqls do
|
733
|
+
@db.sqls.should == [
|
734
|
+
"SELECT * FROM `posts` WHERE (MATCH (`title`) AGAINST ('rails'))",
|
735
|
+
"SELECT * FROM `posts` WHERE (MATCH (`title`, `body`) AGAINST ('sequel ruby'))",
|
736
|
+
"SELECT * FROM `posts` WHERE (MATCH (`title`) AGAINST ('+ruby -rails' IN BOOLEAN MODE))"]
|
737
|
+
end
|
704
738
|
|
705
739
|
@db[:posts].full_text_search(:title, :$n).call(:select, :n=>'rails').should == [{:title=>'ruby rails', :body=>'y'}]
|
706
740
|
@db[:posts].full_text_search(:title, :$n).prepare(:select, :fts_select).call(:n=>'rails').should == [{:title=>'ruby rails', :body=>'y'}]
|
@@ -708,26 +742,32 @@ describe "A MySQL database" do
|
|
708
742
|
|
709
743
|
specify "should support spatial indexes" do
|
710
744
|
@db.create_table(:posts, :engine=>:MyISAM){point :geom, :null=>false; spatial_index [:geom]}
|
711
|
-
|
712
|
-
|
713
|
-
|
714
|
-
|
745
|
+
check_sqls do
|
746
|
+
@db.sqls.should == [
|
747
|
+
"CREATE TABLE `posts` (`geom` point NOT NULL) ENGINE=MyISAM",
|
748
|
+
"CREATE SPATIAL INDEX `posts_geom_index` ON `posts` (`geom`)"
|
749
|
+
]
|
750
|
+
end
|
715
751
|
end
|
716
752
|
|
717
753
|
specify "should support indexes with index type" do
|
718
754
|
@db.create_table(:posts){Integer :id; index :id, :type => :btree}
|
719
|
-
|
720
|
-
|
721
|
-
|
722
|
-
|
755
|
+
check_sqls do
|
756
|
+
@db.sqls.should == [
|
757
|
+
"CREATE TABLE `posts` (`id` integer)",
|
758
|
+
"CREATE INDEX `posts_id_index` USING btree ON `posts` (`id`)"
|
759
|
+
]
|
760
|
+
end
|
723
761
|
end
|
724
762
|
|
725
763
|
specify "should support unique indexes with index type" do
|
726
764
|
@db.create_table(:posts){Integer :id; index :id, :type => :btree, :unique => true}
|
727
|
-
|
728
|
-
|
729
|
-
|
730
|
-
|
765
|
+
check_sqls do
|
766
|
+
@db.sqls.should == [
|
767
|
+
"CREATE TABLE `posts` (`id` integer)",
|
768
|
+
"CREATE UNIQUE INDEX `posts_id_index` USING btree ON `posts` (`id`)"
|
769
|
+
]
|
770
|
+
end
|
731
771
|
end
|
732
772
|
|
733
773
|
specify "should not dump partial indexes" do
|
@@ -755,19 +795,25 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
755
795
|
|
756
796
|
specify "#insert should insert record with default values when no arguments given" do
|
757
797
|
@d.insert
|
758
|
-
|
798
|
+
check_sqls do
|
799
|
+
MYSQL_DB.sqls.should == ["INSERT INTO `items` () VALUES ()"]
|
800
|
+
end
|
759
801
|
@d.all.should == [{:name => nil, :value => nil}]
|
760
802
|
end
|
761
803
|
|
762
804
|
specify "#insert should insert record with default values when empty hash given" do
|
763
805
|
@d.insert({})
|
764
|
-
|
806
|
+
check_sqls do
|
807
|
+
MYSQL_DB.sqls.should == ["INSERT INTO `items` () VALUES ()"]
|
808
|
+
end
|
765
809
|
@d.all.should == [{:name => nil, :value => nil}]
|
766
810
|
end
|
767
811
|
|
768
812
|
specify "#insert should insert record with default values when empty array given" do
|
769
813
|
@d.insert []
|
770
|
-
|
814
|
+
check_sqls do
|
815
|
+
MYSQL_DB.sqls.should == ["INSERT INTO `items` () VALUES ()"]
|
816
|
+
end
|
771
817
|
@d.all.should == [{:name => nil, :value => nil}]
|
772
818
|
end
|
773
819
|
|
@@ -778,10 +824,12 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
778
824
|
@d.on_duplicate_key_update(:name, :value => 6).insert(:name => 'abc', :value => 1)
|
779
825
|
@d.on_duplicate_key_update(:name, :value => 6).insert(:name => 'def', :value => 2)
|
780
826
|
|
781
|
-
|
782
|
-
|
783
|
-
|
784
|
-
|
827
|
+
check_sqls do
|
828
|
+
MYSQL_DB.sqls.length.should == 3
|
829
|
+
MYSQL_DB.sqls[0].should =~ /\AINSERT INTO `items` \(`(name|value)`, `(name|value)`\) VALUES \(('abc'|1), (1|'abc')\)\z/
|
830
|
+
MYSQL_DB.sqls[1].should =~ /\AINSERT INTO `items` \(`(name|value)`, `(name|value)`\) VALUES \(('abc'|1), (1|'abc')\) ON DUPLICATE KEY UPDATE `name`=VALUES\(`name`\), `value`=6\z/
|
831
|
+
MYSQL_DB.sqls[2].should =~ /\AINSERT INTO `items` \(`(name|value)`, `(name|value)`\) VALUES \(('def'|2), (2|'def')\) ON DUPLICATE KEY UPDATE `name`=VALUES\(`name`\), `value`=6\z/
|
832
|
+
end
|
785
833
|
|
786
834
|
@d.all.should == [{:name => 'abc', :value => 6}, {:name => 'def', :value => 2}]
|
787
835
|
end
|
@@ -789,11 +837,13 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
789
837
|
specify "#multi_replace should insert multiple records in a single statement" do
|
790
838
|
@d.multi_replace([{:name => 'abc'}, {:name => 'def'}])
|
791
839
|
|
792
|
-
|
793
|
-
|
794
|
-
|
795
|
-
|
796
|
-
|
840
|
+
check_sqls do
|
841
|
+
MYSQL_DB.sqls.should == [
|
842
|
+
SQL_BEGIN,
|
843
|
+
"REPLACE INTO `items` (`name`) VALUES ('abc'), ('def')",
|
844
|
+
SQL_COMMIT
|
845
|
+
]
|
846
|
+
end
|
797
847
|
|
798
848
|
@d.all.should == [
|
799
849
|
{:name => 'abc', :value => nil}, {:name => 'def', :value => nil}
|
@@ -804,14 +854,16 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
804
854
|
@d.multi_replace([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}],
|
805
855
|
:commit_every => 2)
|
806
856
|
|
807
|
-
|
808
|
-
|
809
|
-
|
810
|
-
|
811
|
-
|
812
|
-
|
813
|
-
|
814
|
-
|
857
|
+
check_sqls do
|
858
|
+
MYSQL_DB.sqls.should == [
|
859
|
+
SQL_BEGIN,
|
860
|
+
"REPLACE INTO `items` (`value`) VALUES (1), (2)",
|
861
|
+
SQL_COMMIT,
|
862
|
+
SQL_BEGIN,
|
863
|
+
"REPLACE INTO `items` (`value`) VALUES (3), (4)",
|
864
|
+
SQL_COMMIT
|
865
|
+
]
|
866
|
+
end
|
815
867
|
|
816
868
|
@d.all.should == [
|
817
869
|
{:name => nil, :value => 1},
|
@@ -825,14 +877,16 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
825
877
|
@d.multi_replace([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}],
|
826
878
|
:slice => 2)
|
827
879
|
|
828
|
-
|
829
|
-
|
830
|
-
|
831
|
-
|
832
|
-
|
833
|
-
|
834
|
-
|
835
|
-
|
880
|
+
check_sqls do
|
881
|
+
MYSQL_DB.sqls.should == [
|
882
|
+
SQL_BEGIN,
|
883
|
+
"REPLACE INTO `items` (`value`) VALUES (1), (2)",
|
884
|
+
SQL_COMMIT,
|
885
|
+
SQL_BEGIN,
|
886
|
+
"REPLACE INTO `items` (`value`) VALUES (3), (4)",
|
887
|
+
SQL_COMMIT
|
888
|
+
]
|
889
|
+
end
|
836
890
|
|
837
891
|
@d.all.should == [
|
838
892
|
{:name => nil, :value => 1},
|
@@ -845,11 +899,13 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
845
899
|
specify "#multi_insert should insert multiple records in a single statement" do
|
846
900
|
@d.multi_insert([{:name => 'abc'}, {:name => 'def'}])
|
847
901
|
|
848
|
-
|
849
|
-
|
850
|
-
|
851
|
-
|
852
|
-
|
902
|
+
check_sqls do
|
903
|
+
MYSQL_DB.sqls.should == [
|
904
|
+
SQL_BEGIN,
|
905
|
+
"INSERT INTO `items` (`name`) VALUES ('abc'), ('def')",
|
906
|
+
SQL_COMMIT
|
907
|
+
]
|
908
|
+
end
|
853
909
|
|
854
910
|
@d.all.should == [
|
855
911
|
{:name => 'abc', :value => nil}, {:name => 'def', :value => nil}
|
@@ -860,14 +916,16 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
860
916
|
@d.multi_insert([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}],
|
861
917
|
:commit_every => 2)
|
862
918
|
|
863
|
-
|
864
|
-
|
865
|
-
|
866
|
-
|
867
|
-
|
868
|
-
|
869
|
-
|
870
|
-
|
919
|
+
check_sqls do
|
920
|
+
MYSQL_DB.sqls.should == [
|
921
|
+
SQL_BEGIN,
|
922
|
+
"INSERT INTO `items` (`value`) VALUES (1), (2)",
|
923
|
+
SQL_COMMIT,
|
924
|
+
SQL_BEGIN,
|
925
|
+
"INSERT INTO `items` (`value`) VALUES (3), (4)",
|
926
|
+
SQL_COMMIT
|
927
|
+
]
|
928
|
+
end
|
871
929
|
|
872
930
|
@d.all.should == [
|
873
931
|
{:name => nil, :value => 1},
|
@@ -881,14 +939,16 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
881
939
|
@d.multi_insert([{:value => 1}, {:value => 2}, {:value => 3}, {:value => 4}],
|
882
940
|
:slice => 2)
|
883
941
|
|
884
|
-
|
885
|
-
|
886
|
-
|
887
|
-
|
888
|
-
|
889
|
-
|
890
|
-
|
891
|
-
|
942
|
+
check_sqls do
|
943
|
+
MYSQL_DB.sqls.should == [
|
944
|
+
SQL_BEGIN,
|
945
|
+
"INSERT INTO `items` (`value`) VALUES (1), (2)",
|
946
|
+
SQL_COMMIT,
|
947
|
+
SQL_BEGIN,
|
948
|
+
"INSERT INTO `items` (`value`) VALUES (3), (4)",
|
949
|
+
SQL_COMMIT
|
950
|
+
]
|
951
|
+
end
|
892
952
|
|
893
953
|
@d.all.should == [
|
894
954
|
{:name => nil, :value => 1},
|
@@ -901,11 +961,13 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
901
961
|
specify "#import should support inserting using columns and values arrays" do
|
902
962
|
@d.import([:name, :value], [['abc', 1], ['def', 2]])
|
903
963
|
|
904
|
-
|
905
|
-
|
906
|
-
|
907
|
-
|
908
|
-
|
964
|
+
check_sqls do
|
965
|
+
MYSQL_DB.sqls.should == [
|
966
|
+
SQL_BEGIN,
|
967
|
+
"INSERT INTO `items` (`name`, `value`) VALUES ('abc', 1), ('def', 2)",
|
968
|
+
SQL_COMMIT
|
969
|
+
]
|
970
|
+
end
|
909
971
|
|
910
972
|
@d.all.should == [
|
911
973
|
{:name => 'abc', :value => 1},
|
@@ -916,11 +978,13 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
916
978
|
specify "#insert_ignore should add the IGNORE keyword when inserting" do
|
917
979
|
@d.insert_ignore.multi_insert([{:name => 'abc'}, {:name => 'def'}])
|
918
980
|
|
919
|
-
|
920
|
-
|
921
|
-
|
922
|
-
|
923
|
-
|
981
|
+
check_sqls do
|
982
|
+
MYSQL_DB.sqls.should == [
|
983
|
+
SQL_BEGIN,
|
984
|
+
"INSERT IGNORE INTO `items` (`name`) VALUES ('abc'), ('def')",
|
985
|
+
SQL_COMMIT
|
986
|
+
]
|
987
|
+
end
|
924
988
|
|
925
989
|
@d.all.should == [
|
926
990
|
{:name => 'abc', :value => nil}, {:name => 'def', :value => nil}
|
@@ -929,19 +993,23 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
929
993
|
|
930
994
|
specify "#insert_ignore should add the IGNORE keyword for single inserts" do
|
931
995
|
@d.insert_ignore.insert(:name => 'ghi')
|
932
|
-
|
996
|
+
check_sqls do
|
997
|
+
MYSQL_DB.sqls.should == ["INSERT IGNORE INTO `items` (`name`) VALUES ('ghi')"]
|
998
|
+
end
|
933
999
|
@d.all.should == [{:name => 'ghi', :value => nil}]
|
934
1000
|
end
|
935
1001
|
|
936
1002
|
specify "#on_duplicate_key_update should add the ON DUPLICATE KEY UPDATE and ALL columns when no args given" do
|
937
1003
|
@d.on_duplicate_key_update.import([:name,:value], [['abc', 1], ['def',2]])
|
938
1004
|
|
939
|
-
|
940
|
-
|
941
|
-
|
942
|
-
|
943
|
-
|
944
|
-
|
1005
|
+
check_sqls do
|
1006
|
+
MYSQL_DB.sqls.should == [
|
1007
|
+
"SELECT * FROM `items` LIMIT 1",
|
1008
|
+
SQL_BEGIN,
|
1009
|
+
"INSERT INTO `items` (`name`, `value`) VALUES ('abc', 1), ('def', 2) ON DUPLICATE KEY UPDATE `name`=VALUES(`name`), `value`=VALUES(`value`)",
|
1010
|
+
SQL_COMMIT
|
1011
|
+
]
|
1012
|
+
end
|
945
1013
|
|
946
1014
|
@d.all.should == [
|
947
1015
|
{:name => 'abc', :value => 1}, {:name => 'def', :value => 2}
|
@@ -953,11 +1021,13 @@ describe "MySQL::Dataset#insert and related methods" do
|
|
953
1021
|
[['abc', 1], ['def',2]]
|
954
1022
|
)
|
955
1023
|
|
956
|
-
|
957
|
-
|
958
|
-
|
959
|
-
|
960
|
-
|
1024
|
+
check_sqls do
|
1025
|
+
MYSQL_DB.sqls.should == [
|
1026
|
+
SQL_BEGIN,
|
1027
|
+
"INSERT INTO `items` (`name`, `value`) VALUES ('abc', 1), ('def', 2) ON DUPLICATE KEY UPDATE `value`=VALUES(`value`)",
|
1028
|
+
SQL_COMMIT
|
1029
|
+
]
|
1030
|
+
end
|
961
1031
|
|
962
1032
|
@d.all.should == [
|
963
1033
|
{:name => 'abc', :value => 1}, {:name => 'def', :value => 2}
|
@@ -981,7 +1051,9 @@ describe "MySQL::Dataset#update and related methods" do
|
|
981
1051
|
proc{@d.where(:value => 1).update(:name => 'cow')}.should raise_error(Sequel::DatabaseError)
|
982
1052
|
MYSQL_DB.sqls.clear
|
983
1053
|
@d.update_ignore.where(:value => 1).update(:name => 'cow')
|
984
|
-
|
1054
|
+
check_sqls do
|
1055
|
+
MYSQL_DB.sqls.should == ["UPDATE IGNORE `items` SET `name` = 'cow' WHERE (`value` = 1)"]
|
1056
|
+
end
|
985
1057
|
@d.order(:name).all.should == [{:name => 'cat', :value => 1}, {:name => 'cow', :value => 0}]
|
986
1058
|
end
|
987
1059
|
end
|
@@ -1073,13 +1145,17 @@ describe "MySQL::Dataset#calc_found_rows" do
|
|
1073
1145
|
MYSQL_DB[:items].multi_insert([{:a => 1}, {:a => 1}, {:a => 2}])
|
1074
1146
|
MYSQL_DB.sqls.clear
|
1075
1147
|
|
1076
|
-
MYSQL_DB
|
1077
|
-
|
1148
|
+
MYSQL_DB.synchronize do
|
1149
|
+
MYSQL_DB[:items].calc_found_rows.filter(:a => 1).limit(1).all.should == [{:a => 1}]
|
1150
|
+
MYSQL_DB.dataset.select(Sequel.function(:FOUND_ROWS).as(:rows)).all.should == [{:rows => 2 }]
|
1151
|
+
end
|
1078
1152
|
|
1079
|
-
|
1080
|
-
|
1081
|
-
|
1082
|
-
|
1153
|
+
check_sqls do
|
1154
|
+
MYSQL_DB.sqls.should == [
|
1155
|
+
'SELECT SQL_CALC_FOUND_ROWS * FROM `items` WHERE (`a` = 1) LIMIT 1',
|
1156
|
+
'SELECT FOUND_ROWS() AS `rows`',
|
1157
|
+
]
|
1158
|
+
end
|
1083
1159
|
end
|
1084
1160
|
end
|
1085
1161
|
|