class Prostore::Adapter::Postgres::Adapter

Overview

PostgreSQL adapter (ADR-0007).

Mirrors Adapter::SQLite::Adapter but emits Postgres-idiomatic DDL and supports native ALTER TABLE extensions that SQLite lacks (ALTER COLUMN SET NOT NULL, ALTER TABLE ADD CONSTRAINT FOREIGN KEY, CREATE INDEX CONCURRENTLY).

Capability flags below tell the planner which operations the adapter can do natively. ApplyNotNull and AddForeignKey/DropForeignKey honor these and avoid the SQLite table-rebuild dance.

Defined in:

prostore/adapter/postgres/adapter.cr

Constructors

Instance Method Summary

Instance methods inherited from class Prostore::Adapter::Base

backup(dest : String) : Nil backup, bookkeeping_id_column_def : String bookkeeping_id_column_def, db : DB::Database db, insert_returning_id(executor : Executor, sql : String, args : Array) : Int64
insert_returning_id(executor : Executor, sql : String, *args) : Int64
insert_returning_id
, introspect_all(executor : Executor = @db) : Array(LiveTable) introspect_all, introspect_table(name : String, executor : Executor = @db) : LiveTable introspect_table, introspect_table_names(executor : Executor = @db) : Array(String) introspect_table_names, like_operator : String like_operator, placeholder(n : Int32) : String placeholder, placeholders(count : Int32) : String placeholders, quote_ident(name : String) : String quote_ident, quote_string(s : String) : String quote_string, render_create_index(table : String, index : Schema::Index) : String render_create_index, render_create_table(definition : Schema::Definition) : String render_create_table, session_setup(conn : DB::Connection) : Nil session_setup, supports_add_constraint_not_valid? : Bool supports_add_constraint_not_valid?, supports_alter_drop_column? : Bool supports_alter_drop_column?, supports_alter_set_not_null? : Bool supports_alter_set_not_null?, supports_concurrent_index? : Bool supports_concurrent_index?

Constructor methods inherited from class Prostore::Adapter::Base

new(db : DB::Database) new

Constructor Detail

def self.new(db : DB::Database, url : String) #

[View source]

Instance Method Detail

def backup(dest : String) : Nil #
Description copied from class Prostore::Adapter::Base

Write a point-in-time backup to dest (an absolute file path). SQLite uses VACUUM INTO; PostgreSQL shells out to pg_dump.


[View source]
def bookkeeping_id_column_def : String #
Description copied from class Prostore::Adapter::Base

Column DDL fragment for an auto-incrementing BIGINT primary key on the bookkeeping tables. SQLite emits INTEGER PRIMARY KEY AUTOINCREMENT while Postgres emits BIGSERIAL PRIMARY KEY (or identity). Each adapter overrides.


[View source]
def insert_returning_id(executor : Executor, sql : String, args : Array) : Int64 #
Description copied from class Prostore::Adapter::Base

Array-args overload for callers that build their argument list dynamically (e.g., the record-layer INSERT helper).


[View source]
def insert_returning_id(executor : Executor, sql : String, *args) : Int64 #
Description copied from class Prostore::Adapter::Base

INSERT a row and return its newly-assigned ID. SQLite uses last_insert_rowid(); Postgres uses RETURNING id. The adapter encapsulates the difference.


[View source]
def introspect_table(name : String, executor : Executor = @db) : LiveTable #

[View source]
def introspect_table_names(executor : Executor = @db) : Array(String) #

[View source]
def like_operator : String #
Description copied from class Prostore::Adapter::Base

The operator for a case-insensitive substring match in a WHERE clause. SQLite's LIKE is case-insensitive for ASCII by default; PostgreSQL exposes ILIKE for the same purpose.


[View source]
def placeholder(n : Int32) : String #
Description copied from class Prostore::Adapter::Base

The n-th positional parameter placeholder in the adapter's SQL syntax. SQLite uses ? (position-implicit). PostgreSQL uses $1, $2, … (position-explicit). crystal-db does NOT translate between them, so SQL strings shared by both adapters must build placeholders via this method.


[View source]
def quote_ident(name : String) : String #

[View source]
def quote_string(s : String) : String #

[View source]
def render_create_index(table : String, index : Schema::Index) : String #

[View source]
def render_create_table(definition : Schema::Definition, pk_lookup : Hash(String, Array(String))) : String #

[View source]
def render_create_table(definition : Schema::Definition) : String #

[View source]
def session_setup(conn : DB::Connection) : Nil #

No per-connection session setup required for Postgres beyond what crystal-pg sets up (utf8 client encoding, etc.).


[View source]
def supports_add_constraint_not_valid? : Bool #

Postgres supports ADD CONSTRAINT NOT VALID + VALIDATE CONSTRAINT for online FK addition. Same caveat as concurrent_index — the planner can adopt this in a future revision.


[View source]
def supports_alter_set_not_null? : Bool #

Postgres supports native ALTER COLUMN SET NOT NULL.


[View source]
def supports_concurrent_index? : Bool #

CREATE INDEX CONCURRENTLY runs outside a transaction and avoids holding an exclusive lock — required for online index creation against large production tables. The Steps executor consults this flag to skip the transaction wrapper and route through the recovery-aware concurrent path.


[View source]