mirror of
https://github.com/immich-app/immich.git
synced 2026-05-18 03:10:24 +03:00
sql-tools changes
This commit is contained in:
@@ -12,6 +12,7 @@ export const compareParameters = (): Comparer<DatabaseParameter> => ({
|
|||||||
{
|
{
|
||||||
type: 'ParameterReset',
|
type: 'ParameterReset',
|
||||||
databaseName: target.databaseName,
|
databaseName: target.databaseName,
|
||||||
|
tableName: target.tableName,
|
||||||
parameterName: target.name,
|
parameterName: target.name,
|
||||||
reason: Reason.MissingInSource,
|
reason: Reason.MissingInSource,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,11 +3,22 @@ import { Processor } from 'src/sql-tools/types';
|
|||||||
|
|
||||||
export const processConfigurationParameters: Processor = (ctx, items) => {
|
export const processConfigurationParameters: Processor = (ctx, items) => {
|
||||||
for (const {
|
for (const {
|
||||||
item: { options },
|
item: { object, options },
|
||||||
} of items.filter((item) => item.type === 'configurationParameter')) {
|
} of items.filter((item) => item.type === 'configurationParameter')) {
|
||||||
|
let tableName: string | undefined;
|
||||||
|
if (options.scope === 'table') {
|
||||||
|
const table = ctx.getTableByObject(object);
|
||||||
|
if (!table) {
|
||||||
|
ctx.warn('@ConfigurationParameter', `Unable to find table for table-scoped parameter "${options.name}"`);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
tableName = table.name;
|
||||||
|
}
|
||||||
|
|
||||||
ctx.parameters.push({
|
ctx.parameters.push({
|
||||||
databaseName: ctx.databaseName,
|
databaseName: ctx.databaseName,
|
||||||
name: options.name,
|
tableName,
|
||||||
|
name: tableName ? `${tableName}.${options.name}` : options.name,
|
||||||
value: fromColumnValue(options.value),
|
value: fromColumnValue(options.value),
|
||||||
scope: options.scope,
|
scope: options.scope,
|
||||||
synchronize: options.synchronize ?? true,
|
synchronize: options.synchronize ?? true,
|
||||||
|
|||||||
@@ -17,4 +17,36 @@ export const readParameters: Reader = async (ctx, db) => {
|
|||||||
synchronize: true,
|
synchronize: true,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Read table-scoped storage parameters from pg_class.reloptions
|
||||||
|
const tableParams = await db
|
||||||
|
.selectFrom('pg_class')
|
||||||
|
.innerJoin('pg_namespace', 'pg_namespace.oid', 'pg_class.relnamespace')
|
||||||
|
.where('pg_namespace.nspname', '=', ctx.schemaName)
|
||||||
|
.where('pg_class.relkind', '=', sql.lit('r'))
|
||||||
|
.where('pg_class.reloptions', 'is not', null)
|
||||||
|
.select(['pg_class.relname as table_name', 'pg_class.reloptions'])
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
for (const row of tableParams) {
|
||||||
|
if (!row.reloptions) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for (const option of row.reloptions) {
|
||||||
|
const eqIdx = option.indexOf('=');
|
||||||
|
if (eqIdx === -1) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const name = option.slice(0, eqIdx);
|
||||||
|
const value = option.slice(eqIdx + 1);
|
||||||
|
ctx.parameters.push({
|
||||||
|
name: `${row.table_name}.${name}`,
|
||||||
|
tableName: row.table_name,
|
||||||
|
value,
|
||||||
|
databaseName: ctx.databaseName,
|
||||||
|
scope: 'table',
|
||||||
|
synchronize: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ export const transformParameters: SqlTransformer = (ctx, item) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
case 'ParameterReset': {
|
case 'ParameterReset': {
|
||||||
return asParameterReset(item.databaseName, item.parameterName);
|
return asParameterReset(item.databaseName, item.parameterName, item.tableName);
|
||||||
}
|
}
|
||||||
|
|
||||||
default: {
|
default: {
|
||||||
@@ -17,7 +17,19 @@ export const transformParameters: SqlTransformer = (ctx, item) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const getParameterName = (parameter: DatabaseParameter): string => {
|
||||||
|
if (parameter.scope === 'table' && parameter.tableName && parameter.name.startsWith(`${parameter.tableName}.`)) {
|
||||||
|
return parameter.name.slice(parameter.tableName.length + 1);
|
||||||
|
}
|
||||||
|
return parameter.name;
|
||||||
|
};
|
||||||
|
|
||||||
const asParameterSet = (parameter: DatabaseParameter): string => {
|
const asParameterSet = (parameter: DatabaseParameter): string => {
|
||||||
|
if (parameter.scope === 'table' && parameter.tableName) {
|
||||||
|
const paramName = getParameterName(parameter);
|
||||||
|
return `ALTER TABLE "${parameter.tableName}" SET (${paramName} = ${parameter.value})`;
|
||||||
|
}
|
||||||
|
|
||||||
let sql = '';
|
let sql = '';
|
||||||
if (parameter.scope === 'database') {
|
if (parameter.scope === 'database') {
|
||||||
sql += `ALTER DATABASE "${parameter.databaseName}" `;
|
sql += `ALTER DATABASE "${parameter.databaseName}" `;
|
||||||
@@ -28,6 +40,9 @@ const asParameterSet = (parameter: DatabaseParameter): string => {
|
|||||||
return sql;
|
return sql;
|
||||||
};
|
};
|
||||||
|
|
||||||
const asParameterReset = (databaseName: string, parameterName: string): string => {
|
const asParameterReset = (databaseName: string, parameterName: string, tableName?: string): string => {
|
||||||
|
if (tableName) {
|
||||||
|
return `ALTER TABLE "${tableName}" RESET (${parameterName})`;
|
||||||
|
}
|
||||||
return `ALTER DATABASE "${databaseName}" RESET "${parameterName}"`;
|
return `ALTER DATABASE "${databaseName}" RESET "${parameterName}"`;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -86,6 +86,7 @@ export type PostgresDB = {
|
|||||||
relhasindex: PostgresYesOrNo;
|
relhasindex: PostgresYesOrNo;
|
||||||
relisshared: PostgresYesOrNo;
|
relisshared: PostgresYesOrNo;
|
||||||
relpersistence: string;
|
relpersistence: string;
|
||||||
|
reloptions: string[] | null;
|
||||||
};
|
};
|
||||||
|
|
||||||
pg_constraint: {
|
pg_constraint: {
|
||||||
@@ -306,6 +307,7 @@ export enum ActionType {
|
|||||||
export type ColumnStorage = 'default' | 'external' | 'extended' | 'main';
|
export type ColumnStorage = 'default' | 'external' | 'extended' | 'main';
|
||||||
|
|
||||||
export type ColumnType =
|
export type ColumnType =
|
||||||
|
| '"char"'
|
||||||
| 'bigint'
|
| 'bigint'
|
||||||
| 'boolean'
|
| 'boolean'
|
||||||
| 'bytea'
|
| 'bytea'
|
||||||
@@ -316,6 +318,7 @@ export type ColumnType =
|
|||||||
| 'integer'
|
| 'integer'
|
||||||
| 'jsonb'
|
| 'jsonb'
|
||||||
| 'polygon'
|
| 'polygon'
|
||||||
|
| 'smallint'
|
||||||
| 'text'
|
| 'text'
|
||||||
| 'time'
|
| 'time'
|
||||||
| 'time with time zone'
|
| 'time with time zone'
|
||||||
@@ -344,12 +347,13 @@ export type DatabaseSchema = {
|
|||||||
export type DatabaseParameter = {
|
export type DatabaseParameter = {
|
||||||
name: string;
|
name: string;
|
||||||
databaseName: string;
|
databaseName: string;
|
||||||
|
tableName?: string;
|
||||||
value: string | number | null | undefined;
|
value: string | number | null | undefined;
|
||||||
scope: ParameterScope;
|
scope: ParameterScope;
|
||||||
synchronize: boolean;
|
synchronize: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type ParameterScope = 'database' | 'user';
|
export type ParameterScope = 'database' | 'table' | 'user';
|
||||||
|
|
||||||
export type DatabaseOverride = {
|
export type DatabaseOverride = {
|
||||||
name: string;
|
name: string;
|
||||||
@@ -506,7 +510,7 @@ export type SchemaDiff = { reason: string } & (
|
|||||||
| { type: 'TriggerCreate'; trigger: DatabaseTrigger }
|
| { type: 'TriggerCreate'; trigger: DatabaseTrigger }
|
||||||
| { type: 'TriggerDrop'; tableName: string; triggerName: string }
|
| { type: 'TriggerDrop'; tableName: string; triggerName: string }
|
||||||
| { type: 'ParameterSet'; parameter: DatabaseParameter }
|
| { type: 'ParameterSet'; parameter: DatabaseParameter }
|
||||||
| { type: 'ParameterReset'; databaseName: string; parameterName: string }
|
| { type: 'ParameterReset'; databaseName: string; tableName?: string; parameterName: string }
|
||||||
| { type: 'EnumCreate'; enum: DatabaseEnum }
|
| { type: 'EnumCreate'; enum: DatabaseEnum }
|
||||||
| { type: 'EnumDrop'; enumName: string }
|
| { type: 'EnumDrop'; enumName: string }
|
||||||
| { type: 'OverrideCreate'; override: DatabaseOverride }
|
| { type: 'OverrideCreate'; override: DatabaseOverride }
|
||||||
|
|||||||
Reference in New Issue
Block a user