Sha256: 0fd7599e7023bd60488e3bae9e892efb5241488ef15900644d1ff239fa110861

Contents?: true

Size: 1.37 KB

Versions: 1

Compression:

Stored size: 1.37 KB

Contents

# rubocop:disable Metrics/MethodLength

module Simple
  module SQL
    module Reflection
      extend self

      extend Forwardable
      delegate [:ask, :all, :records, :record] => ::Simple::SQL

      def tables(schema: "public")
        select = if schema == "public"
                   "table_name AS name, *"
                 else
                   "table_schema || '.' || table_name AS name, *"
                 end

        records = ::Simple::SQL.records <<~SQL, schema
          SELECT #{select}
          FROM information_schema.tables
          WHERE table_schema=$1
          SQL
        records_by_attr(records, :name)
      end

      def columns(table_name)
        schema, table_name = parse_table_name(table_name)
        records = ::Simple::SQL.records <<~SQL, schema, table_name
          SELECT
            column_name AS name,
            *
          FROM information_schema.columns
          WHERE table_schema=$1 AND table_name=$2
        SQL

        records_by_attr(records, :column_name)
      end

      private

      def parse_table_name(table_name)
        p1, p2 = table_name.split(".", 2)
        if p2
          [p1, p2]
        else
          ["public", p1]
        end
      end

      def records_by_attr(records, attr)
        records.inject({}) do |hsh, record|
          hsh.update record[attr] => OpenStruct.new(record)
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
simple-sql-0.2.7 lib/simple/sql/reflection.rb