Module: ChronoModel::Adapter::Migrations
- Included in:
- ChronoModel::Adapter
- Defined in:
- lib/chrono_model/adapter/migrations.rb
Instance Method Summary collapse
-
#add_column(table_name) ⇒ Object
If adding a column to a temporal table, creates it in the table in the temporal schema and updates the triggers.
-
#add_index(table_name, column_name, options = {}) ⇒ Object
If adding an index to a temporal table, add it to the one in the temporal schema and to the history one.
-
#change_column(table_name) ⇒ Object
If removing a column from a temporal table, we are forced to drop the view, then change the column from the table in the temporal schema and eventually recreate the triggers.
-
#change_column_default(table_name) ⇒ Object
Change the default on the temporal schema table.
-
#change_column_null(table_name) ⇒ Object
Change the null constraint on the temporal schema table.
-
#change_table(table_name, **options, &block) ⇒ Object
If changing a temporal table, redirect the change to the table in the temporal schema and recreate views.
-
#create_table(table_name, **options) ⇒ Object
Creates the given table, possibly creating the temporal schema objects if the ‘:temporal` option is given and set to true.
-
#drop_table(table_name) ⇒ Object
If dropping a temporal table, drops it from the temporal schema adding the CASCADE option so to delete the history, view and triggers.
-
#remove_column(table_name) ⇒ Object
If removing a column from a temporal table, we are forced to drop the view, then drop the column from the table in the temporal schema and eventually recreate the triggers.
-
#remove_index(table_name) ⇒ Object
If removing an index from a temporal table, remove it both from the temporal and the history schemas.
-
#rename_column(table_name) ⇒ Object
If renaming a column of a temporal table, rename it in the table in the temporal schema and update the triggers.
-
#rename_table(name, new_name) ⇒ Object
If renaming a temporal table, rename the history and view as well.
Instance Method Details
#add_column(table_name) ⇒ Object
If adding a column to a temporal table, creates it in the table in the temporal schema and updates the triggers.
136 137 138 139 140 141 142 143 144 145 146 |
# File 'lib/chrono_model/adapter/migrations.rb', line 136 def add_column(table_name, *) return super unless is_chrono?(table_name) transaction do # Add the column to the temporal table on_temporal_schema { super } # Update the triggers chrono_public_view_ddl(table_name) end end |
#add_index(table_name, column_name, options = {}) ⇒ Object
If adding an index to a temporal table, add it to the one in the temporal schema and to the history one. If the ‘:unique` option is present, it is removed from the index created in the history table.
108 109 110 111 112 113 114 115 116 117 118 119 |
# File 'lib/chrono_model/adapter/migrations.rb', line 108 def add_index(table_name, column_name, = {}) return super unless is_chrono?(table_name) transaction do on_temporal_schema { super } # Uniqueness constraints do not make sense in the history table = .dup.tap {|o| o.delete(:unique)} if [:unique].present? on_history_schema { super table_name, column_name, } end end |
#change_column(table_name) ⇒ Object
If removing a column from a temporal table, we are forced to drop the view, then change the column from the table in the temporal schema and eventually recreate the triggers.
168 169 170 171 |
# File 'lib/chrono_model/adapter/migrations.rb', line 168 def change_column(table_name, *) return super unless is_chrono?(table_name) drop_and_recreate_public_view(table_name) { super } end |
#change_column_default(table_name) ⇒ Object
Change the default on the temporal schema table.
175 176 177 178 |
# File 'lib/chrono_model/adapter/migrations.rb', line 175 def change_column_default(table_name, *) return super unless is_chrono?(table_name) on_temporal_schema { super } end |
#change_column_null(table_name) ⇒ Object
Change the null constraint on the temporal schema table.
182 183 184 185 |
# File 'lib/chrono_model/adapter/migrations.rb', line 182 def change_column_null(table_name, *) return super unless is_chrono?(table_name) on_temporal_schema { super } end |
#change_table(table_name, **options, &block) ⇒ Object
If changing a temporal table, redirect the change to the table in the temporal schema and recreate views.
If the ‘:temporal` option is specified, enables or disables temporal features on the given table. Please note that you’ll lose your history when demoting a temporal table to a plain one.
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'lib/chrono_model/adapter/migrations.rb', line 66 def change_table(table_name, **, &block) transaction do # Add an empty proc to support calling change_table without a block. # block ||= proc { } if [:temporal] if !is_chrono?(table_name) chrono_make_temporal_table(table_name, ) end drop_and_recreate_public_view(table_name, ) do super table_name, **, &block end else if is_chrono?(table_name) chrono_undo_temporal_table(table_name) end super table_name, **, &block end end end |
#create_table(table_name, **options) ⇒ Object
Creates the given table, possibly creating the temporal schema objects if the ‘:temporal` option is given and set to true.
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# File 'lib/chrono_model/adapter/migrations.rb', line 8 def create_table(table_name, **) # No temporal features requested, skip return super unless [:temporal] if [:id] == false logger.warn "ChronoModel: Temporal Temporal tables require a primary key." logger.warn "ChronoModel: Adding a `__chrono_id' primary key to #{table_name} definition." [:id] = '__chrono_id' end transaction do on_temporal_schema { super } on_history_schema { chrono_history_table_ddl(table_name) } chrono_public_view_ddl(table_name, ) end end |
#drop_table(table_name) ⇒ Object
If dropping a temporal table, drops it from the temporal schema adding the CASCADE option so to delete the history, view and triggers.
96 97 98 99 100 101 102 |
# File 'lib/chrono_model/adapter/migrations.rb', line 96 def drop_table(table_name, *) return super unless is_chrono?(table_name) on_temporal_schema { execute "DROP TABLE #{table_name} CASCADE" } chrono_drop_trigger_functions_for(table_name) end |
#remove_column(table_name) ⇒ Object
If removing a column from a temporal table, we are forced to drop the view, then drop the column from the table in the temporal schema and eventually recreate the triggers.
191 192 193 194 |
# File 'lib/chrono_model/adapter/migrations.rb', line 191 def remove_column(table_name, *) return super unless is_chrono?(table_name) drop_and_recreate_public_view(table_name) { super } end |
#remove_index(table_name) ⇒ Object
If removing an index from a temporal table, remove it both from the temporal and the history schemas.
124 125 126 127 128 129 130 131 |
# File 'lib/chrono_model/adapter/migrations.rb', line 124 def remove_index(table_name, *) return super unless is_chrono?(table_name) transaction do on_temporal_schema { super } on_history_schema { super } end end |
#rename_column(table_name) ⇒ Object
If renaming a column of a temporal table, rename it in the table in the temporal schema and update the triggers.
151 152 153 154 155 156 157 158 159 160 161 162 |
# File 'lib/chrono_model/adapter/migrations.rb', line 151 def rename_column(table_name, *) return super unless is_chrono?(table_name) # Rename the column in the temporal table and in the view transaction do on_temporal_schema { super } super # Update the triggers chrono_public_view_ddl(table_name) end end |
#rename_table(name, new_name) ⇒ Object
If renaming a temporal table, rename the history and view as well.
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/chrono_model/adapter/migrations.rb', line 29 def rename_table(name, new_name) return super unless is_chrono?(name) clear_cache! transaction do # Rename tables # on_temporal_schema { rename_table_and_pk(name, new_name) } on_history_schema { rename_table_and_pk(name, new_name) } # Rename indexes # chrono_rename_history_indexes(name, new_name) chrono_rename_temporal_indexes(name, new_name) # Drop view # execute "DROP VIEW #{name}" # Drop functions # chrono_drop_trigger_functions_for(name) # Create view and functions # chrono_public_view_ddl(new_name) end end |