composite_primary_keys 7.0.16 → 8.0.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.
- checksums.yaml +4 -4
- data/History.rdoc +600 -623
- data/lib/composite_primary_keys.rb +113 -115
- data/lib/composite_primary_keys/associations/association.rb +23 -23
- data/lib/composite_primary_keys/associations/association_scope.rb +73 -77
- data/lib/composite_primary_keys/associations/collection_association.rb +15 -0
- data/lib/composite_primary_keys/associations/has_many_association.rb +69 -56
- data/lib/composite_primary_keys/associations/has_many_through_association.rb +30 -28
- data/lib/composite_primary_keys/associations/join_dependency.rb +87 -89
- data/lib/composite_primary_keys/associations/join_dependency/join_association.rb +22 -22
- data/lib/composite_primary_keys/associations/preloader/association.rb +90 -78
- data/lib/composite_primary_keys/associations/preloader/belongs_to.rb +19 -19
- data/lib/composite_primary_keys/associations/singular_association.rb +15 -0
- data/lib/composite_primary_keys/attribute_methods.rb +9 -0
- data/lib/composite_primary_keys/attribute_methods/dirty.rb +29 -26
- data/lib/composite_primary_keys/attribute_methods/read.rb +19 -34
- data/lib/composite_primary_keys/attribute_methods/write.rb +30 -36
- data/lib/composite_primary_keys/attribute_set/builder.rb +20 -0
- data/lib/composite_primary_keys/base.rb +135 -129
- data/lib/composite_primary_keys/composite_arrays.rb +30 -30
- data/lib/composite_primary_keys/composite_predicates.rb +50 -50
- data/lib/composite_primary_keys/composite_relation.rb +48 -48
- data/lib/composite_primary_keys/connection_adapters/abstract/connection_specification_changes.rb +2 -4
- data/lib/composite_primary_keys/connection_adapters/postgresql_adapter.rb +46 -60
- data/lib/composite_primary_keys/core.rb +69 -47
- data/lib/composite_primary_keys/fixtures.rb +22 -22
- data/lib/composite_primary_keys/persistence.rb +56 -60
- data/lib/composite_primary_keys/relation.rb +68 -56
- data/lib/composite_primary_keys/relation/calculations.rb +79 -75
- data/lib/composite_primary_keys/relation/finder_methods.rb +175 -196
- data/lib/composite_primary_keys/relation/query_methods.rb +40 -40
- data/lib/composite_primary_keys/sanitization.rb +52 -52
- data/lib/composite_primary_keys/validations/uniqueness.rb +36 -37
- data/lib/composite_primary_keys/version.rb +8 -8
- data/tasks/databases/oracle.rake +25 -25
- data/tasks/databases/sqlserver.rake +27 -40
- data/test/abstract_unit.rb +113 -113
- data/test/connections/databases.ci.yml +15 -15
- data/test/connections/databases.example.yml +18 -18
- data/test/connections/native_oracle/connection.rb +11 -11
- data/test/connections/native_oracle_enhanced/connection.rb +16 -16
- data/test/connections/native_sqlserver/connection.rb +11 -14
- data/test/fixtures/comment.rb +7 -7
- data/test/fixtures/db_definitions/db2-create-tables.sql +125 -126
- data/test/fixtures/db_definitions/db2-drop-tables.sql +18 -18
- data/test/fixtures/db_definitions/mysql.sql +207 -208
- data/test/fixtures/db_definitions/oracle.drop.sql +45 -45
- data/test/fixtures/db_definitions/oracle.sql +222 -223
- data/test/fixtures/db_definitions/postgresql.sql +209 -210
- data/test/fixtures/db_definitions/sqlite.sql +196 -197
- data/test/fixtures/db_definitions/sqlserver.drop.sql +91 -94
- data/test/fixtures/db_definitions/sqlserver.sql +225 -232
- data/test/fixtures/dorm.rb +2 -2
- data/test/fixtures/employee.rb +5 -5
- data/test/fixtures/membership.rb +6 -6
- data/test/fixtures/membership_statuses.yml +16 -16
- data/test/fixtures/memberships.yml +10 -10
- data/test/fixtures/product_tariffs.yml +14 -14
- data/test/fixtures/reference_code.rb +7 -7
- data/test/fixtures/restaurants_suburb.rb +2 -2
- data/test/fixtures/suburb.rb +5 -5
- data/test/fixtures/topic.rb +5 -5
- data/test/fixtures/topic_source.rb +6 -6
- data/test/fixtures/topic_sources.yml +3 -3
- data/test/fixtures/topics.yml +8 -8
- data/test/fixtures/users.yml +10 -10
- data/test/test_associations.rb +295 -275
- data/test/test_attribute_methods.rb +63 -63
- data/test/test_attributes.rb +60 -60
- data/test/test_calculations.rb +37 -42
- data/test/test_callbacks.rb +99 -99
- data/test/test_create.rb +112 -112
- data/test/test_delete.rb +148 -152
- data/test/test_delete_all.rb +28 -26
- data/test/test_dumpable.rb +15 -15
- data/test/test_enum.rb +21 -20
- data/test/test_equal.rb +26 -26
- data/test/test_find.rb +118 -118
- data/test/test_habtm.rb +113 -113
- data/test/test_nested_attributes.rb +124 -124
- data/test/test_polymorphic.rb +26 -26
- data/test/test_predicates.rb +40 -40
- data/test/test_santiago.rb +23 -23
- data/test/test_suite.rb +33 -34
- data/test/test_touch.rb +23 -23
- data/test/test_tutorial_example.rb +21 -21
- data/test/test_update.rb +71 -71
- metadata +9 -13
- data/lib/composite_primary_keys/arel/visitors/to_sql.rb +0 -20
- data/lib/composite_primary_keys/associations/has_and_belongs_to_many_association.rb +0 -59
- data/lib/composite_primary_keys/associations/join_dependency/join_part.rb +0 -39
- data/lib/composite_primary_keys/associations/preloader/has_and_belongs_to_many.rb +0 -46
- data/lib/composite_primary_keys/connection_adapters/sqlserver_adapter.rb +0 -17
- data/lib/composite_primary_keys/locking/optimistic.rb +0 -55
- data/test/test_optimistic.rb +0 -18
@@ -1,46 +0,0 @@
|
|
1
|
-
module ActiveRecord
|
2
|
-
module Associations
|
3
|
-
class Preloader
|
4
|
-
class HasAndBelongsToMany
|
5
|
-
def records_for(ids)
|
6
|
-
# CPK
|
7
|
-
# scope = super
|
8
|
-
predicate = cpk_in_predicate(join_table, reflection.foreign_key, ids)
|
9
|
-
scope = build_scope.where(predicate)
|
10
|
-
|
11
|
-
klass.connection.select_all(scope.arel.to_sql, 'SQL', scope.bind_values)
|
12
|
-
end
|
13
|
-
|
14
|
-
def join
|
15
|
-
# CPK
|
16
|
-
#condition = table[reflection.association_primary_key].eq(
|
17
|
-
# join_table[reflection.association_foreign_key])
|
18
|
-
condition = cpk_join_predicate(table, reflection.association_primary_key,
|
19
|
-
join_table, reflection.association_foreign_key)
|
20
|
-
|
21
|
-
table.create_join(join_table, table.create_on(condition))
|
22
|
-
end
|
23
|
-
|
24
|
-
def association_key_alias(field)
|
25
|
-
"ar_association_key_name_#{field.to_s}"
|
26
|
-
end
|
27
|
-
|
28
|
-
def join_select
|
29
|
-
# CPK
|
30
|
-
# association_key.as(Arel.sql(association_key_name))
|
31
|
-
Array(reflection.foreign_key).map do |key|
|
32
|
-
join_table[key].as(Arel.sql(association_key_alias(key)))
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def association_key_name
|
37
|
-
# CPK
|
38
|
-
# 'ar_association_key_name'
|
39
|
-
Array(reflection.foreign_key).map do |key|
|
40
|
-
association_key_alias(key)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
module ActiveRecord
|
2
|
-
module ConnectionAdapters
|
3
|
-
class SQLServerAdapter
|
4
|
-
def sql_for_insert(sql, pk, id_value, sequence_name, binds)
|
5
|
-
sql =
|
6
|
-
if pk
|
7
|
-
# support composite primary keys consisting of more than one column name
|
8
|
-
inserted_pks = [pk].flatten.map {|pk| "inserted.#{pk}"}
|
9
|
-
sql.insert(sql.index(/ (DEFAULT )?VALUES/), " OUTPUT #{inserted_pks.join(", ")}")
|
10
|
-
else
|
11
|
-
"#{sql}; SELECT CAST(SCOPE_IDENTITY() AS bigint) AS Ident"
|
12
|
-
end
|
13
|
-
[sql, binds]
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,55 +0,0 @@
|
|
1
|
-
module ActiveRecord
|
2
|
-
module Locking
|
3
|
-
module Optimistic
|
4
|
-
private
|
5
|
-
def _update_record(attribute_names = @attributes.keys) #:nodoc:
|
6
|
-
return super unless locking_enabled?
|
7
|
-
return 0 if attribute_names.empty?
|
8
|
-
|
9
|
-
lock_col = self.class.locking_column
|
10
|
-
previous_lock_value = send(lock_col).to_i
|
11
|
-
increment_lock
|
12
|
-
|
13
|
-
attribute_names += [lock_col]
|
14
|
-
attribute_names.uniq!
|
15
|
-
|
16
|
-
begin
|
17
|
-
relation = self.class.unscoped
|
18
|
-
|
19
|
-
if self.composite?
|
20
|
-
stmt = relation.where(
|
21
|
-
relation.cpk_id_predicate(relation.table, self.class.primary_key, id_was).and(
|
22
|
-
relation.table[lock_col].eq(self.class.quote_value(previous_lock_value, column_for_attribute(lock_col)))
|
23
|
-
)
|
24
|
-
).arel.compile_update(
|
25
|
-
arel_attributes_with_values_for_update(attribute_names),
|
26
|
-
self.class.primary_key
|
27
|
-
)
|
28
|
-
else
|
29
|
-
stmt = relation.where(
|
30
|
-
relation.table[self.class.primary_key].eq(id).and(
|
31
|
-
relation.table[lock_col].eq(self.class.quote_value(previous_lock_value, column_for_attribute(lock_col)))
|
32
|
-
)
|
33
|
-
).arel.compile_update(
|
34
|
-
arel_attributes_with_values_for_update(attribute_names),
|
35
|
-
self.class.primary_key
|
36
|
-
)
|
37
|
-
end
|
38
|
-
|
39
|
-
affected_rows = self.class.connection.update stmt
|
40
|
-
|
41
|
-
unless affected_rows == 1
|
42
|
-
raise ActiveRecord::StaleObjectError.new(self, "update")
|
43
|
-
end
|
44
|
-
|
45
|
-
affected_rows
|
46
|
-
|
47
|
-
# If something went wrong, revert the version.
|
48
|
-
rescue Exception
|
49
|
-
send(lock_col + '=', previous_lock_value)
|
50
|
-
raise
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
data/test/test_optimistic.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
require File.expand_path('../abstract_unit', __FILE__)
|
2
|
-
|
3
|
-
class TestOptimisitic < ActiveSupport::TestCase
|
4
|
-
fixtures :restaurants
|
5
|
-
|
6
|
-
def test_update_with_stale_error
|
7
|
-
restaurant_1 = Restaurant.find([1, 1])
|
8
|
-
restaurant_1['name'] = "McDonalds renamed"
|
9
|
-
|
10
|
-
restaurant_2 = Restaurant.find([1, 1])
|
11
|
-
restaurant_2['name'] = "McDonalds renamed 2"
|
12
|
-
|
13
|
-
assert(restaurant_1.save)
|
14
|
-
assert_raise ActiveRecord::StaleObjectError do
|
15
|
-
restaurant_2.save
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|