class Sequel::Bigquery::Database

Public Class Methods

new(*args, **kawrgs) click to toggle source
Calls superclass method
# File lib/sequel-bigquery.rb, line 19
def initialize(*args, **kawrgs)
  puts '.new'
  @orig_opts = kawrgs.fetch(:orig_opts)
  @sql_buffer = []
  @sql_buffering = false
  super
end

Public Instance Methods

connect(*_args) click to toggle source
# File lib/sequel-bigquery.rb, line 27
def connect(*_args)
  puts '#connect'
  # self.input_identifier_meth = nil
  # self.identifier_output_method = nil

  config = @orig_opts.dup
  config.delete(:adapter)
  config.delete(:logger)
  bq_dataset_name = config.delete(:dataset) || config.delete(:database)
  @bigquery = Google::Cloud::Bigquery.new(config)
  # ObjectSpace.each_object(HTTPClient).each { |c| c.debug_dev = STDOUT }
  @bigquery.dataset(bq_dataset_name) || begin
    @loggers[0].debug('BigQuery dataset %s does not exist; creating it' % bq_dataset_name)
    @bigquery.create_dataset(bq_dataset_name)
  end
    .tap { puts '#connect end' }
end
disconnect_connection(c) click to toggle source
# File lib/sequel-bigquery.rb, line 45
def disconnect_connection(c)
  puts '#disconnect_connection'
  # c.disconnect
end
execute(sql, opts=OPTS) { |results| ... } click to toggle source
# File lib/sequel-bigquery.rb, line 50
def execute(sql, opts=OPTS)
  puts '#execute'
  log_query(sql)

  # require 'pry'; binding.pry if sql =~ /CREATE TABLE IF NOT EXISTS/i

  sql = sql.gsub(/\sdefault \S+/i) do
    warn_default_removal(sql)
    ''
  end

  if sql =~ /^update/i && sql !~ / where /i
    warn("Warning: Appended 'where 1 = 1' to query since BigQuery requires UPDATE statements to include a WHERE clause")
    sql = sql + ' where 1 = 1'
  end

  if sql =~ /^begin/i
    warn_transaction
    @sql_buffering = true
  end

  if @sql_buffering
    @sql_buffer << sql
    if sql =~ /^commit/i
      warn("Warning: Will now execute entire buffered transaction:\n" + @sql_buffer.join("\n"))
    else
      return []
    end
  end

  synchronize(opts[:server]) do |conn|
    begin
      results = log_connection_yield(sql, conn) do
        sql_to_execute = @sql_buffer.any? ? @sql_buffer.join("\n") : sql
        conn.query(sql_to_execute)
        # raw_result = conn.query(sql_to_execute)
        # BQResult.new(raw_result)
      end
      require 'amazing_print'
      ap results
      if block_given?
        yield results
      else
        results
      end
    # TODO
    # rescue ::ODBC::Error, ArgumentError => e
    rescue Google::Cloud::InvalidArgumentError, ArgumentError => e
      raise_error(e)
    end
  end
    .tap do
      @sql_buffer = []
      @sql_buffering = false
    end
end
supports_create_table_if_not_exists?() click to toggle source
# File lib/sequel-bigquery.rb, line 107
def supports_create_table_if_not_exists?
  true
end
type_literal_generic_string(column) click to toggle source
# File lib/sequel-bigquery.rb, line 111
def type_literal_generic_string(column)
  if column[:size]
    "string(#{column[:size]})"
  else
    :string
  end
end

Private Instance Methods

adapter_initialize() click to toggle source

def execute_dui(sql, opts=OPTS)

# require 'pry'; binding.pry
synchronize(opts[:server]) do |conn|
  begin
    log_connection_yield(sql, conn){conn.do(sql)}
  # TODO:
  # rescue ::ODBC::Error, ArgumentError => e
  rescue ArgumentError => e
    raise_error(e)
  end
end

end

# File lib/sequel-bigquery.rb, line 141
def adapter_initialize
  puts '#adapter_initialize'
  self.extension(:identifier_mangling)
  self.identifier_input_method = nil
  self.quote_identifiers = false
end
connection_execute_method() click to toggle source
# File lib/sequel-bigquery.rb, line 148
def connection_execute_method
  :query
end
database_error_classes() click to toggle source
# File lib/sequel-bigquery.rb, line 152
def database_error_classes
  # [::ODBC::Error]
  # TODO
end
dataset_class_default() click to toggle source
# File lib/sequel-bigquery.rb, line 157
def dataset_class_default
  Dataset
end
disconnect_error?(e, opts) click to toggle source
Calls superclass method
# File lib/sequel-bigquery.rb, line 172
def disconnect_error?(e, opts)
  # super || (e.is_a?(::ODBC::Error) && /\A08S01/.match(e.message))
  super
end
log_query(sql) click to toggle source

Padded to horizontally align with post-execution log message which includes the execution time

# File lib/sequel-bigquery.rb, line 178
def log_query(sql)
  pad = '                                                                '
  puts Paint[pad + sql, :cyan, :bold]
  # @loggers[0]&.debug('            ' + sql)
end
schema_parse_table(table_name, opts) click to toggle source
# File lib/sequel-bigquery.rb, line 161
def schema_parse_table(table_name, opts)
  logger.debug(Paint['schema_parse_table', :red, :bold])
  # require 'pry'; binding.pry
  @bigquery.datasets.map do |dataset|
    [
      dataset.dataset_id,
      {}
    ]
  end
end
warn(msg) click to toggle source
# File lib/sequel-bigquery.rb, line 184
def warn(msg)
  @loggers[0].warn(Paint[msg, '#FFA500', :bold])
end
warn_default_removal(sql) click to toggle source
# File lib/sequel-bigquery.rb, line 188
def warn_default_removal(sql)
  warn("Warning: Default removed from below query as it's not supported on BigQuery:\n%s" % sql)
end
warn_transaction() click to toggle source
# File lib/sequel-bigquery.rb, line 192
def warn_transaction
  warn('Warning: Transaction detected. This only supported on BigQuery in a script or session. Commencing buffering to run the whole transaction at once as a script upon commit. Note that no result data is returned while the transaction is open.')
end