Class: AutoREST::PostgresDB

Inherits:
DBAdapter show all
Defined in:
lib/autorest/db/postgres.rb

Overview

PostgreSQL adapter for AutoREST.

Uses the ‘pg` gem to connect and interact with a PostgreSQL database. Detects tables and their primary keys by querying PostgreSQL system catalogs.

Examples:

Initialize adapter

db = AutoREST::PostgresDB.new("localhost", 5432, "postgres", "secret", "mydb")

Instance Method Summary collapse

Methods inherited from DBAdapter

#close, #columns, #del_row, #insert, #row, #rows, #set_access_tables, #tables, #update

Constructor Details

#initialize(host, port, user, passwd, dbname) ⇒ PostgresDB

Returns a new instance of PostgresDB.

Parameters:

  • host (String)

    Hostname of the PostgreSQL server

  • port (Integer)

    Port number

  • user (String)

    Username

  • passwd (String)

    Password

  • dbname (String)

    Name of the PostgreSQL database



25
26
27
28
# File 'lib/autorest/db/postgres.rb', line 25

def initialize(host, port, user, passwd, dbname)
    conn = PG.connect(host: host, port: port, user: user, password: passwd, dbname: dbname)
    super(:pg, dbname, conn)
end

Instance Method Details

#escape(input) ⇒ String

Escapes a string input to safely use in SQL queries.

Parameters:

  • input (String)

    Raw user input

Returns:

  • (String)

    Escaped string



77
78
79
# File 'lib/autorest/db/postgres.rb', line 77

def escape(input)
    @db_conn.escape_string(input)
end

#exec_sql(sql) ⇒ Array<Hash>

Executes a raw SQL query.

Parameters:

  • sql (String)

    The SQL query to run

Returns:

  • (Array<Hash>)

    Resulting rows



70
71
72
# File 'lib/autorest/db/postgres.rb', line 70

def exec_sql(sql)
    @db_conn.exec(sql).to_a
end

#preparevoid

This method returns an undefined value.

Loads table metadata including columns and primary keys.

It excludes system tables by filtering out ‘pg_catalog` and `information_schema` schemas.



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
# File 'lib/autorest/db/postgres.rb', line 35

def prepare
    desc_query = <<-SQL
    SELECT
        a.attname AS cname,
        pg_catalog.format_type(a.atttypid, a.atttypmod) AS dtype,
        coalesce(i.indisprimary, false) AS pk
    FROM
        pg_catalog.pg_attribute a
    JOIN pg_catalog.pg_class c ON a.attrelid = c.oid
    JOIN pg_catalog.pg_namespace n ON c.relnamespace = n.oid
    LEFT JOIN pg_catalog.pg_index i
        ON c.oid = i.indrelid
        AND a.attnum = ANY(i.indkey)
        AND i.indisprimary
    WHERE
        c.relname = $1
        AND a.attnum > 0
        AND NOT a.attisdropped
    ORDER BY a.attnum;
    SQL
    @tables = {}
    @db_conn.exec("SELECT tablename FROM pg_catalog.pg_tables
    WHERE schemaname NOT IN ('pg_catalog', 'information_schema')").each do |t|
        tname = t["tablename"]
        row_details = @db_conn.exec_params(desc_query, [tname])
        @tables[tname] = {}
        row_details.each do |row|
            @tables[tname][row["cname"]] = {type: row["type"], pk: row["pk"]}
        end
    end
end