dynamic_migrations 3.8.1 → 3.8.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -0
- data/lib/dynamic_migrations/postgres/server/database/differences/to_migrations/extensions.rb +4 -0
- data/lib/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/enums.rb +13 -0
- data/lib/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/functions.rb +15 -0
- data/lib/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/tables/columns.rb +15 -0
- data/lib/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/tables/foreign_key_constraints.rb +15 -0
- data/lib/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/tables/indexes.rb +15 -0
- data/lib/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/tables/primary_key.rb +10 -0
- data/lib/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/tables/triggers.rb +15 -0
- data/lib/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/tables/unique_constraints.rb +15 -0
- data/lib/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/tables/validations.rb +15 -0
- data/lib/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/tables.rb +11 -0
- data/lib/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas.rb +4 -0
- data/lib/dynamic_migrations/postgres/server/database/differences/to_migrations.rb +10 -0
- data/lib/dynamic_migrations/postgres/server/database/differences.rb +58 -9
- data/lib/dynamic_migrations/postgres/server/database/schema/table/validation.rb +7 -1
- data/lib/dynamic_migrations/version.rb +1 -1
- data/lib/dynamic_migrations.rb +3 -0
- data/sig/dynamic_migrations/postgres/server/database/differences/to_migrations/extensions.rbs +3 -0
- data/sig/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/enums.rbs +2 -0
- data/sig/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/functions.rbs +2 -0
- data/sig/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/tables/columns.rbs +2 -0
- data/sig/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/tables/foreign_key_constraints.rbs +2 -0
- data/sig/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/tables/indexes.rbs +2 -0
- data/sig/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/tables/primary_key.rbs +2 -0
- data/sig/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/tables/triggers.rbs +2 -0
- data/sig/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/tables/unique_constraints.rbs +2 -0
- data/sig/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/tables/validations.rbs +2 -0
- data/sig/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/tables.rbs +2 -0
- data/sig/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas.rbs +3 -0
- data/sig/dynamic_migrations/postgres/server/database/differences/to_migrations.rbs +2 -0
- data/sig/dynamic_migrations/postgres/server/database/differences.rbs +8 -11
- data/sig/dynamic_migrations/postgres/server/database/schema/table/validation.rbs +3 -0
- data/sig/logging.rbs +11 -0
- metadata +16 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '08737568ccf7605e0a4d404063b7e1708e67c0ed96ab9f091bb72db627c0d50b'
|
4
|
+
data.tar.gz: 404f7bd4816def6c379a9277ec9c06ad4f58d188d3911f4ca9e9c1a38cf301f8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a403e1da441c1625e89034f07141d48c15fa07953404638795c2c11d58c79e26468f7b4b9070a37d18d6d62a91f069950b4d9ed824c6404071cee59fd3627d35
|
7
|
+
data.tar.gz: 3df74c476b5d84f8b98f774a69223934823670201649bf35f3aa5a6620738c0fba046bb56ac2e8139364a39ac5a6c4cbdcea547b2cf9625bf45f570261038b80
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,19 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## [3.8.3](https://github.com/craigulliott/dynamic_migrations/compare/v3.8.2...v3.8.3) (2023-10-06)
|
4
|
+
|
5
|
+
|
6
|
+
### Bug Fixes
|
7
|
+
|
8
|
+
* adding logging ([1387a75](https://github.com/craigulliott/dynamic_migrations/commit/1387a7535db242570b2b9fa60730d6bd73edb265))
|
9
|
+
|
10
|
+
## [3.8.2](https://github.com/craigulliott/dynamic_migrations/compare/v3.8.1...v3.8.2) (2023-10-06)
|
11
|
+
|
12
|
+
|
13
|
+
### Bug Fixes
|
14
|
+
|
15
|
+
* fetch_normalized_check_clause_and_column_names was using column names from the validation instead of the table it belonged to ([5157205](https://github.com/craigulliott/dynamic_migrations/commit/5157205fc52cfbf062d61054bf12c117a5df5b57))
|
16
|
+
|
3
17
|
## [3.8.1](https://github.com/craigulliott/dynamic_migrations/compare/v3.8.0...v3.8.1) (2023-10-06)
|
4
18
|
|
5
19
|
|
data/lib/dynamic_migrations/postgres/server/database/differences/to_migrations/extensions.rb
CHANGED
@@ -11,15 +11,19 @@ module DynamicMigrations
|
|
11
11
|
# if the extension exists in the configuration but not in the database
|
12
12
|
# then we have to create it
|
13
13
|
if configuration_extension[:exists] == true && !database_extension[:exists]
|
14
|
+
log.info "Extension `#{extension_name}` exists in configuration but not in the database"
|
14
15
|
# a migration to create the extension
|
15
16
|
@generator.enable_extension extension_name
|
16
17
|
|
17
18
|
# if the extension exists in the database but not in the configuration
|
18
19
|
# then we need to delete it
|
19
20
|
elsif database_extension[:exists] == true && !configuration_extension[:exists]
|
21
|
+
log.info "Extension `#{extension_name}` exists in database but not in the configuration"
|
20
22
|
# a migration to drop the extension
|
21
23
|
if Postgres.remove_unused_extensions?
|
22
24
|
@generator.disable_extension extension_name
|
25
|
+
else
|
26
|
+
log.warn "Skipping removal of extension `#{extension_name}` due to configuration setting"
|
23
27
|
end
|
24
28
|
end
|
25
29
|
end
|
data/lib/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/enums.rb
CHANGED
@@ -10,8 +10,10 @@ module DynamicMigrations
|
|
10
10
|
module Enums
|
11
11
|
def process_enums schema_name, configuration_enums, database_enums
|
12
12
|
# process all the enums
|
13
|
+
log.info " Processing tables..."
|
13
14
|
enum_names = (configuration_enums.keys + database_enums.keys).uniq
|
14
15
|
enum_names.each do |enum_name|
|
16
|
+
log.info " Processing table #{enum_name}..."
|
15
17
|
process_enum schema_name, enum_name, configuration_enums[enum_name] || {}, database_enums[enum_name] || {}
|
16
18
|
end
|
17
19
|
end
|
@@ -20,6 +22,8 @@ module DynamicMigrations
|
|
20
22
|
# If the enum exists in the configuration but not in the database
|
21
23
|
# then we have to create it.
|
22
24
|
if configuration_enum[:exists] == true && !database_enum[:exists]
|
25
|
+
log.info " Enum `#{enum_name}` exists in configuration but not in the database"
|
26
|
+
|
23
27
|
# a migration to create the enum
|
24
28
|
enum = @database.configured_schema(schema_name).enum(enum_name)
|
25
29
|
@generator.create_enum enum
|
@@ -31,6 +35,8 @@ module DynamicMigrations
|
|
31
35
|
# If the schema exists in the database but not in the configuration
|
32
36
|
# then we need to delete it.
|
33
37
|
elsif database_enum[:exists] == true && !configuration_enum[:exists]
|
38
|
+
log.info " Enum `#{enum_name}` exists in database but not in the configuration"
|
39
|
+
|
34
40
|
# a migration to create the enum
|
35
41
|
enum = @database.loaded_schema(schema_name).enum(enum_name)
|
36
42
|
@generator.drop_enum enum
|
@@ -38,6 +44,9 @@ module DynamicMigrations
|
|
38
44
|
# If the enum exists in both the configuration and database representations
|
39
45
|
# but the values is different then we need to update the values.
|
40
46
|
elsif configuration_enum[:values][:matches] == false
|
47
|
+
log.info " Enum `#{enum_name}` exists in both configuration and the database"
|
48
|
+
|
49
|
+
log.info " Enum `#{enum_name}` values are different"
|
41
50
|
original_enum = @database.loaded_schema(schema_name).enum(enum_name)
|
42
51
|
updated_enum = @database.configured_schema(schema_name).enum(enum_name)
|
43
52
|
@generator.update_enum original_enum, updated_enum
|
@@ -45,8 +54,10 @@ module DynamicMigrations
|
|
45
54
|
if configuration_enum[:description][:matches] == false
|
46
55
|
# if the description was removed
|
47
56
|
if configuration_enum[:description].nil?
|
57
|
+
log.info " Enum `#{enum_name}` description exists in database but not in the configuration"
|
48
58
|
@generator.remove_enum_comment updated_enum
|
49
59
|
else
|
60
|
+
log.info " Enum `#{enum_name}` description does not match"
|
50
61
|
@generator.set_enum_comment updated_enum
|
51
62
|
end
|
52
63
|
end
|
@@ -57,8 +68,10 @@ module DynamicMigrations
|
|
57
68
|
enum = @database.configured_schema(schema_name).enum(enum_name)
|
58
69
|
# if the description was removed
|
59
70
|
if configuration_enum[:description].nil?
|
71
|
+
log.info " Enum `#{enum_name}` description exists in database but not in the configuration"
|
60
72
|
@generator.remove_enum_comment enum
|
61
73
|
else
|
74
|
+
log.info " Enum `#{enum_name}` description does not match"
|
62
75
|
@generator.set_enum_comment enum
|
63
76
|
end
|
64
77
|
end
|
data/lib/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/functions.rb
CHANGED
@@ -10,8 +10,10 @@ module DynamicMigrations
|
|
10
10
|
module Functions
|
11
11
|
def process_functions schema_name, configuration_functions, database_functions
|
12
12
|
# process all the functions
|
13
|
+
log.info " Processing Functions..."
|
13
14
|
function_names = (configuration_functions.keys + database_functions.keys).uniq
|
14
15
|
function_names.each do |function_name|
|
16
|
+
log.info " Processing Function #{function_name}..."
|
15
17
|
process_function schema_name, function_name, configuration_functions[function_name] || {}, database_functions[function_name] || {}
|
16
18
|
end
|
17
19
|
end
|
@@ -20,6 +22,8 @@ module DynamicMigrations
|
|
20
22
|
# If the function exists in the configuration but not in the database
|
21
23
|
# then we have to create it.
|
22
24
|
if configuration_function[:exists] == true && !database_function[:exists]
|
25
|
+
log.info " Function `#{function_name}` exists in configuration but not in the database"
|
26
|
+
|
23
27
|
# a migration to create the function
|
24
28
|
function = @database.configured_schema(schema_name).function(function_name)
|
25
29
|
@generator.create_function function
|
@@ -27,6 +31,8 @@ module DynamicMigrations
|
|
27
31
|
# If the schema exists in the database but not in the configuration
|
28
32
|
# then we need to delete it.
|
29
33
|
elsif database_function[:exists] == true && !configuration_function[:exists]
|
34
|
+
log.info " Function `#{function_name}` exists in database but not in the configuration"
|
35
|
+
|
30
36
|
# a migration to create the function
|
31
37
|
function = @database.loaded_schema(schema_name).function(function_name)
|
32
38
|
@generator.drop_function function
|
@@ -34,14 +40,19 @@ module DynamicMigrations
|
|
34
40
|
# If the function exists in both the configuration and database representations
|
35
41
|
# but the definition is different then we need to update the definition.
|
36
42
|
elsif configuration_function[:normalized_definition][:matches] == false
|
43
|
+
log.info " Function `#{function_name}` exists in both configuration and the database"
|
44
|
+
|
45
|
+
log.info " Function `#{function_name}` definition is different"
|
37
46
|
function = @database.configured_schema(schema_name).function(function_name)
|
38
47
|
@generator.update_function function
|
39
48
|
# does the description also need to be updated
|
40
49
|
if configuration_function[:description][:matches] == false
|
41
50
|
# if the description was removed
|
42
51
|
if configuration_function[:description].nil?
|
52
|
+
log.info " Function `#{function_name}` description exists in database but not in the configuration"
|
43
53
|
@generator.remove_function_comment function
|
44
54
|
else
|
55
|
+
log.info " Function `#{function_name}` description does not match"
|
45
56
|
@generator.set_function_comment function
|
46
57
|
end
|
47
58
|
end
|
@@ -49,11 +60,15 @@ module DynamicMigrations
|
|
49
60
|
# If the function exists in both the configuration and database representations
|
50
61
|
# but the description is different then we need to update the description.
|
51
62
|
elsif configuration_function[:description][:matches] == false
|
63
|
+
log.info " Function `#{function_name}` exists in both configuration and the database"
|
64
|
+
|
52
65
|
function = @database.configured_schema(schema_name).function(function_name)
|
53
66
|
# if the description was removed
|
54
67
|
if configuration_function[:description].nil?
|
68
|
+
log.info " Function `#{function_name}` description exists in database but not in the configuration"
|
55
69
|
@generator.remove_function_comment function
|
56
70
|
else
|
71
|
+
log.info " Function `#{function_name}` description does not match"
|
57
72
|
@generator.set_function_comment function
|
58
73
|
end
|
59
74
|
end
|
@@ -11,8 +11,10 @@ module DynamicMigrations
|
|
11
11
|
module Columns
|
12
12
|
def process_columns schema_name, table_name, configuration_columns, database_columns
|
13
13
|
# process all the columns
|
14
|
+
log.info " Processing Columns..."
|
14
15
|
column_names = (configuration_columns.keys + database_columns.keys).uniq
|
15
16
|
column_names.each do |column_name|
|
17
|
+
log.info " Processing Column #{column_name}..."
|
16
18
|
process_column schema_name, table_name, column_name, configuration_columns[column_name] || {}, database_columns[column_name] || {}
|
17
19
|
end
|
18
20
|
end
|
@@ -21,6 +23,8 @@ module DynamicMigrations
|
|
21
23
|
# If the column exists in the configuration but not in the database
|
22
24
|
# then we have to create it.
|
23
25
|
if configuration_column[:exists] == true && !database_column[:exists]
|
26
|
+
log.info " Column `#{column_name}` exists in configuration but not in the database"
|
27
|
+
|
24
28
|
# a migration to create the column
|
25
29
|
column = @database.configured_schema(schema_name).table(table_name).column(column_name)
|
26
30
|
@generator.add_column column
|
@@ -28,6 +32,8 @@ module DynamicMigrations
|
|
28
32
|
# If the schema exists in the database but not in the configuration
|
29
33
|
# then we need to delete it.
|
30
34
|
elsif database_column[:exists] == true && !configuration_column[:exists]
|
35
|
+
log.info " Column `#{column_name}` exists in database but not in the configuration"
|
36
|
+
|
31
37
|
# a migration to create the column
|
32
38
|
column = @database.loaded_schema(schema_name).table(table_name).column(column_name)
|
33
39
|
@generator.remove_column column
|
@@ -36,6 +42,9 @@ module DynamicMigrations
|
|
36
42
|
# but the definition (except description, which is handled seeprately below) is different
|
37
43
|
# then we need to update the definition.
|
38
44
|
elsif configuration_column.except(:exists, :description).filter { |name, attributes| attributes[:matches] == false }.any?
|
45
|
+
log.info " Column `#{column_name}` exists in both configuration and the database"
|
46
|
+
|
47
|
+
log.info " Column `#{column_name}` is different"
|
39
48
|
# update the column
|
40
49
|
column = @database.configured_schema(schema_name).table(table_name).column(column_name)
|
41
50
|
@generator.change_column column
|
@@ -43,8 +52,10 @@ module DynamicMigrations
|
|
43
52
|
if configuration_column[:description][:matches] == false
|
44
53
|
# if the description was removed
|
45
54
|
if configuration_column[:description].nil?
|
55
|
+
log.info " Column `#{column_name}` description exists in database but not in the configuration"
|
46
56
|
@generator.remove_column_comment column
|
47
57
|
else
|
58
|
+
log.info " Column `#{column_name}` description does not match"
|
48
59
|
@generator.set_column_comment column
|
49
60
|
end
|
50
61
|
end
|
@@ -52,11 +63,15 @@ module DynamicMigrations
|
|
52
63
|
# If the column exists in both the configuration and database representations
|
53
64
|
# but the description is different then we need to update the description.
|
54
65
|
elsif configuration_column[:description][:matches] == false
|
66
|
+
log.info " Column `#{column_name}` exists in both configuration and the database"
|
67
|
+
|
55
68
|
column = @database.configured_schema(schema_name).table(table_name).column(column_name)
|
56
69
|
# if the description was removed
|
57
70
|
if configuration_column[:description].nil?
|
71
|
+
log.info " Column `#{column_name}` description exists in database but not in the configuration"
|
58
72
|
@generator.remove_column_comment column
|
59
73
|
else
|
74
|
+
log.info " Column `#{column_name}` description does not match"
|
60
75
|
@generator.set_column_comment column
|
61
76
|
end
|
62
77
|
end
|
@@ -11,8 +11,10 @@ module DynamicMigrations
|
|
11
11
|
module ForeignKeyConstraints
|
12
12
|
def process_foreign_key_constraints schema_name, table_name, configuration_foreign_key_constraints, database_foreign_key_constraints
|
13
13
|
# process all the foreign_key_constraints
|
14
|
+
log.info " Processing Foreign Key Constraints..."
|
14
15
|
foreign_key_constraint_names = (configuration_foreign_key_constraints.keys + database_foreign_key_constraints.keys).uniq
|
15
16
|
foreign_key_constraint_names.each do |foreign_key_constraint_name|
|
17
|
+
log.info " Processing Foreign Key Constraint #{foreign_key_constraint_name}..."
|
16
18
|
process_foreign_key_constraint schema_name, table_name, foreign_key_constraint_name, configuration_foreign_key_constraints[foreign_key_constraint_name] || {}, database_foreign_key_constraints[foreign_key_constraint_name] || {}
|
17
19
|
end
|
18
20
|
end
|
@@ -21,6 +23,8 @@ module DynamicMigrations
|
|
21
23
|
# If the foreign_key_constraint exists in the configuration but not in the database
|
22
24
|
# then we have to create it.
|
23
25
|
if configuration_foreign_key_constraint[:exists] == true && !database_foreign_key_constraint[:exists]
|
26
|
+
log.info " Foreign Key Constraint `#{foreign_key_constraint_name}` exists in configuration but not in the database"
|
27
|
+
|
24
28
|
# a migration to create the foreign_key_constraint
|
25
29
|
foreign_key_constraint = @database.configured_schema(schema_name).table(table_name).foreign_key_constraint(foreign_key_constraint_name)
|
26
30
|
@generator.add_foreign_key_constraint foreign_key_constraint
|
@@ -28,6 +32,8 @@ module DynamicMigrations
|
|
28
32
|
# If the schema exists in the database but not in the configuration
|
29
33
|
# then we need to delete it.
|
30
34
|
elsif database_foreign_key_constraint[:exists] == true && !configuration_foreign_key_constraint[:exists]
|
35
|
+
log.info " Foreign Key Constraint `#{foreign_key_constraint_name}` exists in database but not in the configuration"
|
36
|
+
|
31
37
|
# a migration to create the foreign_key_constraint
|
32
38
|
foreign_key_constraint = @database.loaded_schema(schema_name).table(table_name).foreign_key_constraint(foreign_key_constraint_name)
|
33
39
|
@generator.remove_foreign_key_constraint foreign_key_constraint
|
@@ -36,6 +42,9 @@ module DynamicMigrations
|
|
36
42
|
# but the definition (except description, which is handled seeprately below) is different
|
37
43
|
# then we need to update the definition.
|
38
44
|
elsif configuration_foreign_key_constraint.except(:exists, :description).filter { |name, attributes| attributes[:matches] == false }.any?
|
45
|
+
log.info " Foreign Key Constraint `#{foreign_key_constraint_name}` exists in both configuration and the database"
|
46
|
+
|
47
|
+
log.info " Foreign Key Constraint `#{foreign_key_constraint_name}` is different"
|
39
48
|
# recreate the foreign_key_constraint
|
40
49
|
original_foreign_key_constraint = @database.loaded_schema(schema_name).table(table_name).foreign_key_constraint(foreign_key_constraint_name)
|
41
50
|
updated_foreign_key_constraint = @database.configured_schema(schema_name).table(table_name).foreign_key_constraint(foreign_key_constraint_name)
|
@@ -44,8 +53,10 @@ module DynamicMigrations
|
|
44
53
|
if configuration_foreign_key_constraint[:description][:matches] == false
|
45
54
|
# if the description was removed
|
46
55
|
if configuration_foreign_key_constraint[:description].nil?
|
56
|
+
log.info " Foreign Key Constraint `#{foreign_key_constraint_name}` description exists in database but not in the configuration"
|
47
57
|
@generator.remove_foreign_key_constraint_comment updated_foreign_key_constraint
|
48
58
|
else
|
59
|
+
log.info " Foreign Key Constraint `#{foreign_key_constraint_name}` does not match"
|
49
60
|
@generator.set_foreign_key_constraint_comment updated_foreign_key_constraint
|
50
61
|
end
|
51
62
|
end
|
@@ -53,11 +64,15 @@ module DynamicMigrations
|
|
53
64
|
# If the foreign_key_constraint exists in both the configuration and database representations
|
54
65
|
# but the description is different then we need to update the description.
|
55
66
|
elsif configuration_foreign_key_constraint[:description][:matches] == false
|
67
|
+
log.info " Foreign Key Constraint `#{foreign_key_constraint_name}` exists in both configuration and the database"
|
68
|
+
|
56
69
|
foreign_key_constraint = @database.configured_schema(schema_name).table(table_name).foreign_key_constraint(foreign_key_constraint_name)
|
57
70
|
# if the description was removed
|
58
71
|
if configuration_foreign_key_constraint[:description].nil?
|
72
|
+
log.info " Foreign Key Constraint `#{foreign_key_constraint_name}` description exists in database but not in the configuration"
|
59
73
|
@generator.remove_foreign_key_constraint_comment foreign_key_constraint
|
60
74
|
else
|
75
|
+
log.info " Foreign Key Constraint `#{foreign_key_constraint_name}` description does not match"
|
61
76
|
@generator.set_foreign_key_constraint_comment foreign_key_constraint
|
62
77
|
end
|
63
78
|
end
|
@@ -11,8 +11,10 @@ module DynamicMigrations
|
|
11
11
|
module Indexes
|
12
12
|
def process_indexes schema_name, table_name, configuration_indexes, database_indexes
|
13
13
|
# process all the indexes
|
14
|
+
log.info " Processing Indexes..."
|
14
15
|
index_names = (configuration_indexes.keys + database_indexes.keys).uniq
|
15
16
|
index_names.each do |index_name|
|
17
|
+
log.info " Processing Index #{index_name}..."
|
16
18
|
process_index schema_name, table_name, index_name, configuration_indexes[index_name] || {}, database_indexes[index_name] || {}
|
17
19
|
end
|
18
20
|
end
|
@@ -21,6 +23,8 @@ module DynamicMigrations
|
|
21
23
|
# If the index exists in the configuration but not in the database
|
22
24
|
# then we have to create it.
|
23
25
|
if configuration_index[:exists] == true && !database_index[:exists]
|
26
|
+
log.info " Index `#{index_name}` exists in configuration but not in the database"
|
27
|
+
|
24
28
|
# a migration to create the index
|
25
29
|
index = @database.configured_schema(schema_name).table(table_name).index(index_name)
|
26
30
|
@generator.add_index index
|
@@ -28,6 +32,8 @@ module DynamicMigrations
|
|
28
32
|
# If the schema exists in the database but not in the configuration
|
29
33
|
# then we need to delete it.
|
30
34
|
elsif database_index[:exists] == true && !configuration_index[:exists]
|
35
|
+
log.info " Index `#{index_name}` exists in database but not in the configuration"
|
36
|
+
|
31
37
|
# a migration to create the index
|
32
38
|
index = @database.loaded_schema(schema_name).table(table_name).index(index_name)
|
33
39
|
@generator.remove_index index
|
@@ -36,6 +42,9 @@ module DynamicMigrations
|
|
36
42
|
# but the definition (except description, which is handled seeprately below) is different
|
37
43
|
# then we need to update the definition.
|
38
44
|
elsif configuration_index.except(:exists, :description).filter { |name, attributes| attributes[:matches] == false }.any?
|
45
|
+
log.info " Index `#{index_name}` exists in both configuration and the database"
|
46
|
+
|
47
|
+
log.info " Index `#{index_name}` is different"
|
39
48
|
# rebild the index
|
40
49
|
original_index = @database.loaded_schema(schema_name).table(table_name).index(index_name)
|
41
50
|
updated_index = @database.configured_schema(schema_name).table(table_name).index(index_name)
|
@@ -44,8 +53,10 @@ module DynamicMigrations
|
|
44
53
|
if configuration_index[:description][:matches] == false
|
45
54
|
# if the description was removed
|
46
55
|
if configuration_index[:description].nil?
|
56
|
+
log.info " Index `#{index_name}` description exists in database but not in the configuration"
|
47
57
|
@generator.remove_index_comment updated_index
|
48
58
|
else
|
59
|
+
log.info " Index `#{index_name}` does not match"
|
49
60
|
@generator.set_index_comment updated_index
|
50
61
|
end
|
51
62
|
end
|
@@ -53,11 +64,15 @@ module DynamicMigrations
|
|
53
64
|
# If the index exists in both the configuration and database representations
|
54
65
|
# but the description is different then we need to update the description.
|
55
66
|
elsif configuration_index[:description][:matches] == false
|
67
|
+
log.info " Index `#{index_name}` exists in both configuration and the database"
|
68
|
+
|
56
69
|
index = @database.configured_schema(schema_name).table(table_name).index(index_name)
|
57
70
|
# if the description was removed
|
58
71
|
if configuration_index[:description].nil?
|
72
|
+
log.info " Index `#{index_name}` description exists in database but not in the configuration"
|
59
73
|
@generator.remove_index_comment index
|
60
74
|
else
|
75
|
+
log.info " Index `#{index_name}` description does not match"
|
61
76
|
@generator.set_index_comment index
|
62
77
|
end
|
63
78
|
end
|
@@ -10,12 +10,15 @@ module DynamicMigrations
|
|
10
10
|
module Tables
|
11
11
|
module PrimaryKey
|
12
12
|
def process_primary_key schema_name, table_name, configuration_primary_key, database_primary_key
|
13
|
+
log.info " Processing Primary Key..."
|
13
14
|
configuration_primary_key_exists = configuration_primary_key && configuration_primary_key[:exists]
|
14
15
|
database_primary_key_exists = database_primary_key && database_primary_key[:exists]
|
15
16
|
|
16
17
|
# If the primary_key exists in the configuration but not in the database
|
17
18
|
# then we have to create it.
|
18
19
|
if configuration_primary_key_exists == true && database_primary_key_exists == false
|
20
|
+
log.info " Primary Key exists in configuration but not in the database"
|
21
|
+
|
19
22
|
# a migration to create the primary_key
|
20
23
|
primary_key = @database.configured_schema(schema_name).table(table_name).primary_key
|
21
24
|
@generator.add_primary_key primary_key
|
@@ -23,19 +26,26 @@ module DynamicMigrations
|
|
23
26
|
# If the schema exists in the database but not in the configuration
|
24
27
|
# then we need to delete it.
|
25
28
|
elsif configuration_primary_key_exists == false && database_primary_key_exists == true
|
29
|
+
log.info " Primary Key exists in database but not in the configuration"
|
30
|
+
|
26
31
|
# a migration to create the primary_key
|
27
32
|
primary_key = @database.loaded_schema(schema_name).table(table_name).primary_key
|
28
33
|
@generator.remove_primary_key primary_key
|
29
34
|
|
30
35
|
# If the primary_key exists in both the configuration and database representations
|
31
36
|
elsif configuration_primary_key_exists == true && database_primary_key_exists == true
|
37
|
+
log.info " Primary Key exists in both configuration and the database"
|
38
|
+
|
32
39
|
# If the definition (i.e. the column names) is different then we need to update the primary key.
|
33
40
|
if configuration_primary_key.except(:exists, :description).filter { |name, attributes| attributes[:matches] == false }.any?
|
41
|
+
log.info " Primary Key is different"
|
34
42
|
# recreate the primary_key
|
35
43
|
original_primary_key = @database.loaded_schema(schema_name).table(table_name).primary_key
|
36
44
|
updated_primary_key = @database.configured_schema(schema_name).table(table_name).primary_key
|
37
45
|
@generator.recreate_primary_key original_primary_key, updated_primary_key
|
38
46
|
end
|
47
|
+
else
|
48
|
+
log.info " Primary Key does not exist in either configuration or database"
|
39
49
|
end
|
40
50
|
end
|
41
51
|
end
|
@@ -10,9 +10,11 @@ module DynamicMigrations
|
|
10
10
|
module Tables
|
11
11
|
module Triggers
|
12
12
|
def process_triggers schema_name, table_name, configuration_triggers, database_triggers
|
13
|
+
log.info " Processing Triggers..."
|
13
14
|
# process all the triggers
|
14
15
|
trigger_names = (configuration_triggers.keys + database_triggers.keys).uniq
|
15
16
|
trigger_names.each do |trigger_name|
|
17
|
+
log.info " Processing Trigger #{trigger_name}..."
|
16
18
|
process_trigger schema_name, table_name, trigger_name, configuration_triggers[trigger_name] || {}, database_triggers[trigger_name] || {}
|
17
19
|
end
|
18
20
|
end
|
@@ -21,6 +23,8 @@ module DynamicMigrations
|
|
21
23
|
# If the trigger exists in the configuration but not in the database
|
22
24
|
# then we have to create it.
|
23
25
|
if configuration_trigger[:exists] == true && !database_trigger[:exists]
|
26
|
+
log.info " Trigger `#{trigger_name}` exists in configuration but not in the database"
|
27
|
+
|
24
28
|
# a migration to create the trigger
|
25
29
|
trigger = @database.configured_schema(schema_name).table(table_name).trigger(trigger_name)
|
26
30
|
@generator.add_trigger trigger
|
@@ -28,6 +32,8 @@ module DynamicMigrations
|
|
28
32
|
# If the schema exists in the database but not in the configuration
|
29
33
|
# then we need to delete it.
|
30
34
|
elsif database_trigger[:exists] == true && !configuration_trigger[:exists]
|
35
|
+
log.info " Trigger `#{trigger_name}` exists in database but not in the configuration"
|
36
|
+
|
31
37
|
# a migration to create the trigger
|
32
38
|
trigger = @database.loaded_schema(schema_name).table(table_name).trigger(trigger_name)
|
33
39
|
@generator.remove_trigger trigger
|
@@ -36,6 +42,9 @@ module DynamicMigrations
|
|
36
42
|
# but the definition (except description, which is handled seeprately below) is different
|
37
43
|
# then we need to update the definition.
|
38
44
|
elsif configuration_trigger.except(:exists, :description).filter { |name, attributes| attributes[:matches] == false }.any?
|
45
|
+
log.info " Trigger `#{trigger_name}` exists in both configuration and the database"
|
46
|
+
|
47
|
+
log.info " Trigger `#{trigger_name}` is different"
|
39
48
|
# recreate the trigger
|
40
49
|
original_trigger = @database.loaded_schema(schema_name).table(table_name).trigger(trigger_name)
|
41
50
|
updated_trigger = @database.configured_schema(schema_name).table(table_name).trigger(trigger_name)
|
@@ -44,8 +53,10 @@ module DynamicMigrations
|
|
44
53
|
if configuration_trigger[:description][:matches] == false
|
45
54
|
# if the description was removed
|
46
55
|
if configuration_trigger[:description].nil?
|
56
|
+
log.info " Trigger `#{trigger_name}` description exists in database but not in the configuration"
|
47
57
|
@generator.remove_trigger_comment updated_trigger
|
48
58
|
else
|
59
|
+
log.info " Trigger `#{trigger_name}` description does not match"
|
49
60
|
@generator.set_trigger_comment updated_trigger
|
50
61
|
end
|
51
62
|
end
|
@@ -53,11 +64,15 @@ module DynamicMigrations
|
|
53
64
|
# If the trigger exists in both the configuration and database representations
|
54
65
|
# but the description is different then we need to update the description.
|
55
66
|
elsif configuration_trigger[:description][:matches] == false
|
67
|
+
log.info " Trigger `#{trigger_name}` exists in both configuration and the database"
|
68
|
+
|
56
69
|
trigger = @database.configured_schema(schema_name).table(table_name).trigger(trigger_name)
|
57
70
|
# if the description was removed
|
58
71
|
if configuration_trigger[:description].nil?
|
72
|
+
log.info " Trigger `#{trigger_name}` description exists in database but not in the configuration"
|
59
73
|
@generator.remove_trigger_comment trigger
|
60
74
|
else
|
75
|
+
log.info " Trigger `#{trigger_name}` description does not match"
|
61
76
|
@generator.set_trigger_comment trigger
|
62
77
|
end
|
63
78
|
end
|
@@ -10,9 +10,11 @@ module DynamicMigrations
|
|
10
10
|
module Tables
|
11
11
|
module UniqueConstraints
|
12
12
|
def process_unique_constraints schema_name, table_name, configuration_unique_constraints, database_unique_constraints
|
13
|
+
log.info " Processing Unique Constraints..."
|
13
14
|
# process all the unique_constraints
|
14
15
|
unique_constraint_names = (configuration_unique_constraints.keys + database_unique_constraints.keys).uniq
|
15
16
|
unique_constraint_names.each do |unique_constraint_name|
|
17
|
+
log.info " Processing Unique Constraint #{unique_constraint_name}..."
|
16
18
|
process_unique_constraint schema_name, table_name, unique_constraint_name, configuration_unique_constraints[unique_constraint_name] || {}, database_unique_constraints[unique_constraint_name] || {}
|
17
19
|
end
|
18
20
|
end
|
@@ -21,6 +23,8 @@ module DynamicMigrations
|
|
21
23
|
# If the unique_constraint exists in the configuration but not in the database
|
22
24
|
# then we have to create it.
|
23
25
|
if configuration_unique_constraint[:exists] == true && !database_unique_constraint[:exists]
|
26
|
+
log.info " Unique Constraint `#{unique_constraint_name}` exists in configuration but not in the database"
|
27
|
+
|
24
28
|
# a migration to create the unique_constraint
|
25
29
|
unique_constraint = @database.configured_schema(schema_name).table(table_name).unique_constraint(unique_constraint_name)
|
26
30
|
@generator.add_unique_constraint unique_constraint
|
@@ -28,6 +32,8 @@ module DynamicMigrations
|
|
28
32
|
# If the schema exists in the database but not in the configuration
|
29
33
|
# then we need to delete it.
|
30
34
|
elsif database_unique_constraint[:exists] == true && !configuration_unique_constraint[:exists]
|
35
|
+
log.info " Unique Constraint `#{unique_constraint_name}` exists in database but not in the configuration"
|
36
|
+
|
31
37
|
# a migration to create the unique_constraint
|
32
38
|
unique_constraint = @database.loaded_schema(schema_name).table(table_name).unique_constraint(unique_constraint_name)
|
33
39
|
@generator.remove_unique_constraint unique_constraint
|
@@ -36,6 +42,9 @@ module DynamicMigrations
|
|
36
42
|
# but the definition (except description, which is handled seeprately below) is different
|
37
43
|
# then we need to update the definition.
|
38
44
|
elsif configuration_unique_constraint.except(:exists, :description).filter { |name, attributes| attributes[:matches] == false }.any?
|
45
|
+
log.info " Unique Constraint `#{unique_constraint_name}` exists in both configuration and the database"
|
46
|
+
|
47
|
+
log.info " Unique Constraint `#{unique_constraint_name}` is different"
|
39
48
|
# recreate the unique_constraint
|
40
49
|
original_unique_constraint = @database.loaded_schema(schema_name).table(table_name).unique_constraint(unique_constraint_name)
|
41
50
|
updated_unique_constraint = @database.configured_schema(schema_name).table(table_name).unique_constraint(unique_constraint_name)
|
@@ -44,8 +53,10 @@ module DynamicMigrations
|
|
44
53
|
if configuration_unique_constraint[:description][:matches] == false
|
45
54
|
# if the description was removed
|
46
55
|
if configuration_unique_constraint[:description].nil?
|
56
|
+
log.info " Unique Constraint `#{unique_constraint_name}` description exists in database but not in the configuration"
|
47
57
|
@generator.remove_unique_constraint_comment updated_unique_constraint
|
48
58
|
else
|
59
|
+
log.info " Unique Constraint `#{unique_constraint_name}` description does not match"
|
49
60
|
@generator.set_unique_constraint_comment updated_unique_constraint
|
50
61
|
end
|
51
62
|
end
|
@@ -53,11 +64,15 @@ module DynamicMigrations
|
|
53
64
|
# If the unique_constraint exists in both the configuration and database representations
|
54
65
|
# but the description is different then we need to update the description.
|
55
66
|
elsif configuration_unique_constraint[:description][:matches] == false
|
67
|
+
log.info " Unique Constraint `#{unique_constraint_name}` exists in both configuration and the database"
|
68
|
+
|
56
69
|
unique_constraint = @database.configured_schema(schema_name).table(table_name).unique_constraint(unique_constraint_name)
|
57
70
|
# if the description was removed
|
58
71
|
if configuration_unique_constraint[:description].nil?
|
72
|
+
log.info " Unique Constraint `#{unique_constraint_name}` description exists in database but not in the configuration"
|
59
73
|
@generator.remove_unique_constraint_comment unique_constraint
|
60
74
|
else
|
75
|
+
log.info " Unique Constraint `#{unique_constraint_name}` description does not match"
|
61
76
|
@generator.set_unique_constraint_comment unique_constraint
|
62
77
|
end
|
63
78
|
end
|
@@ -11,8 +11,10 @@ module DynamicMigrations
|
|
11
11
|
module Validations
|
12
12
|
def process_validations schema_name, table_name, configuration_validations, database_validations
|
13
13
|
# process all the validations
|
14
|
+
log.info " Processing Validations..."
|
14
15
|
validation_names = (configuration_validations.keys + database_validations.keys).uniq
|
15
16
|
validation_names.each do |validation_name|
|
17
|
+
log.info " Processing Validation #{validation_name}..."
|
16
18
|
process_validation schema_name, table_name, validation_name, configuration_validations[validation_name] || {}, database_validations[validation_name] || {}
|
17
19
|
end
|
18
20
|
end
|
@@ -21,6 +23,8 @@ module DynamicMigrations
|
|
21
23
|
# If the validation exists in the configuration but not in the database
|
22
24
|
# then we have to create it.
|
23
25
|
if configuration_validation[:exists] == true && !database_validation[:exists]
|
26
|
+
log.info " Validation `#{validation_name}` exists in configuration but not in the database"
|
27
|
+
|
24
28
|
# a migration to create the validation
|
25
29
|
validation = @database.configured_schema(schema_name).table(table_name).validation(validation_name)
|
26
30
|
@generator.add_validation validation
|
@@ -28,6 +32,8 @@ module DynamicMigrations
|
|
28
32
|
# If the schema exists in the database but not in the configuration
|
29
33
|
# then we need to delete it.
|
30
34
|
elsif database_validation[:exists] == true && !configuration_validation[:exists]
|
35
|
+
log.info " Validation `#{validation_name}` exists in database but not in the configuration"
|
36
|
+
|
31
37
|
# a migration to create the validation
|
32
38
|
validation = @database.loaded_schema(schema_name).table(table_name).validation(validation_name)
|
33
39
|
@generator.remove_validation validation
|
@@ -36,6 +42,9 @@ module DynamicMigrations
|
|
36
42
|
# but the definition (except description, which is handled seeprately below) is different
|
37
43
|
# then we need to update the definition.
|
38
44
|
elsif configuration_validation.except(:exists, :description).filter { |name, attributes| attributes[:matches] == false }.any?
|
45
|
+
log.info " Validation `#{validation_name}` exists in both configuration and the database"
|
46
|
+
|
47
|
+
log.info " Validation `#{validation_name}` is different"
|
39
48
|
# recreate the validation
|
40
49
|
original_validation = @database.loaded_schema(schema_name).table(table_name).validation(validation_name)
|
41
50
|
updated_validation = @database.configured_schema(schema_name).table(table_name).validation(validation_name)
|
@@ -44,8 +53,10 @@ module DynamicMigrations
|
|
44
53
|
if configuration_validation[:description][:matches] == false
|
45
54
|
# if the description was removed
|
46
55
|
if configuration_validation[:description].nil?
|
56
|
+
log.info " Validation `#{validation_name}` description exists in database but not in the configuration"
|
47
57
|
@generator.remove_validation_comment updated_validation
|
48
58
|
else
|
59
|
+
log.info " Validation `#{validation_name}` does not match"
|
49
60
|
@generator.set_validation_comment updated_validation
|
50
61
|
end
|
51
62
|
end
|
@@ -53,11 +64,15 @@ module DynamicMigrations
|
|
53
64
|
# If the validation exists in both the configuration and database representations
|
54
65
|
# but the description is different then we need to update the description.
|
55
66
|
elsif configuration_validation[:description][:matches] == false
|
67
|
+
log.info " Validation `#{validation_name}` exists in both configuration and the database"
|
68
|
+
|
56
69
|
validation = @database.configured_schema(schema_name).table(table_name).validation(validation_name)
|
57
70
|
# if the description was removed
|
58
71
|
if configuration_validation[:description].nil?
|
72
|
+
log.info " Validation `#{validation_name}` description exists in database but not in the configuration"
|
59
73
|
@generator.remove_validation_comment validation
|
60
74
|
else
|
75
|
+
log.info " Validation `#{validation_name}` does not match"
|
61
76
|
@generator.set_validation_comment validation
|
62
77
|
end
|
63
78
|
end
|
data/lib/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/tables.rb
CHANGED
@@ -10,8 +10,10 @@ module DynamicMigrations
|
|
10
10
|
module Tables
|
11
11
|
def process_tables schema_name, configuration_tables, database_tables
|
12
12
|
# process all the tables
|
13
|
+
log.info " Processing Tables..."
|
13
14
|
table_names = (configuration_tables.keys + database_tables.keys).uniq
|
14
15
|
table_names.each do |table_name|
|
16
|
+
log.info " Processing Table #{table_name}..."
|
15
17
|
process_table schema_name, table_name, configuration_tables[table_name] || {}, database_tables[table_name] || {}
|
16
18
|
end
|
17
19
|
end
|
@@ -20,6 +22,8 @@ module DynamicMigrations
|
|
20
22
|
# If the table exists in the configuration but not in the database
|
21
23
|
# then we have to create it.
|
22
24
|
if configuration_table[:exists] == true && !database_table[:exists]
|
25
|
+
log.info " Table `#{table_name}` exists in configuration but not in the database"
|
26
|
+
|
23
27
|
# a migration to create the table
|
24
28
|
table = @database.configured_schema(schema_name).table(table_name)
|
25
29
|
@generator.create_table table
|
@@ -31,6 +35,8 @@ module DynamicMigrations
|
|
31
35
|
# If the schema exists in the database but not in the configuration
|
32
36
|
# then we need to delete it.
|
33
37
|
elsif database_table[:exists] == true && !configuration_table[:exists]
|
38
|
+
log.info " Table `#{table_name}` exists in database but not in the configuration"
|
39
|
+
|
34
40
|
# we process everything else before we drop the table, because the other
|
35
41
|
# database objects are dependent on the table
|
36
42
|
process_dependents schema_name, table_name, {}, database_table
|
@@ -42,11 +48,15 @@ module DynamicMigrations
|
|
42
48
|
# If the table exists in both the configuration and database representations
|
43
49
|
# but the description is different then we need to update the description.
|
44
50
|
elsif configuration_table[:description][:matches] == false
|
51
|
+
log.info " Table `#{table_name}` exists in both configuration and the database"
|
52
|
+
|
45
53
|
table = @database.configured_schema(schema_name).table(table_name)
|
46
54
|
# if the description was removed
|
47
55
|
if configuration_table[:description].nil?
|
56
|
+
log.info " Table `#{table_name}` description exists in database but not in the configuration"
|
48
57
|
@generator.remove_table_comment table
|
49
58
|
else
|
59
|
+
log.info " Table `#{table_name}` description does not match"
|
50
60
|
@generator.set_table_comment table
|
51
61
|
end
|
52
62
|
|
@@ -54,6 +64,7 @@ module DynamicMigrations
|
|
54
64
|
process_dependents schema_name, table_name, configuration_table, database_table
|
55
65
|
|
56
66
|
else
|
67
|
+
log.info " Table `#{table_name}` exists in both configuration and the database"
|
57
68
|
# process everything else
|
58
69
|
process_dependents schema_name, table_name, configuration_table, database_table
|
59
70
|
|
@@ -11,6 +11,8 @@ module DynamicMigrations
|
|
11
11
|
# if the schema exists in the configuration but not in the database
|
12
12
|
# then we have to create it
|
13
13
|
if configuration_schema[:exists] == true && !database_schema[:exists]
|
14
|
+
log.info "Schema `#{schema_name}` exists in configuration but not in the database"
|
15
|
+
|
14
16
|
# a migration to create the schema
|
15
17
|
schema = @database.configured_schema schema_name
|
16
18
|
@generator.create_schema schema
|
@@ -24,6 +26,7 @@ module DynamicMigrations
|
|
24
26
|
# if the schema exists in the database but not in the configuration
|
25
27
|
# then we need to delete it
|
26
28
|
elsif database_schema[:exists] == true && !configuration_schema[:exists]
|
29
|
+
log.info "Schema `#{schema_name}` exists in database but not in the configuration"
|
27
30
|
# we process the tables and functions before we drop the schema
|
28
31
|
# as this will drop any dependencies on the schema
|
29
32
|
process_functions schema_name, {}, database_schema[:functions]
|
@@ -37,6 +40,7 @@ module DynamicMigrations
|
|
37
40
|
# if the schema exists in both the configuration and database representations
|
38
41
|
# then we just need to process the tables and functions
|
39
42
|
else
|
43
|
+
log.info "Schema `#{schema_name}` exists in both configuration and the database"
|
40
44
|
process_functions schema_name, configuration_schema[:functions], database_schema[:functions]
|
41
45
|
process_enums schema_name, configuration_schema[:enums], database_schema[:enums]
|
42
46
|
process_tables schema_name, configuration_schema[:tables], database_schema[:tables]
|
@@ -26,6 +26,8 @@ module DynamicMigrations
|
|
26
26
|
include Schemas::Tables::Validations
|
27
27
|
|
28
28
|
def initialize database, differences
|
29
|
+
@logger = Logging.logger[self]
|
30
|
+
|
29
31
|
raise UnexpectedDatabaseObjectError, database unless database.is_a? Database
|
30
32
|
@database = database
|
31
33
|
|
@@ -38,15 +40,19 @@ module DynamicMigrations
|
|
38
40
|
|
39
41
|
def migrations
|
40
42
|
# process all the extensions
|
43
|
+
log.info "Processing Extensions..."
|
41
44
|
extension_names = differences[:configuration][:extensions].keys
|
42
45
|
extension_names.each do |extension_name|
|
46
|
+
log.info "Processing Extension `#{extension_name}`..."
|
43
47
|
process_extension extension_name, differences[:configuration][:extensions][extension_name], differences[:database][:extensions][extension_name]
|
44
48
|
end
|
45
49
|
|
46
50
|
# process all the schemas (we can fetch the schema names from either the
|
47
51
|
# configuration or the database object)
|
52
|
+
log.info "Processing Schemas..."
|
48
53
|
schema_names = differences[:configuration][:schemas].keys
|
49
54
|
schema_names.each do |schema_name|
|
55
|
+
log.info "Processing Schema `#{schema_name}`..."
|
50
56
|
process_schema schema_name, differences[:configuration][:schemas][schema_name], differences[:database][:schemas][schema_name]
|
51
57
|
end
|
52
58
|
|
@@ -59,6 +65,10 @@ module DynamicMigrations
|
|
59
65
|
def differences
|
60
66
|
@differences_hash ||= @differences.to_h
|
61
67
|
end
|
68
|
+
|
69
|
+
def log
|
70
|
+
@logger
|
71
|
+
end
|
62
72
|
end
|
63
73
|
end
|
64
74
|
end
|
@@ -18,6 +18,8 @@ module DynamicMigrations
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def initialize database
|
21
|
+
@logger = Logging.logger[self]
|
22
|
+
|
21
23
|
raise ExpectedDatabaseError, database unless database.is_a? Database
|
22
24
|
@database = database
|
23
25
|
end
|
@@ -31,19 +33,28 @@ module DynamicMigrations
|
|
31
33
|
# return a hash representing any differenced betweek the loaded and configured
|
32
34
|
# versions of the current database
|
33
35
|
def to_h
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
36
|
+
log.info "Building differences between configured and loaded database structure..."
|
37
|
+
|
38
|
+
# build progressively, so we can add logging around the two different opperations
|
39
|
+
results = {}
|
40
|
+
|
41
|
+
log.info "Comparing configured database structure to loaded database structure..."
|
42
|
+
results[:configuration] = {
|
43
|
+
schemas: self.class.compare_schemas(@database.configured_schemas_hash, @database.loaded_schemas_hash),
|
44
|
+
extensions: self.class.compare_extensions(@database.configured_extensions, @database.loaded_extensions)
|
45
|
+
}
|
46
|
+
|
47
|
+
log.info "Comparing loaded database structure to configured database structure..."
|
48
|
+
results[:database] = {
|
49
|
+
schemas: self.class.compare_schemas(@database.loaded_schemas_hash, @database.configured_schemas_hash),
|
50
|
+
extensions: self.class.compare_extensions(@database.loaded_extensions, @database.configured_extensions)
|
43
51
|
}
|
52
|
+
results
|
44
53
|
end
|
45
54
|
|
46
55
|
def self.compare_extensions extensions, comparison_extensions
|
56
|
+
log.info "Comparing Extensions..."
|
57
|
+
|
47
58
|
result = {}
|
48
59
|
# the extensions
|
49
60
|
extensions.each do |extension_name|
|
@@ -65,6 +76,8 @@ module DynamicMigrations
|
|
65
76
|
end
|
66
77
|
|
67
78
|
def self.compare_schemas schemas, comparison_schemas
|
79
|
+
log.info "Comparing Schemas..."
|
80
|
+
|
68
81
|
result = {}
|
69
82
|
# the base schemas
|
70
83
|
schemas.each do |schema_name, schema|
|
@@ -88,6 +101,8 @@ module DynamicMigrations
|
|
88
101
|
def self.compare_schema schema, comparison_schema
|
89
102
|
raise SchemaRequiredError if schema.nil?
|
90
103
|
|
104
|
+
log.info "Comparing Schema `#{schema.name}`"
|
105
|
+
|
91
106
|
comparison_tables = comparison_schema.nil? ? {} : comparison_schema.tables_hash
|
92
107
|
comparison_functions = comparison_schema.nil? ? {} : comparison_schema.functions_hash
|
93
108
|
comparison_enums = comparison_schema.nil? ? {} : comparison_schema.enums_hash
|
@@ -103,6 +118,8 @@ module DynamicMigrations
|
|
103
118
|
# an object which represents the provided `tables` and any differences
|
104
119
|
# between it and the `comparison_tables`
|
105
120
|
def self.compare_tables tables, comparison_tables
|
121
|
+
log.info "Comparing Tables..."
|
122
|
+
|
106
123
|
result = {}
|
107
124
|
# the base tables
|
108
125
|
tables.each do |table_name, table|
|
@@ -126,6 +143,8 @@ module DynamicMigrations
|
|
126
143
|
def self.compare_table table, comparison_table
|
127
144
|
raise TableRequiredError if table.nil?
|
128
145
|
|
146
|
+
log.info "Comparing Table `#{table.name}`"
|
147
|
+
|
129
148
|
primary_key = table.has_primary_key? ? table.primary_key : nil
|
130
149
|
if comparison_table
|
131
150
|
comparison_primary_key = comparison_table.has_primary_key? ? comparison_table.primary_key : nil
|
@@ -168,6 +187,8 @@ module DynamicMigrations
|
|
168
187
|
# an object which represents the provided `functions` and any differences
|
169
188
|
# between it and the `comparison_functions`
|
170
189
|
def self.compare_functions functions, comparison_functions
|
190
|
+
log.info "Comparing Functions..."
|
191
|
+
|
171
192
|
result = {}
|
172
193
|
# the base functions
|
173
194
|
functions.each do |function_name, function|
|
@@ -191,6 +212,8 @@ module DynamicMigrations
|
|
191
212
|
# an object which represents the provided `enums` and any differences
|
192
213
|
# between it and the `comparison_enums`
|
193
214
|
def self.compare_enums enums, comparison_enums
|
215
|
+
log.info "Comparing Enums..."
|
216
|
+
|
194
217
|
result = {}
|
195
218
|
# the base enums
|
196
219
|
enums.each do |enum_name, enum|
|
@@ -214,6 +237,8 @@ module DynamicMigrations
|
|
214
237
|
# an object which represents the provided `columns` and any differences
|
215
238
|
# between it and the `comparison_columns`
|
216
239
|
def self.compare_columns columns, comparison_columns
|
240
|
+
log.info "Comparing Columns..."
|
241
|
+
|
217
242
|
result = {}
|
218
243
|
# the base columns
|
219
244
|
columns.each do |column_name, column|
|
@@ -241,6 +266,8 @@ module DynamicMigrations
|
|
241
266
|
# an object which represents the provided `triggers` and any differences
|
242
267
|
# between it and the `comparison_triggers`
|
243
268
|
def self.compare_triggers triggers, comparison_triggers
|
269
|
+
log.info "Comparing Triggers..."
|
270
|
+
|
244
271
|
result = {}
|
245
272
|
# the base triggers
|
246
273
|
triggers.each do |trigger_name, trigger|
|
@@ -272,6 +299,8 @@ module DynamicMigrations
|
|
272
299
|
# an object which represents the provided `unique_constraints` and any differences
|
273
300
|
# between it and the `comparison_unique_constraints`
|
274
301
|
def self.compare_unique_constraints unique_constraints, comparison_unique_constraints
|
302
|
+
log.info "Comparing Unique Constraints..."
|
303
|
+
|
275
304
|
result = {}
|
276
305
|
# the base unique_constraints
|
277
306
|
unique_constraints.each do |name, unique_constraint|
|
@@ -298,6 +327,8 @@ module DynamicMigrations
|
|
298
327
|
# an object which represents the provided `indexes` and any differences
|
299
328
|
# between it and the `comparison_indexes`
|
300
329
|
def self.compare_indexes indexes, comparison_indexes
|
330
|
+
log.info "Comparing Indexes..."
|
331
|
+
|
301
332
|
result = {}
|
302
333
|
# the base indexes
|
303
334
|
indexes.each do |name, index|
|
@@ -327,6 +358,8 @@ module DynamicMigrations
|
|
327
358
|
# an object which represents the provided `validations` and any differences
|
328
359
|
# between it and the `comparison_validations`
|
329
360
|
def self.compare_validations validations, comparison_validations
|
361
|
+
log.info "Comparing Validations..."
|
362
|
+
|
330
363
|
result = {}
|
331
364
|
# the base validations
|
332
365
|
validations.each do |name, validation|
|
@@ -354,6 +387,8 @@ module DynamicMigrations
|
|
354
387
|
# an object which represents the provided `foreign_key_constraints` and any differences
|
355
388
|
# between it and the `comparison_foreign_key_constraints`
|
356
389
|
def self.compare_foreign_key_constraints foreign_key_constraints, comparison_foreign_key_constraints
|
390
|
+
log.info "Comparing Foreign Key Constraints..."
|
391
|
+
|
357
392
|
result = {}
|
358
393
|
# the base foreign_key_constraints
|
359
394
|
foreign_key_constraints.each do |name, foreign_key_constraint|
|
@@ -391,8 +426,14 @@ module DynamicMigrations
|
|
391
426
|
exists: false
|
392
427
|
}
|
393
428
|
else
|
429
|
+
type = base.class.name.split("::").last
|
430
|
+
name = base.is_a?(Schema::Table::PrimaryKey) ? nil : base.name
|
431
|
+
log.info " Comparing #{type} `#{name}`"
|
432
|
+
|
394
433
|
result = {}
|
395
434
|
method_list.each do |method_name|
|
435
|
+
log.info " Comparing `#{method_name}`"
|
436
|
+
|
396
437
|
matches = (comparison && comparison.send(method_name) == base.send(method_name)) || false
|
397
438
|
result[method_name] = {
|
398
439
|
value: base.send(method_name),
|
@@ -403,6 +444,14 @@ module DynamicMigrations
|
|
403
444
|
result
|
404
445
|
end
|
405
446
|
end
|
447
|
+
|
448
|
+
def self.log
|
449
|
+
@logger ||= Logging.logger[self]
|
450
|
+
end
|
451
|
+
|
452
|
+
def log
|
453
|
+
@logger
|
454
|
+
end
|
406
455
|
end
|
407
456
|
end
|
408
457
|
end
|
@@ -14,6 +14,9 @@ module DynamicMigrations
|
|
14
14
|
class ExpectedArrayOfColumnsError < StandardError
|
15
15
|
end
|
16
16
|
|
17
|
+
class ExpectedTableColumnsError < StandardError
|
18
|
+
end
|
19
|
+
|
17
20
|
class DuplicateColumnError < StandardError
|
18
21
|
end
|
19
22
|
|
@@ -122,6 +125,9 @@ module DynamicMigrations
|
|
122
125
|
end
|
123
126
|
|
124
127
|
def fetch_normalized_check_clause_and_column_names
|
128
|
+
if table.columns.empty?
|
129
|
+
raise ExpectedTableColumnsError, "Can not normalize check clause or validation columnns because the table has no columns"
|
130
|
+
end
|
125
131
|
result = table.schema.database.with_connection do |connection|
|
126
132
|
# wrapped in a transaction just in case something here fails, because
|
127
133
|
# we don't want the temporary table to be persisted
|
@@ -130,7 +136,7 @@ module DynamicMigrations
|
|
130
136
|
# create the temp table and add the expected columns and constraint
|
131
137
|
connection.exec(<<~SQL)
|
132
138
|
CREATE TEMP TABLE validation_normalized_check_clause_temp_table (
|
133
|
-
#{columns.map { |column| '"' + column.name.to_s + '" ' + column.temp_table_data_type.to_s }.join(", ")},
|
139
|
+
#{table.columns.map { |column| '"' + column.name.to_s + '" ' + column.temp_table_data_type.to_s }.join(", ")},
|
134
140
|
CONSTRAINT #{name} CHECK (#{check_clause})
|
135
141
|
);
|
136
142
|
SQL
|
data/lib/dynamic_migrations.rb
CHANGED
data/sig/dynamic_migrations/postgres/server/database/differences/to_migrations/extensions.rbs
CHANGED
@@ -10,6 +10,9 @@ module DynamicMigrations
|
|
10
10
|
module Extensions
|
11
11
|
|
12
12
|
private
|
13
|
+
# this method is available on the ToMigrations class which includes this module
|
14
|
+
def log: -> Logging::Logger
|
15
|
+
|
13
16
|
def process_extension: (Symbol extension_name, untyped configuration_extension, untyped database_extension) -> void
|
14
17
|
|
15
18
|
|
data/sig/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/enums.rbs
CHANGED
@@ -13,6 +13,8 @@ module DynamicMigrations
|
|
13
13
|
private
|
14
14
|
def process_enums: (Symbol schema_name, untyped configuration_enums, untyped database_enums) -> void
|
15
15
|
def process_enum: (Symbol schema_name, Symbol enum_name, untyped configuration_enum, untyped database_enum) -> void
|
16
|
+
# this method is available on the ToMigrations class which includes this module
|
17
|
+
def log: -> Logging::Logger
|
16
18
|
|
17
19
|
end
|
18
20
|
end
|
data/sig/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/functions.rbs
CHANGED
@@ -13,6 +13,8 @@ module DynamicMigrations
|
|
13
13
|
private
|
14
14
|
def process_functions: (Symbol schema_name, untyped configuration_functions, untyped database_functions) -> void
|
15
15
|
def process_function: (Symbol schema_name, Symbol function_name, untyped configuration_function, untyped database_function) -> void
|
16
|
+
# this method is available on the ToMigrations class which includes this module
|
17
|
+
def log: -> Logging::Logger
|
16
18
|
|
17
19
|
end
|
18
20
|
end
|
@@ -14,6 +14,8 @@ module DynamicMigrations
|
|
14
14
|
private
|
15
15
|
def process_columns: (Symbol schema_name, Symbol table_name, untyped configuration_columns, untyped database_columns) -> void
|
16
16
|
def process_column: (Symbol schema_name, Symbol table_name, Symbol column_name, untyped configuration_column, untyped database_column) -> void
|
17
|
+
# this method is available on the ToMigrations class which includes this module
|
18
|
+
def log: -> Logging::Logger
|
17
19
|
|
18
20
|
end
|
19
21
|
end
|
@@ -14,6 +14,8 @@ module DynamicMigrations
|
|
14
14
|
private
|
15
15
|
def process_foreign_key_constraints: (Symbol schema_name, Symbol table_name, untyped configuration_foreign_key_constraints, untyped database_foreign_key_constraints) -> void
|
16
16
|
def process_foreign_key_constraint: (Symbol schema_name, Symbol table_name, Symbol foreign_key_constraint_name, untyped configuration_foreign_key_constraint, untyped database_foreign_key_constraint) -> void
|
17
|
+
# this method is available on the ToMigrations class which includes this module
|
18
|
+
def log: -> Logging::Logger
|
17
19
|
|
18
20
|
end
|
19
21
|
end
|
@@ -14,6 +14,8 @@ module DynamicMigrations
|
|
14
14
|
private
|
15
15
|
def process_indexes: (Symbol schema_name, Symbol table_name, untyped configuration_indexes, untyped database_indexes) -> void
|
16
16
|
def process_index: (Symbol schema_name, Symbol table_name, Symbol index_name, untyped configuration_index, untyped database_index) -> void
|
17
|
+
# this method is available on the ToMigrations class which includes this module
|
18
|
+
def log: -> Logging::Logger
|
17
19
|
|
18
20
|
end
|
19
21
|
end
|
@@ -13,6 +13,8 @@ module DynamicMigrations
|
|
13
13
|
|
14
14
|
private
|
15
15
|
def process_primary_key: (Symbol schema_name, Symbol table_name, untyped configuration_primary_key, untyped database_primary_key) -> void
|
16
|
+
# this method is available on the ToMigrations class which includes this module
|
17
|
+
def log: -> Logging::Logger
|
16
18
|
|
17
19
|
end
|
18
20
|
end
|
@@ -14,6 +14,8 @@ module DynamicMigrations
|
|
14
14
|
private
|
15
15
|
def process_triggers: (Symbol schema_name, Symbol table_name, untyped configuration_triggers, untyped database_triggers) -> void
|
16
16
|
def process_trigger: (Symbol schema_name, Symbol table_name, Symbol trigger_name, untyped configuration_trigger, untyped database_trigger) -> void
|
17
|
+
# this method is available on the ToMigrations class which includes this module
|
18
|
+
def log: -> Logging::Logger
|
17
19
|
|
18
20
|
end
|
19
21
|
end
|
@@ -14,6 +14,8 @@ module DynamicMigrations
|
|
14
14
|
private
|
15
15
|
def process_unique_constraints: (Symbol schema_name, Symbol table_name, untyped configuration_unique_constraints, untyped database_unique_constraints) -> void
|
16
16
|
def process_unique_constraint: (Symbol schema_name, Symbol table_name, Symbol unique_constraint_name, untyped configuration_unique_constraint, untyped database_unique_constraint) -> void
|
17
|
+
# this method is available on the ToMigrations class which includes this module
|
18
|
+
def log: -> Logging::Logger
|
17
19
|
|
18
20
|
end
|
19
21
|
end
|
@@ -14,6 +14,8 @@ module DynamicMigrations
|
|
14
14
|
private
|
15
15
|
def process_validations: (Symbol schema_name, Symbol table_name, untyped configuration_validations, untyped database_validations) -> void
|
16
16
|
def process_validation: (Symbol schema_name, Symbol table_name, Symbol validation_name, untyped configuration_validation, untyped database_validation) -> void
|
17
|
+
# this method is available on the ToMigrations class which includes this module
|
18
|
+
def log: -> Logging::Logger
|
17
19
|
|
18
20
|
end
|
19
21
|
end
|
data/sig/dynamic_migrations/postgres/server/database/differences/to_migrations/schemas/tables.rbs
CHANGED
@@ -22,6 +22,8 @@ module DynamicMigrations
|
|
22
22
|
def process_triggers: (Symbol schema_name, Symbol table_name, untyped configuration_triggers, untyped database_triggers) -> void
|
23
23
|
def process_unique_constraints: (Symbol schema_name, Symbol table_name, untyped configuration_unique_constraints, untyped database_unique_constraints) -> void
|
24
24
|
def process_validations: (Symbol schema_name, Symbol table_name, untyped configuration_validations, untyped database_validations) -> void
|
25
|
+
# this method is available on the ToMigrations class which includes this module
|
26
|
+
def log: -> Logging::Logger
|
25
27
|
|
26
28
|
end
|
27
29
|
end
|
@@ -21,6 +21,9 @@ module DynamicMigrations
|
|
21
21
|
# this method comes from the Tables module
|
22
22
|
def process_tables: (Symbol schema_name, untyped configuration_tables, untyped database_tables) -> void
|
23
23
|
|
24
|
+
# this method is available on the ToMigrations class which includes this module
|
25
|
+
def log: -> Logging::Logger
|
26
|
+
|
24
27
|
end
|
25
28
|
end
|
26
29
|
end
|
@@ -8,6 +8,7 @@ module DynamicMigrations
|
|
8
8
|
class Differences
|
9
9
|
class ToMigrations
|
10
10
|
@database: Database
|
11
|
+
@logger: Logging::Logger
|
11
12
|
@differences_hash: untyped
|
12
13
|
@generator: Generator
|
13
14
|
@differences: Differences
|
@@ -30,6 +31,7 @@ module DynamicMigrations
|
|
30
31
|
|
31
32
|
private
|
32
33
|
def differences: -> Hash[untyped, untyped]
|
34
|
+
def log: -> Logging::Logger
|
33
35
|
|
34
36
|
# this method comes from the Schemas module
|
35
37
|
def process_schema: (Symbol schema_name, untyped configuration_schema, untyped database_schema) -> void
|
@@ -4,18 +4,11 @@ module DynamicMigrations
|
|
4
4
|
class Database
|
5
5
|
class Differences
|
6
6
|
@database: Database
|
7
|
+
@logger: Logging::Logger
|
8
|
+
self.@logger: Logging::Logger
|
7
9
|
|
8
10
|
def initialize: (Database database) -> void
|
9
|
-
def to_h: ->
|
10
|
-
configuration: {
|
11
|
-
schemas: Hash[Symbol, untyped],
|
12
|
-
extensions: Hash[Symbol, {exists: bool}]
|
13
|
-
},
|
14
|
-
database: {
|
15
|
-
schemas: Hash[Symbol, untyped],
|
16
|
-
extensions: Hash[Symbol, {exists: bool}]
|
17
|
-
}
|
18
|
-
}
|
11
|
+
def to_h: -> untyped
|
19
12
|
def to_migrations: -> Hash[Symbol, Array[{name: Symbol, content: String}]]
|
20
13
|
|
21
14
|
def self.compare_schemas: (Hash[Symbol, Schema] schemas, Hash[Symbol, Schema] comparison_schemas) -> Hash[Symbol, untyped]
|
@@ -34,7 +27,11 @@ module DynamicMigrations
|
|
34
27
|
def self.compare_indexes: (Hash[Symbol, Schema::Table::Index] indexes, Hash[Symbol, Schema::Table::Index] comparison_indexes) -> Hash[Symbol, untyped]
|
35
28
|
def self.compare_validations: (Hash[Symbol, Schema::Table::Validation] validations, Hash[Symbol, Schema::Table::Validation] comparison_validations) -> Hash[Symbol, untyped]
|
36
29
|
def self.compare_foreign_key_constraints: (Hash[Symbol, Schema::Table::ForeignKeyConstraint] foreign_key_constraints, Hash[Symbol, Schema::Table::ForeignKeyConstraint] comparison_foreign_key_constraints) -> Hash[Symbol, untyped]
|
37
|
-
def self.compare_record: (
|
30
|
+
def self.compare_record: (untyped | nil base, Object | nil comparison, Array[Symbol] method_list) -> Hash[Symbol, untyped]
|
31
|
+
def self.log: -> Logging::Logger
|
32
|
+
|
33
|
+
private
|
34
|
+
def log: -> Logging::Logger
|
38
35
|
|
39
36
|
class ExpectedDatabaseError < StandardError
|
40
37
|
end
|
data/sig/logging.rbs
ADDED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dynamic_migrations
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.8.
|
4
|
+
version: 3.8.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Craig Ulliott
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.5'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: logging
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.3'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2.3'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: yaml
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -247,6 +261,7 @@ files:
|
|
247
261
|
- sig/dynamic_migrations/postgres/server/database/structure_loader.rbs
|
248
262
|
- sig/dynamic_migrations/postgres/server/database/triggers_and_functions_loader.rbs
|
249
263
|
- sig/dynamic_migrations/postgres/server/database/validations_loader.rbs
|
264
|
+
- sig/logging.rbs
|
250
265
|
- sig/pg.rbs
|
251
266
|
- sig/tsort.rbs
|
252
267
|
homepage:
|