1
import { useEnv } from '@directus/env';
2
import type { Knex } from 'knex';
3
import { getDatabaseVersion } from '../../../index.js';
4
import { SchemaHelper } from '../types.js';
8
export class SchemaHelperMySQL extends SchemaHelper {
9
override applyMultiRelationalSort(
11
dbQuery: Knex.QueryBuilder,
14
orderByString: string,
15
orderByFields: Knex.Raw[],
16
): Knex.QueryBuilder {
17
if (getDatabaseVersion()?.startsWith('5.7')) {
18
dbQuery.orderByRaw(`?? asc, ${orderByString}`, [`${table}.${primaryKey}`, ...orderByFields]);
23
`??, ( @rank := IF ( @cur_id = deep.${primaryKey}, @rank + 1, 1 ) ) AS directus_row_number, ( @cur_id := deep.${primaryKey} ) AS current_id`,
27
.from(knex.raw('? as ??, (SELECT @rank := 0, @cur_id := null) vars', [dbQuery, 'deep']));
32
return super.applyMultiRelationalSort(knex, dbQuery, table, primaryKey, orderByString, orderByFields);
35
override async getDatabaseSize(): Promise<number | null> {
37
const result = (await this.knex
41
.select(this.knex.raw('data_length + index_length AS size'))
42
.from('information_schema.TABLES')
43
.where('table_schema', '=', String(env['DB_DATABASE']))
45
)) as Record<string, any>[];
47
return result[0]?.['size'] ? Number(result[0]?.['size']) : null;