Module: ActiveRecord::ConnectionAdapters::Hanaclient::SchemaStatements
- Included in:
- ActiveRecord::ConnectionAdapters::HanaclientAdapter
- Defined in:
- lib/active_record/connection_adapters/hanaclient/schema_statements.rb
Instance Method Summary collapse
- #change_column(table_name, column_name, type, options = {}) ⇒ Object
- #change_column_comment(table_name, column_name, comment) ⇒ Object
- #change_column_default(table_name, column_name, default_or_changes) ⇒ Object
- #change_column_null(table_name, column_name, null, default = nil) ⇒ Object
- #change_table_comment(table_name, comment) ⇒ Object
- #create_table(table_name, comment: nil, **options) {|td| ... } ⇒ Object
- #drop_table(table_name, options = {}) ⇒ Object
- #extract_foreign_key_action(specifier) ⇒ Object
-
#foreign_keys(table_name) ⇒ Object
Returns an array of ForeignKeyDefinitions for a given table.
-
#indexes(table_name, name = nil) ⇒ Object
Returns an array of IndexDefinition objects for the given table.
- #remove_index(table_name, options = {}) ⇒ Object
- #rename_column(table_name, column_name, new_column_name) ⇒ Object
- #rename_index(table_name, old_name, new_name) ⇒ Object
- #rename_table(table_name, new_name) ⇒ Object
-
#type_to_sql(type, limit: nil, precision: nil, scale: nil) ⇒ Object
Returns the sql for a given type.
Instance Method Details
#change_column(table_name, column_name, type, options = {}) ⇒ Object
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
# File 'lib/active_record/connection_adapters/hanaclient/schema_statements.rb', line 87 def change_column(table_name, column_name, type, = {}) column = column_for(table_name, column_name) unless .key?(:default) [:default] = column.default end unless .key?(:null) [:null] = column.null end unless .key?(:comment) [:comment] = column.comment end td = create_table_definition(table_name) cd = td.new_column_definition(column.name, type, ) change_column_sql = schema_creation.accept(ChangeColumnDefinition.new(cd, column.name)) execute("ALTER TABLE #{quote_table_name(table_name)} #{change_column_sql}") end |
#change_column_comment(table_name, column_name, comment) ⇒ Object
182 183 184 |
# File 'lib/active_record/connection_adapters/hanaclient/schema_statements.rb', line 182 def change_column_comment(table_name, column_name, comment) execute "COMMENT ON COLUMN #{quote_table_name(table_name)}.#{quote_column_name(column_name)} IS #{quote(comment)}" end |
#change_column_default(table_name, column_name, default_or_changes) ⇒ Object
109 110 111 112 113 |
# File 'lib/active_record/connection_adapters/hanaclient/schema_statements.rb', line 109 def change_column_default(table_name, column_name, default_or_changes) default = extract_new_default_value(default_or_changes) column = column_for(table_name, column_name) change_column(table_name, column_name, column.sql_type, default: default) end |
#change_column_null(table_name, column_name, null, default = nil) ⇒ Object
115 116 117 118 119 120 121 122 123 |
# File 'lib/active_record/connection_adapters/hanaclient/schema_statements.rb', line 115 def change_column_null(table_name, column_name, null, default = nil) column = column_for(table_name, column_name) unless null || default.nil? execute("UPDATE #{quote_table_name(table_name)} SET #{quote_column_name(column_name)}=#{quote(default)} WHERE #{quote_column_name(column_name)} IS NULL") end change_column(table_name, column_name, column.sql_type, null: null) end |
#change_table_comment(table_name, comment) ⇒ Object
178 179 180 |
# File 'lib/active_record/connection_adapters/hanaclient/schema_statements.rb', line 178 def change_table_comment(table_name, comment) execute "COMMENT ON TABLE #{quote_table_name(table_name)} IS #{quote(comment)}" end |
#create_table(table_name, comment: nil, **options) {|td| ... } ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/active_record/connection_adapters/hanaclient/schema_statements.rb', line 6 def create_table(table_name, comment: nil, **) td = create_table_definition table_name, [:temporary], [:row_table], [:options], [:as], comment: comment if [:id] != false && ![:as] pk = .fetch(:primary_key) do Base.get_primary_key table_name.to_s.singularize end if pk.is_a?(Array) td.primary_keys pk else td.primary_key pk, .fetch(:id, :primary_key), end end yield td if block_given? if [:force] drop_table(table_name, **, if_exists: true) end result = execute schema_creation.accept td unless supports_indexes_in_create? td.indexes.each do |column_name, | add_index(table_name, column_name, ) end end if supports_comments? && !supports_comments_in_create? change_table_comment(table_name, comment) if comment.present? td.columns.each do |column| change_column_comment(table_name, column.name, column.comment) if column.comment.present? end end result end |
#drop_table(table_name, options = {}) ⇒ Object
79 80 81 82 83 84 85 |
# File 'lib/active_record/connection_adapters/hanaclient/schema_statements.rb', line 79 def drop_table(table_name, = {}) begin execute "DROP TABLE #{quote_table_name(table_name)} CASCADE" rescue ActiveRecord::StatementInvalid => e raise e unless [:if_exists] end end |
#extract_foreign_key_action(specifier) ⇒ Object
171 172 173 174 175 176 |
# File 'lib/active_record/connection_adapters/hanaclient/schema_statements.rb', line 171 def extract_foreign_key_action(specifier) case specifier when "CASCADE"; :cascade when "SET NULL"; :nullify end end |
#foreign_keys(table_name) ⇒ Object
Returns an array of ForeignKeyDefinitions for a given table
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
# File 'lib/active_record/connection_adapters/hanaclient/schema_statements.rb', line 140 def foreign_keys(table_name) raise ArgumentError unless table_name.present? scope = quoted_scope(table_name) fk_info = exec_query(" SELECT REFERENCED_TABLE_NAME AS \"to_table\",\n REFERENCED_COLUMN_NAME AS \"primary_key\",\n COLUMN_NAME AS \"column\",\n CONSTRAINT_NAME AS \"name\",\n UPDATE_RULE AS \"on_update\",\n DELETE_RULE AS \"on_delete\"\n FROM SYS.REFERENTIAL_CONSTRAINTS\n WHERE SCHEMA_NAME = \#{scope[:schema]}\n AND TABLE_NAME = \#{scope[:name]}\n SQL\n\n fk_info.map do |row|\n options = {\n column: row[\"column\"],\n name: row[\"name\"],\n primary_key: row[\"primary_key\"]\n }\n\n options[:on_update] = extract_foreign_key_action(row[\"on_update\"])\n options[:on_delete] = extract_foreign_key_action(row[\"on_delete\"])\n\n ForeignKeyDefinition.new(table_name, row[\"to_table\"], options)\n end\nend\n".strip_heredoc, "SCHEMA") |
#indexes(table_name, name = nil) ⇒ Object
Returns an array of IndexDefinition objects for the given table.
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
# File 'lib/active_record/connection_adapters/hanaclient/schema_statements.rb', line 47 def indexes(table_name, name = nil) if name ActiveSupport::Deprecation.warn(" Passing name to #indexes is deprecated without replacement.\n MSG\n end\n\n scope = quoted_scope(table_name)\n\n sql = \"SELECT TABLE_NAME, INDEX_NAME, CONSTRAINT, COLUMN_NAME FROM SYS.INDEX_COLUMNS WHERE TABLE_NAME = \#{scope[:schema]} AND SCHEMA_NAME = \#{scope[:name]}\"\n exec_and_clear(sql, \"SCHEMA\") do |stmt|\n index_hashes = {}\n while HA.instance.api.hanaclient_fetch_next(stmt) == 1\n table_name = HA.instance.api.hanaclient_get_column(stmt, 0)[1]\n index_name = HA.instance.api.hanaclient_get_column(stmt, 1)[1]\n constraint = HA.instance.api.hanaclient_get_column(stmt, 2)[1]\n column_name = HA.instance.api.hanaclient_get_column(stmt, 3)[1]\n next if constraint.to_s.scan(/PRIMARY KEY/)\n\n index_hashes[index_name] ||= IndexDefinition.new(table_name, index_name, constraint.to_s.scan(/UNIQUE/) ? true : false, [], {}, nil, nil, nil, nil, nil)\n index_hashes[index_name].columns << column_name\n end\n\n index_hashes.values\n end\nend\n".squish) |
#remove_index(table_name, options = {}) ⇒ Object
129 130 131 132 |
# File 'lib/active_record/connection_adapters/hanaclient/schema_statements.rb', line 129 def remove_index(table_name, = {}) index_name = index_name_for_remove(table_name, ) execute("DROP INDEX #{quote_column_name(index_name)}") end |
#rename_column(table_name, column_name, new_column_name) ⇒ Object
125 126 127 |
# File 'lib/active_record/connection_adapters/hanaclient/schema_statements.rb', line 125 def rename_column(table_name, column_name, new_column_name) execute("RENAME COLUMN #{quote_table_name(table_name)}.#{quote_column_name(column_name)} TO #{quote_column_name(new_column_name)}") end |
#rename_index(table_name, old_name, new_name) ⇒ Object
134 135 136 137 |
# File 'lib/active_record/connection_adapters/hanaclient/schema_statements.rb', line 134 def rename_index(table_name, old_name, new_name) validate_index_length!(table_name, new_name) execute("RENAME INDEX #{quote_column_name(old_name)} TO #{quote_column_name(new_name)}") end |
#rename_table(table_name, new_name) ⇒ Object
74 75 76 77 |
# File 'lib/active_record/connection_adapters/hanaclient/schema_statements.rb', line 74 def rename_table(table_name, new_name) execute "RENAME TABLE #{quote_table_name(table_name)} TO #{quote_table_name(new_name)}" rename_table_indexes(table_name, new_name) end |
#type_to_sql(type, limit: nil, precision: nil, scale: nil) ⇒ Object
Returns the sql for a given type
187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 |
# File 'lib/active_record/connection_adapters/hanaclient/schema_statements.rb', line 187 def type_to_sql(type, limit: nil, precision: nil, scale: nil, **) # :nodoc: type = type.to_sym if type if native = native_database_types[type] column_type_sql = (native.is_a?(Hash) ? native[:name] : native).dup if type == :integer case limit when 1 column_type_sql = "TINYINT" when 2 column_type_sql = "SMALLINT" when nil, 3, 4 column_type_sql = "INTEGER" when 5..8 column_type_sql = "BIGINT" else raise(ActiveRecordError, "No integer type has byte size #{limit}.") end elsif type == :float case limit when nil, 1..24 column_type_sql = "REAL" when 25..53 column_type_sql = "DOUBLE" else raise(ActiveRecordError, "No float type has byte size #{limit}.") end elsif type == :decimal # ignore limit, use precision and scale scale ||= native[:scale] if precision ||= native[:precision] if scale column_type_sql << "(#{precision},#{scale})" else column_type_sql << "(#{precision})" end elsif scale raise ArgumentError, "Error adding decimal column: precision cannot be empty if scale is specified" end elsif type == :binary if limit.nil? || limit.between?(1,5000) column_type_sql = "VARBINARY(#{limit ? limit : 5000})" else column_type_sql = "BLOB" end elsif type == :unicode if limit.nil? || limit.between?(1,5000) column_type_sql = "NVARCHAR(#{limit ? limit : 5000})" else column_type_sql = "NCLOB" end elsif (type != :primary_key) && (limit ||= native.is_a?(Hash) && native[:limit]) column_type_sql << "(#{limit})" end column_type_sql.upcase else type.to_s.upcase end end |