Module: ActiveRecord::ConnectionAdapters::Cubrid2::SchemaStatements

Included in:
AbstractCubrid2Adapter
Defined in:
lib/active_record/connection_adapters/cubrid2/schema_statements.rb

Overview

:nodoc:

Instance Method Summary collapse

Instance Method Details

#create_schema_dumper(options) ⇒ Object



96
97
98
# File 'lib/active_record/connection_adapters/cubrid2/schema_statements.rb', line 96

def create_schema_dumper(options)
  Cubrid2::SchemaDumper.create(self, options)
end

#create_table(table_name, options: default_row_format) ⇒ Object



80
81
82
# File 'lib/active_record/connection_adapters/cubrid2/schema_statements.rb', line 80

def create_table(table_name, options: default_row_format, **)
  super
end

#indexes(table_name) ⇒ Object

Returns an array of indexes for the given table.



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
45
46
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
73
# File 'lib/active_record/connection_adapters/cubrid2/schema_statements.rb', line 8

def indexes(table_name)
  indexes = []
  current_index = nil
  execute_and_free("SHOW KEYS FROM #{quote_table_name(table_name)}", 'SCHEMA') do |result|
    each_hash(result) do |row|
      if current_index != row[:Key_name]
        next if row[:Key_name] == 'PRIMARY' # skip the primary key

        current_index = row[:Key_name]

        cubrid_index_type = row[:Index_type].downcase.to_sym

        # currently only support btree
        # https://www.cubrid.org/manual/en/11.2/sql/query/show.html?highlight=show%20index#show-index
        index_using = cubrid_index_type
        index_type = nil

        indexes << [
          row[:Table],
          row[:Key_name],
          row[:Non_unique].to_i == 0,
          [],
          { lengths: {},
            orders: {},
            type: index_type,
            using: index_using,
            comment: row[:Comment].presence,
            null: row[:Null] == 'YES',
            visible: row[:Visible] == 'YES' }
        ]
      end

      if row[:Func]
        expression = row[:Func]
        expression = +"(#{expression})" unless expression.start_with?('(')
        indexes.last[-2] << expression
        indexes.last[-1][:expressions] ||= {}
        indexes.last[-1][:expressions][expression] = expression
        indexes.last[-1][:orders][expression] = :desc if row[:Collation] == 'D'
      else
        indexes.last[-2] << row[:Column_name]
        indexes.last[-1][:lengths][row[:Column_name]] = row[:Sub_part].to_i if row[:Sub_part]
        indexes.last[-1][:orders][row[:Column_name]] = :desc if row[:Collation] == 'D'
      end
    end
  end

  indexes.map do |index|
    options = index.pop

    if (expressions = options.delete(:expressions))
      orders = options.delete(:orders)
      lengths = options.delete(:lengths)

      columns = index[-1].map do |name|
        [name.to_sym, expressions[name] || +quote_column_name(name)]
      end.to_h

      index[-1] = add_options_for_index_columns(
        columns, order: orders, length: lengths
      ).values.join(', ')
    end

    IndexDefinition.new(*index, **options)
  end
end

#internal_string_options_for_primary_keyObject



84
85
86
87
88
89
90
# File 'lib/active_record/connection_adapters/cubrid2/schema_statements.rb', line 84

def internal_string_options_for_primary_key
  super.tap do |options|
    if !row_format_dynamic_by_default? && charset =~ /^utf8/
      options[:collation] = collation.sub(/\A[^_]+/, 'utf8')
    end
  end
end

#remove_column(table_name, column_name, type = nil, **options) ⇒ Object



75
76
77
78
# File 'lib/active_record/connection_adapters/cubrid2/schema_statements.rb', line 75

def remove_column(table_name, column_name, type = nil, **options)
  remove_foreign_key(table_name, column: column_name) if foreign_key_exists?(table_name, column: column_name)
  super
end

#table_alias_lengthObject



130
131
132
133
# File 'lib/active_record/connection_adapters/cubrid2/schema_statements.rb', line 130

def table_alias_length
  # https://www.cubrid.org/manual/en/9.1.0/sql/identifier.html#id2
  222
end

#type_to_sql(type, limit: nil, precision: nil, scale: nil, size: limit_to_size(limit, type), unsigned: nil, **options) ⇒ Object

Maps logical Rails types to Cubrid-specific data types.



101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/active_record/connection_adapters/cubrid2/schema_statements.rb', line 101

def type_to_sql(type, limit: nil,
                precision: nil, scale: nil,
                size: limit_to_size(limit, type),
                unsigned: nil, **options)

  case type.to_s
  when 'integer'
    integer_to_sql(limit)
  when 'serial'
    integer_to_sql(8) # bigint
  when 'float', 'real', 'double', 'double precision'
    float_to_sql(limit)
  when 'text', 'string', 'varchar', 'char varing'
    type_with_size_to_sql('string', size)
  when 'char', 'character'
    type_with_size_to_sql('char', size)
  when 'blob', 'binary'
    type_with_size_to_sql('blob', size)
  when 'clob'
    type_with_size_to_sql('clob', size)
  when 'boolean'
    type_with_size_to_sql('boolean', size)
  when 'nchar', 'nchar varing'
    raise 'Not supported from cubrid 9.0'
  else
    super
  end
end

#update_table_definition(table_name, base) ⇒ Object



92
93
94
# File 'lib/active_record/connection_adapters/cubrid2/schema_statements.rb', line 92

def update_table_definition(table_name, base)
  Cubrid2::Table.new(table_name, base)
end