{"version":3,"file":"schema-inspector.mjs","sources":["../../../src/dialects/postgresql/schema-inspector.ts"],"sourcesContent":["import type { Database } from '../..';\nimport type { Schema, Column, Index, ForeignKey } from '../../schema/types';\nimport type { SchemaInspector } from '../dialect';\n\ninterface RawColumn {\n table_name: string;\n data_type: string;\n column_name: string;\n character_maximum_length: number;\n column_default: string;\n is_nullable: string;\n}\n\ninterface RawIndex {\n table_name: string;\n indexrelid: string;\n index_name: string;\n column_name: string;\n is_unique: boolean;\n is_primary: boolean;\n}\n\ninterface RawTable {\n table_name: string;\n}\n\nconst SQL_QUERIES = {\n TABLE_LIST: /* sql */ `\n SELECT *\n FROM information_schema.tables\n WHERE\n table_schema = ?\n AND table_type = 'BASE TABLE'\n AND table_name != 'geometry_columns'\n AND table_name != 'spatial_ref_sys';\n `,\n BULK_COLUMNS: /* sql */ `\n SELECT table_name, data_type, column_name, character_maximum_length, column_default, is_nullable\n FROM information_schema.columns\n WHERE table_schema = ? AND table_name = ANY(?);\n `,\n BULK_INDEXES: /* sql */ `\n SELECT\n t.relname as table_name,\n ix.indexrelid,\n i.relname as index_name,\n a.attname as column_name,\n ix.indisunique as is_unique,\n ix.indisprimary as is_primary\n FROM\n pg_class t,\n pg_namespace s,\n pg_class i,\n pg_index ix,\n pg_attribute a\n WHERE\n t.oid = ix.indrelid\n AND i.oid = ix.indexrelid\n AND a.attrelid = t.oid\n AND a.attnum = ANY(ix.indkey)\n AND t.relkind = 'r'\n AND t.relnamespace = s.oid\n AND s.nspname = ?\n AND t.relname = ANY(?);\n `,\n BULK_FOREIGN_KEYS: /* sql */ `\n SELECT\n cl.relname AS table_name,\n c.conname AS constraint_name,\n att.attname AS column_name,\n fcl.relname AS foreign_table,\n fatt.attname AS fk_column_name,\n CASE c.confupdtype\n WHEN 'a' THEN 'NO ACTION'\n WHEN 'r' THEN 'RESTRICT'\n WHEN 'c' THEN 'CASCADE'\n WHEN 'n' THEN 'SET NULL'\n WHEN 'd' THEN 'SET DEFAULT'\n END AS on_update,\n CASE c.confdeltype\n WHEN 'a' THEN 'NO ACTION'\n WHEN 'r' THEN 'RESTRICT'\n WHEN 'c' THEN 'CASCADE'\n WHEN 'n' THEN 'SET NULL'\n WHEN 'd' THEN 'SET DEFAULT'\n END AS on_delete\n FROM pg_constraint c\n JOIN pg_class cl ON cl.oid = c.conrelid\n JOIN pg_namespace n ON n.oid = cl.relnamespace\n JOIN pg_class fcl ON fcl.oid = c.confrelid\n JOIN LATERAL unnest(c.conkey, c.confkey) AS cols(conkey, confkey) ON true\n JOIN pg_attribute att ON att.attrelid = c.conrelid AND att.attnum = cols.conkey\n JOIN pg_attribute fatt ON fatt.attrelid = c.confrelid AND fatt.attnum = cols.confkey\n WHERE c.contype = 'f'\n AND n.nspname = ?\n AND cl.relname = ANY(?)\n AND fcl.relnamespace = cl.relnamespace\n ORDER BY cl.relname, c.conname, cols.conkey;\n `,\n};\n\nconst toStrapiType = (column: RawColumn) => {\n const rootType = column.data_type.toLowerCase().match(/[^(), ]+/)?.[0];\n\n switch (rootType) {\n case 'integer': {\n // find a way to figure out the increments\n return { type: 'integer' };\n }\n case 'text': {\n return { type: 'text', args: ['longtext'] };\n }\n case 'boolean': {\n return { type: 'boolean' };\n }\n case 'character': {\n return { type: 'string', args: [column.character_maximum_length] };\n }\n case 'timestamp': {\n return { type: 'datetime', args: [{ useTz: false, precision: 6 }] };\n }\n case 'date': {\n return { type: 'date' };\n }\n case 'time': {\n return { type: 'time', args: [{ precision: 3 }] };\n }\n case 'numeric': {\n return { type: 'decimal', args: [10, 2] };\n }\n case 'real':\n case 'double': {\n return { type: 'double' };\n }\n case 'bigint': {\n return { type: 'bigInteger' };\n }\n case 'jsonb': {\n return { type: 'jsonb' };\n }\n default: {\n return { type: 'specificType', args: [column.data_type] };\n }\n }\n};\n\nconst getIndexType = (index: RawIndex) => {\n if (index.is_primary) {\n return 'primary';\n }\n\n if (index.is_unique) {\n return 'unique';\n }\n};\n\nexport default class PostgresqlSchemaInspector implements SchemaInspector {\n db: Database;\n\n constructor(db: Database) {\n this.db = db;\n }\n\n async getSchema() {\n const schema: Schema = { tables: [] };\n const dbSchema = this.getDatabaseSchema();\n\n const tables = await this.getTables();\n\n if (tables.length === 0) {\n return schema;\n }\n\n // Run 3 bulk queries in parallel instead of N+1 per-table queries\n const [allColumns, allIndexes, allForeignKeys] = await Promise.all([\n this.getBulkColumns(dbSchema, tables),\n this.getBulkIndexes(dbSchema, tables),\n this.getBulkForeignKeys(dbSchema, tables),\n ]);\n\n schema.tables = tables.map((tableName) => ({\n name: tableName,\n columns: allColumns.get(tableName) ?? [],\n indexes: allIndexes.get(tableName) ?? [],\n foreignKeys: allForeignKeys.get(tableName) ?? [],\n }));\n\n return schema;\n }\n\n getDatabaseSchema(): string {\n return this.db.getSchemaName() || 'public';\n }\n\n async getTables(): Promise {\n const { rows } = await this.db.connection.raw<{ rows: RawTable[] }>(SQL_QUERIES.TABLE_LIST, [\n this.getDatabaseSchema(),\n ]);\n\n return rows.map((row) => row.table_name);\n }\n\n async getBulkColumns(dbSchema: string, tableNames: string[]): Promise> {\n if (tableNames.length === 0) {\n return new Map();\n }\n\n const { rows } = await this.db.connection.raw<{ rows: RawColumn[] }>(SQL_QUERIES.BULK_COLUMNS, [\n dbSchema,\n tableNames,\n ]);\n\n const result = new Map();\n\n for (const row of rows) {\n const { type, args = [], ...rest } = toStrapiType(row);\n const defaultTo =\n row.column_default && row.column_default.includes('nextval(') ? null : row.column_default;\n\n const column: Column = {\n type,\n args,\n defaultTo,\n name: row.column_name,\n notNullable: row.is_nullable === 'NO',\n unsigned: false,\n ...rest,\n };\n\n const existing = result.get(row.table_name);\n if (existing) {\n existing.push(column);\n } else {\n result.set(row.table_name, [column]);\n }\n }\n\n return result;\n }\n\n async getBulkIndexes(dbSchema: string, tableNames: string[]): Promise> {\n if (tableNames.length === 0) {\n return new Map();\n }\n\n const { rows } = await this.db.connection.raw<{ rows: RawIndex[] }>(SQL_QUERIES.BULK_INDEXES, [\n dbSchema,\n tableNames,\n ]);\n\n // Group by table, then by indexrelid\n const byTable = new Map>();\n\n for (const index of rows) {\n if (index.column_name === 'id') {\n continue;\n }\n\n let tableIndexes = byTable.get(index.table_name);\n if (!tableIndexes) {\n tableIndexes = new Map();\n byTable.set(index.table_name, tableIndexes);\n }\n\n const existing = tableIndexes.get(index.indexrelid);\n if (existing) {\n existing.columns.push(index.column_name);\n } else {\n tableIndexes.set(index.indexrelid, {\n columns: [index.column_name],\n name: index.index_name,\n type: getIndexType(index),\n });\n }\n }\n\n const result = new Map();\n for (const [tableName, tableIndexes] of byTable) {\n result.set(tableName, Array.from(tableIndexes.values()));\n }\n\n return result;\n }\n\n async getIndexes(tableName: string): Promise {\n const dbSchema = this.getDatabaseSchema();\n const result = await this.getBulkIndexes(dbSchema, [tableName]);\n return result.get(tableName) ?? [];\n }\n\n async getForeignKeys(tableName: string): Promise {\n const dbSchema = this.getDatabaseSchema();\n const result = await this.getBulkForeignKeys(dbSchema, [tableName]);\n return result.get(tableName) ?? [];\n }\n\n async getBulkForeignKeys(\n dbSchema: string,\n tableNames: string[]\n ): Promise> {\n if (tableNames.length === 0) {\n return new Map();\n }\n\n const { rows } = await this.db.connection.raw<{\n rows: Array<{\n table_name: string;\n constraint_name: string;\n column_name: string;\n on_update: string;\n on_delete: string;\n foreign_table: string;\n fk_column_name: string;\n }>;\n }>(SQL_QUERIES.BULK_FOREIGN_KEYS, [dbSchema, tableNames]);\n\n // Group by table_name, then by constraint_name\n const byTable = new Map>();\n\n for (const row of rows) {\n let tableFKs = byTable.get(row.table_name);\n if (!tableFKs) {\n tableFKs = new Map();\n byTable.set(row.table_name, tableFKs);\n }\n\n let fk = tableFKs.get(row.constraint_name);\n if (!fk) {\n fk = {\n name: row.constraint_name,\n columns: [row.column_name],\n referencedColumns: [row.fk_column_name],\n referencedTable: row.foreign_table,\n onUpdate: row.on_update?.toUpperCase() ?? null,\n onDelete: row.on_delete?.toUpperCase() ?? null,\n };\n tableFKs.set(row.constraint_name, fk);\n } else {\n if (!fk.columns.includes(row.column_name)) {\n fk.columns.push(row.column_name);\n }\n if (!fk.referencedColumns.includes(row.fk_column_name)) {\n fk.referencedColumns.push(row.fk_column_name);\n }\n }\n }\n\n const result = new Map();\n for (const [tableName, tableFKs] of byTable) {\n result.set(tableName, Array.from(tableFKs.values()));\n }\n\n return result;\n }\n}\n"],"names":["SQL_QUERIES","TABLE_LIST","BULK_COLUMNS","BULK_INDEXES","BULK_FOREIGN_KEYS","toStrapiType","column","rootType","data_type","toLowerCase","match","type","args","character_maximum_length","useTz","precision","getIndexType","index","is_primary","is_unique","PostgresqlSchemaInspector","getSchema","schema","tables","dbSchema","getDatabaseSchema","getTables","length","allColumns","allIndexes","allForeignKeys","Promise","all","getBulkColumns","getBulkIndexes","getBulkForeignKeys","map","tableName","name","columns","get","indexes","foreignKeys","db","getSchemaName","rows","connection","raw","row","table_name","tableNames","Map","result","rest","defaultTo","column_default","includes","column_name","notNullable","is_nullable","unsigned","existing","push","set","byTable","tableIndexes","indexrelid","index_name","Array","from","values","getIndexes","getForeignKeys","tableFKs","fk","constraint_name","referencedColumns","fk_column_name","referencedTable","foreign_table","onUpdate","on_update","toUpperCase","onDelete","on_delete"],"mappings":"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"}