require 'date' require 'flydata-core/errors' module FlydataCore module TableDef class RedshiftTableDef TYPE_MAP_F2R = { 'binary' => {type: 'varchar', use_params: true, default_value: ''}, 'bit' => {type: 'bigint', default_value: '0'}, 'char' => {type: 'char', use_params: true, default_value: ''}, 'date' => {type: 'date', default_value: '0000-01-01'}, 'datetime' => {type: 'timestamp', default_value: '0000-01-01'}, 'enum' => {type: 'varchar encode bytedict', default_value: ''}, 'float4' => {type: 'float4', default_value: '0'}, 'float4 unsigned' => {type: 'float4', default_value: '0'}, 'float8' => {type: 'float8', default_value: '0'}, 'float8 unsigned' => {type: 'float8', default_value: '0'}, 'int1' => {type: 'int2', default_value: '0'}, 'int1 unsigned' => {type: 'int2', unsigned: true, default_value: '0'}, 'int2' => {type: 'int2', default_value: '0'}, 'int2 unsigned' => {type: 'int4', unsigned: true, default_value: '0'}, 'int3' => {type: 'int4', default_value: '0'}, 'int3 unsigned' => {type: 'int4', unsigned: true, default_value: '0'}, 'int4' => {type: 'int4', default_value: '0'}, 'int4 unsigned' => {type: 'int8', unsigned: true, default_value: '0'}, 'int8' => {type: 'int8', default_value: '0'}, 'int8 unsigned' => {type: 'numeric(20,0)', unsigned: true, default_value: '0'}, 'numeric' => {type: 'numeric', use_params: true, max_size: [38,37], default_value: '0'}, 'numeric unsigned' => {type: 'numeric', use_params: true, max_size: [38,37], default_value: '0'}, 'set' => {type: 'varchar encode bytedict', default_value: ''}, 'text' => {type: 'varchar(max)', default_value: ''}, 'time' => {type: 'timestamp', default_value: '0000-01-01'}, 'varbinary' => {type: 'varchar', use_params: true, max_size: 65535, default_value: ''}, 'varchar' => {type: 'varchar', use_params: true, max_size: 65535, default_value: ''}, } def self.from_flydata_tabledef(flydata_tabledef, options = {}) options[:flydata_ctl_table] = true unless options.has_key?(:flydata_ctl_table) schema_name = options[:schema_name] begin tabledef = "" tabledef += create_flydata_ctl_table_sql(schema_name) if options[:flydata_ctl_table] tabledef += create_table_sql(flydata_tabledef, schema_name) unless options[:ctl_only] tabledef += comment_sql(flydata_tabledef, schema_name) unless options[:ctl_only] tabledef += flydata_ctl_sql(flydata_tabledef, schema_name) rescue => e # Catch errors from generating schema. Generally an unsupported data type raise TableDefError, {error: "errors generating schema. Please contact us for further instructions", table: flydata_tabledef[:table_name]} end end FLYDATA_CTL_COLUMNS_TABLE = "flydata_ctl_columns" CREATE_FLYDATA_CTL_TABLE_SQL = < max_size_a[i].to_i ? max_size_a[i] : param) end final_params.join(",") end APACHE_TIMESTAMP_REGEXP = Regexp.new('^(?\[[0-3]\d\/\D{3}\/[1-2]\d{3}:[0-2]\d:[0-5]\d:[0-5]\d ?[\+\-]\d{2}:?\d{2}\])$') def self.parse_timestamp(value) if value.kind_of?(Integer) or /^\d+$/ === value # Unix epoch in UTC t = DateTime.strptime(value.to_s, '%s') elsif APACHE_TIMESTAMP_REGEXP.match(value) # apache time format t = DateTime.strptime(value, "[%d/%b/%Y:%H:%M:%S %Z]") else t = DateTime.parse(value) end t = t.new_offset(0) # Redshift Plug-in uses UTC t.strftime('%Y-%m-%d %H:%M:%S.%6N') rescue ArgumentError => ae # '0000-00-00 00:00:00' is valid for mysql datetime column if value.start_with?('0000-00-00 00:00:00') return '0001-01-01 00:00:00.000000' else raise ae end end def self.parse_date(value) dt = Date.parse(value) dt.strftime('%Y-%m-%d') rescue ArgumentError => ae # '0000-00-00' is valid for mysql date column return '0001-01-01' if value == '0000-00-00' raise ae end end end end