cosmos-sdk/indexer/postgres/create_table.go
Aaron Craelius 9376db5508
feat(indexer): postgres schema creation + CI config (#20701)
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: marbar3778 <marbar3778@yahoo.com>
2024-07-18 09:34:09 +00:00

97 lines
2.2 KiB
Go

package postgres
import (
"context"
"fmt"
"io"
"strings"
)
// CreateTable creates the table for the object type.
func (tm *ObjectIndexer) CreateTable(ctx context.Context, conn DBConn) error {
buf := new(strings.Builder)
err := tm.CreateTableSql(buf)
if err != nil {
return err
}
sqlStr := buf.String()
if tm.options.Logger != nil {
tm.options.Logger(fmt.Sprintf("Creating table %s", tm.TableName()), sqlStr)
}
_, err = conn.ExecContext(ctx, sqlStr)
return err
}
// CreateTableSql generates a CREATE TABLE statement for the object type.
func (tm *ObjectIndexer) CreateTableSql(writer io.Writer) error {
_, err := fmt.Fprintf(writer, "CREATE TABLE IF NOT EXISTS %q (\n\t", tm.TableName())
if err != nil {
return err
}
isSingleton := false
if len(tm.typ.KeyFields) == 0 {
isSingleton = true
_, err = fmt.Fprintf(writer, "_id INTEGER NOT NULL CHECK (_id = 1),\n\t")
if err != nil {
return err
}
} else {
for _, field := range tm.typ.KeyFields {
err = tm.createColumnDefinition(writer, field)
if err != nil {
return err
}
}
}
for _, field := range tm.typ.ValueFields {
err = tm.createColumnDefinition(writer, field)
if err != nil {
return err
}
}
// add _deleted column when we have RetainDeletions set and enabled
if !tm.options.DisableRetainDeletions && tm.typ.RetainDeletions {
_, err = fmt.Fprintf(writer, "_deleted BOOLEAN NOT NULL DEFAULT FALSE,\n\t")
if err != nil {
return err
}
}
var pKeys []string
if !isSingleton {
for _, field := range tm.typ.KeyFields {
name, err := tm.updatableColumnName(field)
if err != nil {
return err
}
pKeys = append(pKeys, name)
}
} else {
pKeys = []string{"_id"}
}
_, err = fmt.Fprintf(writer, "PRIMARY KEY (%s)", strings.Join(pKeys, ", "))
if err != nil {
return err
}
_, err = fmt.Fprintf(writer, "\n);\n")
if err != nil {
return err
}
// we GRANT SELECT on the table to PUBLIC so that the table is automatically available
// for querying using off-the-shelf tools like pg_graphql, Postgrest, Postgraphile, etc.
// without any login permissions
_, err = fmt.Fprintf(writer, "GRANT SELECT ON TABLE %q TO PUBLIC;", tm.TableName())
if err != nil {
return err
}
return nil
}