{"version":3,"file":"schema-inspector.mjs","sources":["../../../src/dialects/mysql/schema-inspector.ts"],"sourcesContent":["import type { Column, ForeignKey, Index, Schema } from '../../schema/types';\nimport type { SchemaInspector } from '../dialect';\nimport type { Database } from '../..';\n\ninterface RawTable {\n table_name: string;\n}\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 column_type: string;\n column_key: string;\n}\n\ninterface RawIndex {\n table_name: string;\n key_name: string;\n column_name: string;\n non_unique: number | string;\n}\n\ninterface RawForeignKey {\n table_name: string;\n constraint_name: string;\n column_name: string;\n referenced_table_name: string | null;\n referenced_column_name: string | null;\n on_update: string;\n on_delete: string;\n}\n\nconst SQL_QUERIES = {\n TABLE_LIST: /* sql */ `\n SELECT\n t.table_name as table_name\n FROM information_schema.tables t\n WHERE table_type = 'BASE TABLE'\n AND table_schema = schema();\n `,\n BULK_COLUMNS: /* sql */ `\n SELECT\n c.table_name as table_name,\n c.data_type as data_type,\n c.column_name as column_name,\n c.character_maximum_length as character_maximum_length,\n c.column_default as column_default,\n c.is_nullable as is_nullable,\n c.column_type as column_type,\n c.column_key as column_key\n FROM information_schema.columns c\n WHERE table_schema = database()\n AND table_name in (:tables);\n `,\n BULK_INDEXES: /* sql */ `\n SELECT\n s.table_name as table_name,\n s.index_name as key_name,\n s.column_name as column_name,\n s.non_unique as non_unique\n FROM information_schema.statistics s\n WHERE s.table_schema = database()\n AND s.table_name in (:tables)\n ORDER BY s.table_name, s.index_name, s.seq_in_index;\n `,\n BULK_FOREIGN_KEYS: /* sql */ `\n SELECT\n tc.table_name as table_name,\n tc.constraint_name as constraint_name,\n kcu.column_name as column_name,\n kcu.referenced_table_name as referenced_table_name,\n kcu.referenced_column_name as referenced_column_name,\n rc.update_rule as on_update,\n rc.delete_rule as on_delete\n FROM information_schema.table_constraints tc\n JOIN information_schema.key_column_usage kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.table_schema = kcu.table_schema\n AND tc.table_name = kcu.table_name\n JOIN information_schema.referential_constraints rc\n ON tc.constraint_name = rc.constraint_name\n AND tc.table_schema = rc.constraint_schema\n AND tc.table_name = rc.table_name\n WHERE tc.constraint_type = 'FOREIGN KEY'\n AND tc.table_schema = database()\n AND tc.table_name in (:tables)\n ORDER BY tc.table_name, tc.constraint_name, kcu.ordinal_position;\n `,\n};\n\nconst toStrapiType = (column: RawColumn) => {\n const rootType = column.data_type.toLowerCase().match(/[^(), ]+/)?.[0];\n\n switch (rootType) {\n case 'int': {\n if (column.column_key === 'PRI') {\n return { type: 'increments', args: [{ primary: true, primaryKey: true }], unsigned: false };\n }\n\n return { type: 'integer' };\n }\n case 'decimal': {\n return { type: 'decimal', args: [10, 2] };\n }\n case 'double': {\n return { type: 'double' };\n }\n case 'bigint': {\n return { type: 'bigInteger' };\n }\n case 'enum': {\n return { type: 'string' };\n }\n case 'tinyint': {\n return { type: 'boolean' };\n }\n case 'longtext': {\n return { type: 'text', args: ['longtext'] };\n }\n case 'varchar': {\n return { type: 'string', args: [column.character_maximum_length] };\n }\n case 'datetime': {\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 'timestamp': {\n return { type: 'timestamp', args: [{ useTz: false, precision: 6 }] };\n }\n case 'json': {\n return { type: 'jsonb' };\n }\n default: {\n return { type: 'specificType', args: [column.data_type] };\n }\n }\n};\n\nexport default class MysqlSchemaInspector 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\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(tables),\n this.getBulkIndexes(tables),\n this.getBulkForeignKeys(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 async getTables(): Promise {\n const [rows] = await this.db.connection.raw<[RawTable[]]>(SQL_QUERIES.TABLE_LIST);\n\n return rows.map((row) => row.table_name);\n }\n\n async getBulkColumns(tableNames: string[]): Promise> {\n if (tableNames.length === 0) {\n return new Map();\n }\n\n const [rows] = await this.db.connection.raw<[RawColumn[]]>(SQL_QUERIES.BULK_COLUMNS, {\n tables: this.db.connection.raw(tableNames.map(() => '?').join(', '), tableNames),\n });\n\n const result = new Map();\n\n for (const row of rows) {\n const { type, args = [], ...rest } = toStrapiType(row);\n\n const column: Column = {\n type,\n args,\n defaultTo: row.column_default,\n name: row.column_name,\n notNullable: row.is_nullable === 'NO',\n unsigned: row.column_type.endsWith(' unsigned'),\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 getColumns(tableName: string): Promise {\n const result = await this.getBulkColumns([tableName]);\n return result.get(tableName) ?? [];\n }\n\n async getBulkIndexes(tableNames: string[]): Promise> {\n if (tableNames.length === 0) {\n return new Map();\n }\n\n const [rows] = await this.db.connection.raw<[RawIndex[]]>(SQL_QUERIES.BULK_INDEXES, {\n tables: this.db.connection.raw(tableNames.map(() => '?').join(', '), tableNames),\n });\n\n // Group by table, then by key_name\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.key_name);\n if (existing) {\n existing.columns.push(index.column_name);\n } else {\n const indexInfo: Index = {\n columns: [index.column_name],\n name: index.key_name,\n };\n if (!index.non_unique || index.non_unique === '0') {\n indexInfo.type = 'unique';\n }\n tableIndexes.set(index.key_name, indexInfo);\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 result = await this.getBulkIndexes([tableName]);\n return result.get(tableName) ?? [];\n }\n\n async getBulkForeignKeys(tableNames: string[]): Promise> {\n if (tableNames.length === 0) {\n return new Map();\n }\n\n const [rows] = await this.db.connection.raw<[RawForeignKey[]]>(SQL_QUERIES.BULK_FOREIGN_KEYS, {\n tables: this.db.connection.raw(tableNames.map(() => '?').join(', '), tableNames),\n });\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.referenced_column_name ? [row.referenced_column_name] : [],\n referencedTable: row.referenced_table_name,\n onUpdate: row.on_update?.toUpperCase() ?? null,\n onDelete: row.on_delete?.toUpperCase() ?? null,\n } as unknown as ForeignKey;\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 (\n row.referenced_column_name &&\n !fk.referencedColumns.includes(row.referenced_column_name)\n ) {\n fk.referencedColumns.push(row.referenced_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 async getForeignKeys(tableName: string): Promise {\n const result = await this.getBulkForeignKeys([tableName]);\n return result.get(tableName) ?? [];\n }\n}\n"],"names":["SQL_QUERIES","TABLE_LIST","BULK_COLUMNS","BULK_INDEXES","BULK_FOREIGN_KEYS","toStrapiType","column","rootType","data_type","toLowerCase","match","column_key","type","args","primary","primaryKey","unsigned","character_maximum_length","useTz","precision","MysqlSchemaInspector","getSchema","schema","tables","getTables","length","allColumns","allIndexes","allForeignKeys","Promise","all","getBulkColumns","getBulkIndexes","getBulkForeignKeys","map","tableName","name","columns","get","indexes","foreignKeys","rows","db","connection","raw","row","table_name","tableNames","Map","join","result","rest","defaultTo","column_default","column_name","notNullable","is_nullable","column_type","endsWith","existing","push","set","getColumns","byTable","index","tableIndexes","key_name","indexInfo","non_unique","Array","from","values","getIndexes","tableFKs","fk","constraint_name","referencedColumns","referenced_column_name","referencedTable","referenced_table_name","onUpdate","on_update","toUpperCase","onDelete","on_delete","includes","getForeignKeys"],"mappings":"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"}