directus

Форк
0
52 строки · 1.5 Кб
1
import { useEnv } from '@directus/env';
2
import type { Knex } from 'knex';
3
import { getDatabaseVersion } from '../../../index.js';
4
import { SchemaHelper } from '../types.js';
5

6
const env = useEnv();
7

8
export class SchemaHelperMySQL extends SchemaHelper {
9
	override applyMultiRelationalSort(
10
		knex: Knex,
11
		dbQuery: Knex.QueryBuilder,
12
		table: string,
13
		primaryKey: string,
14
		orderByString: string,
15
		orderByFields: Knex.Raw[],
16
	): Knex.QueryBuilder {
17
		if (getDatabaseVersion()?.startsWith('5.7')) {
18
			dbQuery.orderByRaw(`?? asc, ${orderByString}`, [`${table}.${primaryKey}`, ...orderByFields]);
19

20
			dbQuery = knex
21
				.select(
22
					knex.raw(
23
						`??, ( @rank := IF ( @cur_id = deep.${primaryKey}, @rank + 1, 1 ) ) AS directus_row_number, ( @cur_id := deep.${primaryKey} ) AS current_id`,
24
						'deep.*',
25
					),
26
				)
27
				.from(knex.raw('? as ??, (SELECT @rank := 0,  @cur_id := null) vars', [dbQuery, 'deep']));
28

29
			return dbQuery;
30
		}
31

32
		return super.applyMultiRelationalSort(knex, dbQuery, table, primaryKey, orderByString, orderByFields);
33
	}
34

35
	override async getDatabaseSize(): Promise<number | null> {
36
		try {
37
			const result = (await this.knex
38
				.sum('size AS size')
39
				.from(
40
					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']))
44
						.as('size'),
45
				)) as Record<string, any>[];
46

47
			return result[0]?.['size'] ? Number(result[0]?.['size']) : null;
48
		} catch {
49
			return null;
50
		}
51
	}
52
}
53

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.