Module: ODBCAdapter::SchemaStatements
- Included in:
- ActiveRecord::ConnectionAdapters::ODBCAdapter
- Defined in:
- lib/odbc_adapter/schema_statements.rb
Instance Method Summary collapse
-
#columns(table_name, name = nil) ⇒ Object
Returns an array of Column objects for the table specified by
table_name
. - #current_database ⇒ Object
-
#index_name(table_name, options) ⇒ Object
Ensure it’s shorter than the maximum identifier length for the current dbms.
-
#indexes(table_name, name = nil) ⇒ Object
Returns an array of indexes for the given table.
-
#native_database_types ⇒ Object
Returns a Hash of mappings from the abstract data types to the native database types.
-
#primary_key(table_name) ⇒ Object
Returns just a table’s primary key.
-
#tables(_name = nil) ⇒ Object
Returns an array of table names, for database tables visible on the current connection.
-
#views ⇒ Object
Returns an array of view names defined in the database.
Instance Method Details
#columns(table_name, name = nil) ⇒ Object
Returns an array of Column objects for the table specified by table_name
.
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'lib/odbc_adapter/schema_statements.rb', line 61 def columns(table_name, name = nil) stmt = @connection.columns(native_case(table_name.to_s)) result = stmt.fetch_all || [] stmt.drop result.each_with_object([]) do |col, cols| col_name = col[3] # SQLColumns: COLUMN_NAME col_default = col[12] # SQLColumns: COLUMN_DEF col_sql_type = col[4] # SQLColumns: DATA_TYPE col_native_type = col[5] # SQLColumns: TYPE_NAME col_limit = col[6] # SQLColumns: COLUMN_SIZE col_scale = col[8] # SQLColumns: DECIMAL_DIGITS # SQLColumns: IS_NULLABLE, SQLColumns: NULLABLE col_nullable = nullability(col_name, col[17], col[10]) args = { sql_type: col_sql_type, type: col_sql_type, limit: col_limit } args[:sql_type] = 'boolean' if col_native_type == self.class::BOOLEAN_TYPE if [ODBC::SQL_DECIMAL, ODBC::SQL_NUMERIC].include?(col_sql_type) args[:scale] = col_scale || 0 args[:precision] = col_limit end = ActiveRecord::ConnectionAdapters::SqlTypeMetadata.new(**args) cols << new_column(format_case(col_name), col_default, , col_nullable, table_name, col_native_type) end end |
#current_database ⇒ Object
105 106 107 |
# File 'lib/odbc_adapter/schema_statements.rb', line 105 def current_database dbms.field_for(ODBC::SQL_DATABASE_NAME).strip end |
#index_name(table_name, options) ⇒ Object
Ensure it’s shorter than the maximum identifier length for the current dbms
100 101 102 103 |
# File 'lib/odbc_adapter/schema_statements.rb', line 100 def index_name(table_name, ) maximum = dbms.field_for(ODBC::SQL_MAX_IDENTIFIER_LEN) || 255 super(table_name, )[0...maximum] end |
#indexes(table_name, name = nil) ⇒ Object
Returns an array of indexes for the given table.
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/odbc_adapter/schema_statements.rb', line 30 def indexes(table_name, name = nil) stmt = @connection.indexes(native_case(table_name.to_s)) result = stmt.fetch_all || [] stmt.drop unless stmt.nil? index_cols = [] index_name = nil unique = nil result.each_with_object([]).with_index do |(row, indices), row_idx| # Skip table statistics next if row[6] == 0 # SQLStatistics: TYPE if row[7] == 1 # SQLStatistics: ORDINAL_POSITION # Start of column descriptor block for next index index_cols = [] unique = row[3].zero? # SQLStatistics: NON_UNIQUE index_name = String.new(row[5]) # SQLStatistics: INDEX_NAME end index_cols << format_case(row[8]) # SQLStatistics: COLUMN_NAME next_row = result[row_idx + 1] if (row_idx == result.length - 1) || (next_row[6] == 0 || next_row[7] == 1) indices << IndexDefinition.new(table_name, format_case(index_name), unique, index_cols) end end end |
#native_database_types ⇒ Object
Returns a Hash of mappings from the abstract data types to the native database types. See TableDefinition#column for details on the recognized abstract data types.
6 7 8 |
# File 'lib/odbc_adapter/schema_statements.rb', line 6 def native_database_types @native_database_types ||= ColumnMetadata.new(self).native_database_types end |
#primary_key(table_name) ⇒ Object
Returns just a table’s primary key
91 92 93 94 95 96 |
# File 'lib/odbc_adapter/schema_statements.rb', line 91 def primary_key(table_name) stmt = @connection.primary_keys(native_case(table_name.to_s)) result = stmt.fetch_all || [] stmt.drop unless stmt.nil? result[0] && result[0][3] end |
#tables(_name = nil) ⇒ Object
Returns an array of table names, for database tables visible on the current connection.
12 13 14 15 16 17 18 19 20 21 22 |
# File 'lib/odbc_adapter/schema_statements.rb', line 12 def tables(_name = nil) stmt = @connection.tables result = stmt.fetch_all || [] stmt.drop result.each_with_object([]) do |row, table_names| schema_name, table_name, table_type = row[1..3] next if respond_to?(:table_filtered?) && table_filtered?(schema_name, table_type) table_names << format_case(table_name) end end |
#views ⇒ Object
Returns an array of view names defined in the database.
25 26 27 |
# File 'lib/odbc_adapter/schema_statements.rb', line 25 def views [] end |