sequel 3.12.1 → 3.13.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +42 -0
- data/README.rdoc +137 -118
- data/Rakefile +21 -66
- data/doc/active_record.rdoc +9 -9
- data/doc/advanced_associations.rdoc +59 -188
- data/doc/association_basics.rdoc +15 -2
- data/doc/cheat_sheet.rdoc +38 -33
- data/doc/dataset_filtering.rdoc +16 -7
- data/doc/prepared_statements.rdoc +7 -7
- data/doc/querying.rdoc +5 -4
- data/doc/release_notes/3.13.0.txt +210 -0
- data/doc/sharding.rdoc +1 -1
- data/doc/sql.rdoc +5 -5
- data/doc/validations.rdoc +11 -11
- data/lib/sequel/adapters/ado.rb +1 -1
- data/lib/sequel/adapters/do.rb +3 -3
- data/lib/sequel/adapters/firebird.rb +3 -3
- data/lib/sequel/adapters/jdbc/h2.rb +39 -0
- data/lib/sequel/adapters/jdbc/mysql.rb +5 -0
- data/lib/sequel/adapters/jdbc/oracle.rb +3 -3
- data/lib/sequel/adapters/mysql.rb +7 -4
- data/lib/sequel/adapters/oracle.rb +3 -3
- data/lib/sequel/adapters/shared/mssql.rb +10 -1
- data/lib/sequel/adapters/shared/mysql.rb +63 -0
- data/lib/sequel/adapters/shared/postgres.rb +61 -3
- data/lib/sequel/adapters/sqlite.rb +105 -18
- data/lib/sequel/connection_pool.rb +31 -30
- data/lib/sequel/core.rb +58 -58
- data/lib/sequel/core_sql.rb +52 -43
- data/lib/sequel/database/misc.rb +11 -0
- data/lib/sequel/database/query.rb +55 -17
- data/lib/sequel/dataset/actions.rb +2 -1
- data/lib/sequel/dataset/query.rb +2 -3
- data/lib/sequel/dataset/sql.rb +24 -11
- data/lib/sequel/extensions/schema_dumper.rb +1 -1
- data/lib/sequel/metaprogramming.rb +4 -0
- data/lib/sequel/model.rb +37 -19
- data/lib/sequel/model/associations.rb +33 -25
- data/lib/sequel/model/base.rb +2 -2
- data/lib/sequel/model/plugins.rb +7 -2
- data/lib/sequel/plugins/active_model.rb +1 -1
- data/lib/sequel/plugins/association_pks.rb +2 -2
- data/lib/sequel/plugins/association_proxies.rb +1 -1
- data/lib/sequel/plugins/boolean_readers.rb +2 -2
- data/lib/sequel/plugins/class_table_inheritance.rb +10 -2
- data/lib/sequel/plugins/identity_map.rb +3 -3
- data/lib/sequel/plugins/instance_hooks.rb +1 -1
- data/lib/sequel/plugins/json_serializer.rb +212 -0
- data/lib/sequel/plugins/lazy_attributes.rb +1 -1
- data/lib/sequel/plugins/list.rb +174 -0
- data/lib/sequel/plugins/many_through_many.rb +2 -2
- data/lib/sequel/plugins/rcte_tree.rb +6 -7
- data/lib/sequel/plugins/tree.rb +118 -0
- data/lib/sequel/plugins/xml_serializer.rb +321 -0
- data/lib/sequel/sql.rb +315 -206
- data/lib/sequel/timezones.rb +40 -17
- data/lib/sequel/version.rb +8 -2
- data/spec/adapters/firebird_spec.rb +2 -2
- data/spec/adapters/informix_spec.rb +1 -1
- data/spec/adapters/mssql_spec.rb +2 -2
- data/spec/adapters/mysql_spec.rb +2 -2
- data/spec/adapters/oracle_spec.rb +1 -1
- data/spec/adapters/postgres_spec.rb +36 -6
- data/spec/adapters/spec_helper.rb +2 -2
- data/spec/adapters/sqlite_spec.rb +1 -1
- data/spec/core/connection_pool_spec.rb +3 -3
- data/spec/core/core_sql_spec.rb +31 -13
- data/spec/core/database_spec.rb +39 -2
- data/spec/core/dataset_spec.rb +24 -12
- data/spec/core/expression_filters_spec.rb +5 -1
- data/spec/core/object_graph_spec.rb +1 -1
- data/spec/core/schema_generator_spec.rb +1 -1
- data/spec/core/schema_spec.rb +1 -1
- data/spec/core/spec_helper.rb +1 -1
- data/spec/core/version_spec.rb +1 -1
- data/spec/extensions/active_model_spec.rb +82 -67
- data/spec/extensions/association_dependencies_spec.rb +1 -1
- data/spec/extensions/association_pks_spec.rb +1 -1
- data/spec/extensions/association_proxies_spec.rb +1 -1
- data/spec/extensions/blank_spec.rb +1 -1
- data/spec/extensions/boolean_readers_spec.rb +1 -1
- data/spec/extensions/caching_spec.rb +1 -1
- data/spec/extensions/class_table_inheritance_spec.rb +3 -2
- data/spec/extensions/composition_spec.rb +2 -5
- data/spec/extensions/force_encoding_spec.rb +3 -1
- data/spec/extensions/hook_class_methods_spec.rb +1 -1
- data/spec/extensions/identity_map_spec.rb +1 -1
- data/spec/extensions/inflector_spec.rb +1 -1
- data/spec/extensions/instance_filters_spec.rb +1 -1
- data/spec/extensions/instance_hooks_spec.rb +1 -1
- data/spec/extensions/json_serializer_spec.rb +154 -0
- data/spec/extensions/lazy_attributes_spec.rb +1 -2
- data/spec/extensions/list_spec.rb +251 -0
- data/spec/extensions/looser_typecasting_spec.rb +1 -1
- data/spec/extensions/many_through_many_spec.rb +3 -3
- data/spec/extensions/migration_spec.rb +1 -1
- data/spec/extensions/named_timezones_spec.rb +5 -6
- data/spec/extensions/nested_attributes_spec.rb +1 -1
- data/spec/extensions/optimistic_locking_spec.rb +1 -1
- data/spec/extensions/pagination_spec.rb +1 -1
- data/spec/extensions/pretty_table_spec.rb +1 -1
- data/spec/extensions/query_spec.rb +1 -1
- data/spec/extensions/rcte_tree_spec.rb +1 -1
- data/spec/extensions/schema_dumper_spec.rb +3 -2
- data/spec/extensions/schema_spec.rb +1 -1
- data/spec/extensions/serialization_spec.rb +6 -2
- data/spec/extensions/sharding_spec.rb +1 -1
- data/spec/extensions/single_table_inheritance_spec.rb +1 -1
- data/spec/extensions/skip_create_refresh_spec.rb +1 -1
- data/spec/extensions/spec_helper.rb +7 -3
- data/spec/extensions/sql_expr_spec.rb +1 -1
- data/spec/extensions/string_date_time_spec.rb +1 -1
- data/spec/extensions/string_stripper_spec.rb +1 -1
- data/spec/extensions/subclasses_spec.rb +1 -1
- data/spec/extensions/tactical_eager_loading_spec.rb +1 -1
- data/spec/extensions/thread_local_timezones_spec.rb +1 -1
- data/spec/extensions/timestamps_spec.rb +1 -1
- data/spec/extensions/touch_spec.rb +1 -1
- data/spec/extensions/tree_spec.rb +119 -0
- data/spec/extensions/typecast_on_load_spec.rb +1 -1
- data/spec/extensions/update_primary_key_spec.rb +1 -1
- data/spec/extensions/validation_class_methods_spec.rb +1 -1
- data/spec/extensions/validation_helpers_spec.rb +1 -1
- data/spec/extensions/xml_serializer_spec.rb +142 -0
- data/spec/integration/associations_test.rb +1 -1
- data/spec/integration/database_test.rb +1 -1
- data/spec/integration/dataset_test.rb +29 -14
- data/spec/integration/eager_loader_test.rb +1 -1
- data/spec/integration/migrator_test.rb +1 -1
- data/spec/integration/model_test.rb +1 -1
- data/spec/integration/plugin_test.rb +316 -1
- data/spec/integration/prepared_statement_test.rb +1 -1
- data/spec/integration/schema_test.rb +8 -8
- data/spec/integration/spec_helper.rb +1 -1
- data/spec/integration/timezone_test.rb +1 -1
- data/spec/integration/transaction_test.rb +35 -20
- data/spec/integration/type_test.rb +1 -1
- data/spec/model/association_reflection_spec.rb +1 -1
- data/spec/model/associations_spec.rb +49 -34
- data/spec/model/base_spec.rb +1 -1
- data/spec/model/dataset_methods_spec.rb +4 -4
- data/spec/model/eager_loading_spec.rb +1 -1
- data/spec/model/hooks_spec.rb +1 -1
- data/spec/model/inflector_spec.rb +1 -1
- data/spec/model/model_spec.rb +7 -1
- data/spec/model/plugins_spec.rb +1 -1
- data/spec/model/record_spec.rb +1 -3
- data/spec/model/spec_helper.rb +2 -2
- data/spec/model/validations_spec.rb +1 -1
- metadata +29 -5
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), 'spec_helper.rb')
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
|
2
2
|
|
3
3
|
# H2 and MSSQL don't support USING joins
|
4
4
|
unless [:h2, :mssql].include?(INTEGRATION_DB.database_type)
|
@@ -962,3 +962,318 @@ describe "AssociationPks plugin" do
|
|
962
962
|
@db[:albums_tags].filter(:album_id=>@al1).select_order_map(:tag_id).should == []
|
963
963
|
end
|
964
964
|
end
|
965
|
+
|
966
|
+
|
967
|
+
describe "List plugin without a scope" do
|
968
|
+
before do
|
969
|
+
@db = INTEGRATION_DB
|
970
|
+
@db.create_table :sites do
|
971
|
+
primary_key :id
|
972
|
+
String :name
|
973
|
+
Integer :position
|
974
|
+
end
|
975
|
+
|
976
|
+
@c = Class.new(Sequel::Model(@db[:sites]))
|
977
|
+
@c.plugin :list
|
978
|
+
@c.delete
|
979
|
+
@c.create :name => "hig", :position => 3
|
980
|
+
@c.create :name => "def", :position => 2
|
981
|
+
@c.create :name => "abc", :position => 1
|
982
|
+
end
|
983
|
+
|
984
|
+
after do
|
985
|
+
@db.drop_table(:sites)
|
986
|
+
end
|
987
|
+
|
988
|
+
it "should return rows in order of position" do
|
989
|
+
@c.map(:position).should == [1,2,3]
|
990
|
+
@c.map(:name).should == %w[ abc def hig ]
|
991
|
+
end
|
992
|
+
|
993
|
+
it "should define prev and next" do
|
994
|
+
i = @c[:name => "abc"]
|
995
|
+
i.prev.should == nil
|
996
|
+
i = @c[:name => "def"]
|
997
|
+
i.prev.should == @c[:name => "abc"]
|
998
|
+
i.next.should == @c[:name => "hig"]
|
999
|
+
i = @c[:name => "hig"]
|
1000
|
+
i.next.should == nil
|
1001
|
+
end
|
1002
|
+
|
1003
|
+
it "should define move_to" do
|
1004
|
+
@c[:name => "def"].move_to(1)
|
1005
|
+
@c.map(:name).should == %w[ def abc hig ]
|
1006
|
+
|
1007
|
+
@c[:name => "abc"].move_to(3)
|
1008
|
+
@c.map(:name).should == %w[ def hig abc ]
|
1009
|
+
|
1010
|
+
proc { @c[:name => "abc"].move_to(-1) }.should raise_error(Sequel::Error)
|
1011
|
+
proc { @c[:name => "abc"].move_to(10) }.should raise_error(Sequel::Error)
|
1012
|
+
end
|
1013
|
+
|
1014
|
+
it "should define move_to_top and move_to_bottom" do
|
1015
|
+
@c[:name => "def"].move_to_top
|
1016
|
+
@c.map(:name).should == %w[ def abc hig ]
|
1017
|
+
|
1018
|
+
@c[:name => "def"].move_to_bottom
|
1019
|
+
@c.map(:name).should == %w[ abc hig def ]
|
1020
|
+
end
|
1021
|
+
|
1022
|
+
it "should define move_up and move_down" do
|
1023
|
+
@c[:name => "def"].move_up
|
1024
|
+
@c.map(:name).should == %w[ def abc hig ]
|
1025
|
+
|
1026
|
+
@c[:name => "abc"].move_down
|
1027
|
+
@c.map(:name).should == %w[ def hig abc ]
|
1028
|
+
|
1029
|
+
@c[:name => "abc"].move_up(2)
|
1030
|
+
@c.map(:name).should == %w[ abc def hig ]
|
1031
|
+
|
1032
|
+
@c[:name => "abc"].move_down(2)
|
1033
|
+
@c.map(:name).should == %w[ def hig abc ]
|
1034
|
+
|
1035
|
+
proc { @c[:name => "def"].move_up(10) }.should raise_error(Sequel::Error)
|
1036
|
+
proc { @c[:name => "def"].move_down(10) }.should raise_error(Sequel::Error)
|
1037
|
+
end
|
1038
|
+
end
|
1039
|
+
|
1040
|
+
describe "List plugin with a scope" do
|
1041
|
+
before do
|
1042
|
+
@db = INTEGRATION_DB
|
1043
|
+
@db.create_table :pages do
|
1044
|
+
primary_key :id
|
1045
|
+
String :name
|
1046
|
+
Integer :pos
|
1047
|
+
Integer :parent_id
|
1048
|
+
end
|
1049
|
+
|
1050
|
+
@c = Class.new(Sequel::Model(@db[:pages]))
|
1051
|
+
@c.plugin :list, :field => :pos, :scope => :parent_id
|
1052
|
+
p1 = @c.create :name => "Hm", :pos => 1, :parent_id => 0
|
1053
|
+
p2 = @c.create :name => "Ps", :pos => 1, :parent_id => p1.id
|
1054
|
+
@c.create :name => "P1", :pos => 1, :parent_id => p2.id
|
1055
|
+
@c.create :name => "P2", :pos => 2, :parent_id => p2.id
|
1056
|
+
@c.create :name => "P3", :pos => 3, :parent_id => p2.id
|
1057
|
+
@c.create :name => "Au", :pos => 2, :parent_id => p1.id
|
1058
|
+
end
|
1059
|
+
|
1060
|
+
after do
|
1061
|
+
@db.drop_table(:pages)
|
1062
|
+
end
|
1063
|
+
|
1064
|
+
it "should return rows in order of position" do
|
1065
|
+
@c.map(:name).should == %w[ Hm Ps Au P1 P2 P3 ]
|
1066
|
+
end
|
1067
|
+
|
1068
|
+
it "should define prev and next" do
|
1069
|
+
@c[:name => "Ps"].next.name.should == 'Au'
|
1070
|
+
@c[:name => "Au"].prev.name.should == 'Ps'
|
1071
|
+
@c[:name => "P1"].next.name.should == 'P2'
|
1072
|
+
@c[:name => "P2"].prev.name.should == 'P1'
|
1073
|
+
|
1074
|
+
@c[:name => "P1"].next(2).name.should == 'P3'
|
1075
|
+
@c[:name => "P2"].next(-1).name.should == 'P1'
|
1076
|
+
@c[:name => "P3"].prev(2).name.should == 'P1'
|
1077
|
+
@c[:name => "P2"].prev(-1).name.should == 'P3'
|
1078
|
+
|
1079
|
+
@c[:name => "Ps"].prev.should == nil
|
1080
|
+
@c[:name => "Au"].next.should == nil
|
1081
|
+
@c[:name => "P1"].prev.should == nil
|
1082
|
+
@c[:name => "P3"].next.should == nil
|
1083
|
+
end
|
1084
|
+
|
1085
|
+
it "should define move_to" do
|
1086
|
+
@c[:name => "P2"].move_to(1)
|
1087
|
+
@c.map(:name).should == %w[ Hm Ps Au P2 P1 P3 ]
|
1088
|
+
|
1089
|
+
@c[:name => "P2"].move_to(3)
|
1090
|
+
@c.map(:name).should == %w[ Hm Ps Au P1 P3 P2 ]
|
1091
|
+
|
1092
|
+
proc { @c[:name => "P2"].move_to(-1) }.should raise_error(Sequel::Error)
|
1093
|
+
proc { @c[:name => "P2"].move_to(10) }.should raise_error(Sequel::Error)
|
1094
|
+
end
|
1095
|
+
|
1096
|
+
it "should define move_to_top and move_to_bottom" do
|
1097
|
+
@c[:name => "Au"].move_to_top
|
1098
|
+
@c.map(:name).should == %w[ Hm Au Ps P1 P2 P3 ]
|
1099
|
+
|
1100
|
+
@c[:name => "Au"].move_to_bottom
|
1101
|
+
@c.map(:name).should == %w[ Hm Ps Au P1 P2 P3 ]
|
1102
|
+
end
|
1103
|
+
|
1104
|
+
it "should define move_up and move_down" do
|
1105
|
+
@c[:name => "P2"].move_up
|
1106
|
+
@c.map(:name).should == %w[ Hm Ps Au P2 P1 P3 ]
|
1107
|
+
|
1108
|
+
@c[:name => "P1"].move_down
|
1109
|
+
@c.map(:name).should == %w[ Hm Ps Au P2 P3 P1 ]
|
1110
|
+
|
1111
|
+
proc { @c[:name => "P1"].move_up(10) }.should raise_error(Sequel::Error)
|
1112
|
+
proc { @c[:name => "P1"].move_down(10) }.should raise_error(Sequel::Error)
|
1113
|
+
end
|
1114
|
+
end
|
1115
|
+
|
1116
|
+
describe "Sequel::Plugins::Tree" do
|
1117
|
+
before do
|
1118
|
+
@db = INTEGRATION_DB
|
1119
|
+
end
|
1120
|
+
|
1121
|
+
describe "with natural database order" do
|
1122
|
+
before do
|
1123
|
+
@db.create_table!(:nodes) do
|
1124
|
+
Integer :id, :primary_key=>true
|
1125
|
+
String :name
|
1126
|
+
Integer :parent_id
|
1127
|
+
Integer :position
|
1128
|
+
end
|
1129
|
+
|
1130
|
+
@nodes = [{:id => 1, :name => 'one', :parent_id => nil, :position => 1},
|
1131
|
+
{:id => 2, :name => 'two', :parent_id => nil, :position => 2},
|
1132
|
+
{:id => 3, :name => 'three', :parent_id => nil, :position => 3},
|
1133
|
+
{:id => 4, :name => "two.one", :parent_id => 2, :position => 1},
|
1134
|
+
{:id => 5, :name => "two.two", :parent_id => 2, :position => 2},
|
1135
|
+
{:id => 6, :name => "two.two.one", :parent_id => 5, :position => 1},
|
1136
|
+
{:id => 7, :name => "one.two", :parent_id => 1, :position => 2},
|
1137
|
+
{:id => 8, :name => "one.one", :parent_id => 1, :position => 1},
|
1138
|
+
{:id => 9, :name => "five", :parent_id => nil, :position => 5},
|
1139
|
+
{:id => 10, :name => "four", :parent_id => nil, :position => 4},
|
1140
|
+
{:id => 11, :name => "five.one", :parent_id => 9, :position => 1},
|
1141
|
+
{:id => 12, :name => "two.three", :parent_id => 2, :position => 3}]
|
1142
|
+
@nodes.each{|node| @db[:nodes].insert(node)}
|
1143
|
+
|
1144
|
+
class ::Node < Sequel::Model
|
1145
|
+
plugin :tree
|
1146
|
+
end
|
1147
|
+
end
|
1148
|
+
after do
|
1149
|
+
@db.drop_table(:nodes)
|
1150
|
+
Object.send(:remove_const, :Node)
|
1151
|
+
end
|
1152
|
+
|
1153
|
+
it "should instantiate" do
|
1154
|
+
Node.all.size.should == 12
|
1155
|
+
end
|
1156
|
+
|
1157
|
+
it "should find top level nodes" do
|
1158
|
+
Node.roots_dataset.count.should == 5
|
1159
|
+
end
|
1160
|
+
|
1161
|
+
it "should find all descendants of a node" do
|
1162
|
+
two = Node.find(:id => 2)
|
1163
|
+
two.name.should == "two"
|
1164
|
+
two.descendants.map{|m| m[:id]}.should == [4, 5, 12, 6]
|
1165
|
+
end
|
1166
|
+
|
1167
|
+
it "should find all ancestors of a node" do
|
1168
|
+
twotwoone = Node.find(:id => 6)
|
1169
|
+
twotwoone.name.should == "two.two.one"
|
1170
|
+
twotwoone.ancestors.map{|m| m[:id]}.should == [5, 2]
|
1171
|
+
end
|
1172
|
+
|
1173
|
+
it "should find all siblings of a node, excepting self" do
|
1174
|
+
twoone = Node.find(:id => 4)
|
1175
|
+
twoone.name.should == "two.one"
|
1176
|
+
twoone.siblings.map{|m| m[:id]}.should == [5, 12]
|
1177
|
+
end
|
1178
|
+
|
1179
|
+
it "should find all siblings of a node, including self" do
|
1180
|
+
twoone = Node.find(:id => 4)
|
1181
|
+
twoone.name.should == "two.one"
|
1182
|
+
twoone.self_and_siblings.map{|m| m[:id]}.should == [4, 5, 12]
|
1183
|
+
end
|
1184
|
+
|
1185
|
+
it "should find siblings for root nodes" do
|
1186
|
+
three = Node.find(:id => 3)
|
1187
|
+
three.name.should == "three"
|
1188
|
+
three.self_and_siblings.map{|m| m[:id]}.should == [1, 2, 3, 9, 10]
|
1189
|
+
end
|
1190
|
+
|
1191
|
+
it "should find correct root for a node" do
|
1192
|
+
twotwoone = Node.find(:id => 6)
|
1193
|
+
twotwoone.name.should == "two.two.one"
|
1194
|
+
twotwoone.root[:id].should == 2
|
1195
|
+
|
1196
|
+
three = Node.find(:id => 3)
|
1197
|
+
three.name.should == "three"
|
1198
|
+
three.root[:id].should == 3
|
1199
|
+
|
1200
|
+
fiveone = Node.find(:id => 11)
|
1201
|
+
fiveone.name.should == "five.one"
|
1202
|
+
fiveone.root[:id].should == 9
|
1203
|
+
end
|
1204
|
+
|
1205
|
+
it "iterate top-level nodes in natural database order" do
|
1206
|
+
Node.roots_dataset.count.should == 5
|
1207
|
+
Node.roots.inject([]){|ids, p| ids << p.position}.should == [1, 2, 3, 5, 4]
|
1208
|
+
end
|
1209
|
+
|
1210
|
+
it "should have children" do
|
1211
|
+
one = Node.find(:id => 1)
|
1212
|
+
one.name.should == "one"
|
1213
|
+
one.children.size.should == 2
|
1214
|
+
end
|
1215
|
+
|
1216
|
+
it "children should be natural database order" do
|
1217
|
+
one = Node.find(:id => 1)
|
1218
|
+
one.name.should == "one"
|
1219
|
+
one.children.map{|m| m[:position]}.should == [2, 1]
|
1220
|
+
end
|
1221
|
+
|
1222
|
+
describe "Nodes in specified order" do
|
1223
|
+
before do
|
1224
|
+
class ::OrderedNode < Sequel::Model(:nodes)
|
1225
|
+
plugin :tree, :order => :position
|
1226
|
+
end
|
1227
|
+
end
|
1228
|
+
after do
|
1229
|
+
Object.send(:remove_const, :OrderedNode)
|
1230
|
+
end
|
1231
|
+
|
1232
|
+
it "iterate top-level nodes in order by position" do
|
1233
|
+
OrderedNode.roots_dataset.count.should == 5
|
1234
|
+
OrderedNode.roots.inject([]){|ids, p| ids << p.position}.should == [1, 2, 3, 4, 5]
|
1235
|
+
end
|
1236
|
+
|
1237
|
+
it "children should be in specified order" do
|
1238
|
+
one = OrderedNode.find(:id => 1)
|
1239
|
+
one.name.should == "one"
|
1240
|
+
one.children.map{|m| m[:position]}.should == [1, 2]
|
1241
|
+
end
|
1242
|
+
end
|
1243
|
+
end
|
1244
|
+
|
1245
|
+
describe "Lorems in specified order" do
|
1246
|
+
before do
|
1247
|
+
@db.create_table!(:lorems) do
|
1248
|
+
Integer :id, :primary_key=>true
|
1249
|
+
String :name
|
1250
|
+
Integer :ipsum_id
|
1251
|
+
Integer :neque
|
1252
|
+
end
|
1253
|
+
|
1254
|
+
@lorems = [{:id => 1, :name => 'Lorem', :ipsum_id => nil, :neque => 4},
|
1255
|
+
{:id => 2, :name => 'Ipsum', :ipsum_id => nil, :neque => 3},
|
1256
|
+
{:id => 4, :name => "Neque", :ipsum_id => 2, :neque => 2},
|
1257
|
+
{:id => 5, :name => "Porro", :ipsum_id => 2, :neque => 1}]
|
1258
|
+
@lorems.each{|lorem| @db[:lorems].insert(lorem)}
|
1259
|
+
|
1260
|
+
class ::Lorem < Sequel::Model
|
1261
|
+
plugin :tree, :key => :ipsum_id, :order => :neque
|
1262
|
+
end
|
1263
|
+
end
|
1264
|
+
after do
|
1265
|
+
@db.drop_table(:lorems)
|
1266
|
+
Object.send(:remove_const, :Lorem)
|
1267
|
+
end
|
1268
|
+
|
1269
|
+
it "iterate top-level nodes in order by position" do
|
1270
|
+
Lorem.roots_dataset.count.should == 2
|
1271
|
+
Lorem.roots.inject([]){|ids, p| ids << p.neque}.should == [3, 4]
|
1272
|
+
end
|
1273
|
+
|
1274
|
+
it "children should be specified order" do
|
1275
|
+
one = Lorem.find(:id => 2)
|
1276
|
+
one.children.map{|m| m[:neque]}.should == [1, 2]
|
1277
|
+
end
|
1278
|
+
end
|
1279
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), 'spec_helper.rb')
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
|
2
2
|
|
3
3
|
if INTEGRATION_DB.respond_to?(:schema_parse_table, true)
|
4
4
|
describe "Database schema parser" do
|
@@ -78,7 +78,7 @@ describe "Database schema parser" do
|
|
78
78
|
INTEGRATION_DB.schema(:items).first.last[:ruby_default].should == 'blah'
|
79
79
|
end
|
80
80
|
|
81
|
-
|
81
|
+
specify "should parse types from the schema properly" do
|
82
82
|
INTEGRATION_DB.create_table!(:items){Integer :number}
|
83
83
|
INTEGRATION_DB.schema(:items).first.last[:type].should == :integer
|
84
84
|
INTEGRATION_DB.create_table!(:items){Fixnum :number}
|
@@ -244,24 +244,24 @@ describe "Database schema modifiers" do
|
|
244
244
|
@ds.all.should == [{:n2=>'blah'}, {:n2=>'blah'}]
|
245
245
|
end
|
246
246
|
|
247
|
-
|
248
|
-
@db.create_table!(:items){String :n, :null=>false}
|
247
|
+
specify "should rename columns with not null constraints" do
|
248
|
+
@db.create_table!(:items, :engine=>:InnoDB){String :n, :null=>false}
|
249
249
|
@ds.insert(:n=>'blah')
|
250
250
|
@db.alter_table(:items){rename_column :n, :n2}
|
251
251
|
@db.schema(:items, :reload=>true).map{|x| x.first}.should == [:n2]
|
252
252
|
@ds.columns!.should == [:n2]
|
253
253
|
@ds.insert(:n2=>'blah')
|
254
254
|
@ds.all.should == [{:n2=>'blah'}, {:n2=>'blah'}]
|
255
|
-
proc{@ds.insert}.should raise_error(Sequel::DatabaseError)
|
255
|
+
proc{@ds.insert(:n=>nil)}.should raise_error(Sequel::DatabaseError)
|
256
256
|
end
|
257
257
|
|
258
|
-
|
259
|
-
@db.create_table!(:items){Integer :id}
|
258
|
+
specify "should set column NULL/NOT NULL correctly" do
|
259
|
+
@db.create_table!(:items, :engine=>:InnoDB){Integer :id}
|
260
260
|
@ds.insert(:id=>10)
|
261
261
|
@db.alter_table(:items){set_column_allow_null :id, false}
|
262
262
|
@db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id]
|
263
263
|
@ds.columns!.should == [:id]
|
264
|
-
proc{@ds.insert}.should raise_error(Sequel::DatabaseError)
|
264
|
+
proc{@ds.insert(:id=>nil)}.should raise_error(Sequel::DatabaseError)
|
265
265
|
@db.alter_table(:items){set_column_allow_null :id, true}
|
266
266
|
@ds.insert
|
267
267
|
@ds.all.should == [{:id=>10}, {:id=>nil}]
|
@@ -1,40 +1,36 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), 'spec_helper.rb')
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
|
2
2
|
|
3
3
|
describe "Database transactions" do
|
4
4
|
before do
|
5
|
-
|
6
|
-
|
7
|
-
@
|
5
|
+
@db = INTEGRATION_DB
|
6
|
+
@db.drop_table(:items) if @db.table_exists?(:items)
|
7
|
+
@db.create_table(:items, :engine=>'InnoDB'){String :name; Integer :value}
|
8
|
+
@d = @db[:items]
|
8
9
|
clear_sqls
|
9
10
|
end
|
10
11
|
after do
|
11
|
-
|
12
|
+
@db.drop_table(:items) if @db.table_exists?(:items)
|
12
13
|
end
|
13
14
|
|
14
15
|
specify "should support transactions" do
|
15
|
-
|
16
|
-
@d << {:name => 'abc', :value => 1}
|
17
|
-
end
|
18
|
-
|
16
|
+
@db.transaction{@d << {:name => 'abc', :value => 1}}
|
19
17
|
@d.count.should == 1
|
20
18
|
end
|
21
19
|
|
22
20
|
specify "should have #transaction yield the connection" do
|
23
|
-
|
24
|
-
conn.should_not == nil
|
25
|
-
end
|
21
|
+
@db.transaction{|conn| conn.should_not == nil}
|
26
22
|
end
|
27
23
|
|
28
24
|
specify "should correctly rollback transactions" do
|
29
25
|
proc do
|
30
|
-
|
26
|
+
@db.transaction do
|
31
27
|
@d << {:name => 'abc', :value => 1}
|
32
28
|
raise Interrupt, 'asdf'
|
33
29
|
end
|
34
30
|
end.should raise_error(Interrupt)
|
35
31
|
|
36
32
|
proc do
|
37
|
-
|
33
|
+
@db.transaction do
|
38
34
|
@d << {:name => 'abc', :value => 1}
|
39
35
|
raise Sequel::Rollback
|
40
36
|
end
|
@@ -44,7 +40,6 @@ describe "Database transactions" do
|
|
44
40
|
end
|
45
41
|
|
46
42
|
specify "should support nested transactions" do
|
47
|
-
@db = INTEGRATION_DB
|
48
43
|
@db.transaction do
|
49
44
|
@db.transaction do
|
50
45
|
@d << {:name => 'abc', :value => 1}
|
@@ -72,7 +67,6 @@ describe "Database transactions" do
|
|
72
67
|
|
73
68
|
if INTEGRATION_DB.supports_savepoints?
|
74
69
|
cspecify "should support nested transactions through savepoints using the savepoint option", [:jdbc, :sqlite] do
|
75
|
-
@db = INTEGRATION_DB
|
76
70
|
@db.transaction do
|
77
71
|
@d << {:name => '1'}
|
78
72
|
@db.transaction(:savepoint=>true) do
|
@@ -98,7 +92,7 @@ describe "Database transactions" do
|
|
98
92
|
end
|
99
93
|
|
100
94
|
specify "should handle returning inside of the block by committing" do
|
101
|
-
def
|
95
|
+
def @db.ret_commit
|
102
96
|
transaction do
|
103
97
|
self[:items] << {:name => 'abc'}
|
104
98
|
return
|
@@ -107,16 +101,37 @@ describe "Database transactions" do
|
|
107
101
|
end
|
108
102
|
|
109
103
|
@d.count.should == 0
|
110
|
-
|
104
|
+
@db.ret_commit
|
111
105
|
@d.count.should == 1
|
112
|
-
|
106
|
+
@db.ret_commit
|
113
107
|
@d.count.should == 2
|
114
108
|
proc do
|
115
|
-
|
109
|
+
@db.transaction do
|
116
110
|
raise Interrupt, 'asdf'
|
117
111
|
end
|
118
112
|
end.should raise_error(Interrupt)
|
119
113
|
|
120
114
|
@d.count.should == 2
|
121
115
|
end
|
116
|
+
|
117
|
+
if INTEGRATION_DB.supports_prepared_transactions?
|
118
|
+
specify "should commit prepared transactions using commit_prepared_transaction" do
|
119
|
+
@db.transaction(:prepare=>'XYZ'){@d << {:name => '1'}}
|
120
|
+
@db.commit_prepared_transaction('XYZ')
|
121
|
+
@d.select_order_map(:name).should == ['1']
|
122
|
+
end
|
123
|
+
|
124
|
+
specify "should rollback prepared transactions using rollback_prepared_transaction" do
|
125
|
+
@db.transaction(:prepare=>'XYZ'){@d << {:name => '1'}}
|
126
|
+
@db.rollback_prepared_transaction('XYZ')
|
127
|
+
@d.select_order_map(:name).should == []
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
specify "should support all transaction isolation levels" do
|
132
|
+
[:uncommitted, :committed, :repeatable, :serializable].each_with_index do |l, i|
|
133
|
+
@db.transaction(:isolation=>l){@d << {:name => 'abc', :value => 1}}
|
134
|
+
@d.count.should == i + 1
|
135
|
+
end
|
136
|
+
end
|
122
137
|
end
|