@strapi/database 5.57.0 → 5.59.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +15 -2
- package/dist/connection.js.map +1 -1
- package/dist/connection.mjs +15 -2
- package/dist/connection.mjs.map +1 -1
- package/dist/dialects/sqlite/index.js +3 -3
- package/dist/dialects/sqlite/index.js.map +1 -1
- package/dist/dialects/sqlite/index.mjs +3 -3
- package/dist/dialects/sqlite/index.mjs.map +1 -1
- package/dist/entity-manager/regular-relations.js +1 -1
- package/dist/entity-manager/regular-relations.js.map +1 -1
- package/dist/entity-manager/regular-relations.mjs +1 -1
- package/dist/entity-manager/regular-relations.mjs.map +1 -1
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +55 -13
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +44 -3
- package/dist/index.mjs.map +1 -1
- package/dist/migrations/internal.d.ts.map +1 -1
- package/dist/migrations/internal.js +1 -0
- package/dist/migrations/internal.js.map +1 -1
- package/dist/migrations/internal.mjs +1 -0
- package/dist/migrations/internal.mjs.map +1 -1
- package/dist/migrations/runner.d.ts +2 -0
- package/dist/migrations/runner.d.ts.map +1 -1
- package/dist/migrations/runner.js +7 -2
- package/dist/migrations/runner.js.map +1 -1
- package/dist/migrations/runner.mjs +7 -2
- package/dist/migrations/runner.mjs.map +1 -1
- package/dist/migrations/users.d.ts.map +1 -1
- package/dist/migrations/users.js +1 -0
- package/dist/migrations/users.js.map +1 -1
- package/dist/migrations/users.mjs +1 -0
- package/dist/migrations/users.mjs.map +1 -1
- package/dist/pool-diagnostics/details.d.ts +58 -0
- package/dist/pool-diagnostics/details.d.ts.map +1 -0
- package/dist/pool-diagnostics/details.js +42 -0
- package/dist/pool-diagnostics/details.js.map +1 -0
- package/dist/pool-diagnostics/details.mjs +38 -0
- package/dist/pool-diagnostics/details.mjs.map +1 -0
- package/dist/pool-diagnostics/event-loop.d.ts +31 -0
- package/dist/pool-diagnostics/event-loop.d.ts.map +1 -0
- package/dist/pool-diagnostics/event-loop.js +59 -0
- package/dist/pool-diagnostics/event-loop.js.map +1 -0
- package/dist/pool-diagnostics/event-loop.mjs +54 -0
- package/dist/pool-diagnostics/event-loop.mjs.map +1 -0
- package/dist/pool-diagnostics/format.d.ts +9 -0
- package/dist/pool-diagnostics/format.d.ts.map +1 -0
- package/dist/pool-diagnostics/format.js +46 -0
- package/dist/pool-diagnostics/format.js.map +1 -0
- package/dist/pool-diagnostics/format.mjs +42 -0
- package/dist/pool-diagnostics/format.mjs.map +1 -0
- package/dist/pool-diagnostics/index.d.ts +33 -0
- package/dist/pool-diagnostics/index.d.ts.map +1 -0
- package/dist/pool-diagnostics/index.js +117 -0
- package/dist/pool-diagnostics/index.js.map +1 -0
- package/dist/pool-diagnostics/index.mjs +109 -0
- package/dist/pool-diagnostics/index.mjs.map +1 -0
- package/dist/pool-diagnostics/stack.d.ts +12 -0
- package/dist/pool-diagnostics/stack.d.ts.map +1 -0
- package/dist/pool-diagnostics/stack.js +46 -0
- package/dist/pool-diagnostics/stack.js.map +1 -0
- package/dist/pool-diagnostics/stack.mjs +44 -0
- package/dist/pool-diagnostics/stack.mjs.map +1 -0
- package/dist/query/helpers/populate/apply.d.ts.map +1 -1
- package/dist/query/helpers/populate/apply.js +21 -3
- package/dist/query/helpers/populate/apply.js.map +1 -1
- package/dist/query/helpers/populate/apply.mjs +21 -3
- package/dist/query/helpers/populate/apply.mjs.map +1 -1
- package/dist/query/helpers/streams/readable.d.ts +1 -1
- package/dist/query/helpers/streams/readable.d.ts.map +1 -1
- package/dist/query/helpers/streams/readable.js +2 -2
- package/dist/query/helpers/streams/readable.js.map +1 -1
- package/dist/query/helpers/streams/readable.mjs +1 -1
- package/dist/query/helpers/streams/readable.mjs.map +1 -1
- package/dist/schema/diff.d.ts.map +1 -1
- package/dist/schema/diff.js +3 -3
- package/dist/schema/diff.js.map +1 -1
- package/dist/schema/diff.mjs +3 -3
- package/dist/schema/diff.mjs.map +1 -1
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +20 -18
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/index.mjs +20 -18
- package/dist/schema/index.mjs.map +1 -1
- package/dist/utils/knex-log.d.ts +19 -0
- package/dist/utils/knex-log.d.ts.map +1 -0
- package/dist/utils/knex-log.js +51 -0
- package/dist/utils/knex-log.js.map +1 -0
- package/dist/utils/knex-log.mjs +47 -0
- package/dist/utils/knex-log.mjs.map +1 -0
- package/dist/utils/throttle.d.ts +26 -0
- package/dist/utils/throttle.d.ts.map +1 -0
- package/dist/utils/throttle.js +34 -0
- package/dist/utils/throttle.js.map +1 -0
- package/dist/utils/throttle.mjs +32 -0
- package/dist/utils/throttle.mjs.map +1 -0
- package/dist/utils/types.d.ts.map +1 -1
- package/dist/utils/types.js +9 -9
- package/dist/utils/types.js.map +1 -1
- package/dist/utils/types.mjs +9 -9
- package/dist/utils/types.mjs.map +1 -1
- package/package.json +7 -7
package/dist/connection.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,QAAA,MAAM,SAAS;;;;CAId,CAAC;AAEF,KAAK,UAAU,GAAG,MAAM,OAAO,SAAS,CAAC;AAEzC,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,UAAU,CAE1E;AAED,eAAO,MAAM,gBAAgB,GAAI,YAAY,IAAI,CAAC,MAAM,EAAE,eAAe,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,QAAA,MAAM,SAAS;;;;CAId,CAAC;AAEF,KAAK,UAAU,GAAG,MAAM,OAAO,SAAS,CAAC;AAEzC,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,UAAU,CAE1E;AAED,eAAO,MAAM,gBAAgB,GAAI,YAAY,IAAI,CAAC,MAAM,EAAE,eAAe,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,8BA6C5F,CAAC"}
|
package/dist/connection.js
CHANGED
|
@@ -24,7 +24,10 @@ const createConnection = (userConfig, strapiConfig)=>{
|
|
|
24
24
|
};
|
|
25
25
|
// initialization code to run upon opening a new connection
|
|
26
26
|
if (strapiConfig?.pool?.afterCreate) {
|
|
27
|
-
|
|
27
|
+
// copy so the wrapper below is not written into the caller's pool config (shared with strapi.config)
|
|
28
|
+
knexConfig.pool = {
|
|
29
|
+
...knexConfig.pool
|
|
30
|
+
};
|
|
28
31
|
// if the user has set their own afterCreate in config, we will replace it and call it
|
|
29
32
|
const userAfterCreate = knexConfig.pool?.afterCreate;
|
|
30
33
|
const strapiAfterCreate = strapiConfig.pool.afterCreate;
|
|
@@ -40,7 +43,17 @@ const createConnection = (userConfig, strapiConfig)=>{
|
|
|
40
43
|
});
|
|
41
44
|
};
|
|
42
45
|
}
|
|
43
|
-
|
|
46
|
+
const instance = knex__default.default(knexConfig);
|
|
47
|
+
// knex up to 3.2.6 made `password` non-enumerable on the connection object it was given, which
|
|
48
|
+
// is the live config object, so it stayed out of JSON.stringify and Object.keys. 3.2.7 clones the
|
|
49
|
+
// config instead and hides it on the clone only, so do it here. The value is unchanged.
|
|
50
|
+
const connection = userConfig.connection;
|
|
51
|
+
if (typeof connection === 'object' && connection !== null && Object.prototype.hasOwnProperty.call(connection, 'password')) {
|
|
52
|
+
Object.defineProperty(connection, 'password', {
|
|
53
|
+
enumerable: false
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
return instance;
|
|
44
57
|
};
|
|
45
58
|
|
|
46
59
|
exports.createConnection = createConnection;
|
package/dist/connection.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sources":["../src/connection.ts"],"sourcesContent":["import knex from 'knex';\nimport type { Knex } from 'knex';\n\nconst clientMap = {\n sqlite: 'better-sqlite3',\n mysql: 'mysql2',\n postgres: 'pg',\n};\n\ntype ClientKind = keyof typeof clientMap;\n\nexport function isDatabaseClientKind(client: unknown): client is ClientKind {\n return (client as string) in clientMap;\n}\n\nexport const createConnection = (userConfig: Knex.Config, strapiConfig?: Partial<Knex.Config>) => {\n if (!isDatabaseClientKind(userConfig.client)) {\n throw new Error(`Unsupported database client ${userConfig.client}`);\n }\n\n const knexConfig: Knex.Config = { ...userConfig, client: clientMap[userConfig.client] };\n\n // initialization code to run upon opening a new connection\n if (strapiConfig?.pool?.afterCreate) {\n knexConfig.pool = knexConfig.pool
|
|
1
|
+
{"version":3,"file":"connection.js","sources":["../src/connection.ts"],"sourcesContent":["import knex from 'knex';\nimport type { Knex } from 'knex';\n\nconst clientMap = {\n sqlite: 'better-sqlite3',\n mysql: 'mysql2',\n postgres: 'pg',\n};\n\ntype ClientKind = keyof typeof clientMap;\n\nexport function isDatabaseClientKind(client: unknown): client is ClientKind {\n return (client as string) in clientMap;\n}\n\nexport const createConnection = (userConfig: Knex.Config, strapiConfig?: Partial<Knex.Config>) => {\n if (!isDatabaseClientKind(userConfig.client)) {\n throw new Error(`Unsupported database client ${userConfig.client}`);\n }\n\n const knexConfig: Knex.Config = { ...userConfig, client: clientMap[userConfig.client] };\n\n // initialization code to run upon opening a new connection\n if (strapiConfig?.pool?.afterCreate) {\n // copy so the wrapper below is not written into the caller's pool config (shared with strapi.config)\n knexConfig.pool = { ...knexConfig.pool };\n // if the user has set their own afterCreate in config, we will replace it and call it\n const userAfterCreate = knexConfig.pool?.afterCreate;\n const strapiAfterCreate = strapiConfig.pool.afterCreate;\n knexConfig.pool.afterCreate = (\n conn: unknown,\n done: (err: Error | null | undefined, connection: any) => void\n ) => {\n strapiAfterCreate(conn, (err: Error | null | undefined, nativeConn: any) => {\n if (err) {\n return done(err, nativeConn);\n }\n if (userAfterCreate) {\n return userAfterCreate(nativeConn, done);\n }\n return done(null, nativeConn);\n });\n };\n }\n\n const instance = knex(knexConfig);\n\n // knex up to 3.2.6 made `password` non-enumerable on the connection object it was given, which\n // is the live config object, so it stayed out of JSON.stringify and Object.keys. 3.2.7 clones the\n // config instead and hides it on the clone only, so do it here. The value is unchanged.\n const connection = userConfig.connection;\n if (\n typeof connection === 'object' &&\n connection !== null &&\n Object.prototype.hasOwnProperty.call(connection, 'password')\n ) {\n Object.defineProperty(connection, 'password', { enumerable: false });\n }\n\n return instance;\n};\n"],"names":["clientMap","sqlite","mysql","postgres","isDatabaseClientKind","client","createConnection","userConfig","strapiConfig","Error","knexConfig","pool","afterCreate","userAfterCreate","strapiAfterCreate","conn","done","err","nativeConn","instance","knex","connection","Object","prototype","hasOwnProperty","call","defineProperty","enumerable"],"mappings":";;;;;;;;AAGA,MAAMA,SAAAA,GAAY;IAChBC,MAAAA,EAAQ,gBAAA;IACRC,KAAAA,EAAO,QAAA;IACPC,QAAAA,EAAU;AACZ,CAAA;AAIO,SAASC,qBAAqBC,MAAe,EAAA;AAClD,IAAA,OAAO,MAACA,IAAqBL,SAAAA;AAC/B;AAEO,MAAMM,gBAAAA,GAAmB,CAACC,UAAAA,EAAyBC,YAAAA,GAAAA;AACxD,IAAA,IAAI,CAACJ,oBAAAA,CAAqBG,UAAAA,CAAWF,MAAM,CAAA,EAAG;AAC5C,QAAA,MAAM,IAAII,KAAAA,CAAM,CAAC,4BAA4B,EAAEF,UAAAA,CAAWF,MAAM,CAAA,CAAE,CAAA;AACpE,IAAA;AAEA,IAAA,MAAMK,UAAAA,GAA0B;AAAE,QAAA,GAAGH,UAAU;AAAEF,QAAAA,MAAAA,EAAQL,SAAS,CAACO,UAAAA,CAAWF,MAAM;AAAE,KAAA;;IAGtF,IAAIG,YAAAA,EAAcG,MAAMC,WAAAA,EAAa;;AAEnCF,QAAAA,UAAAA,CAAWC,IAAI,GAAG;AAAE,YAAA,GAAGD,WAAWC;AAAK,SAAA;;QAEvC,MAAME,eAAAA,GAAkBH,UAAAA,CAAWC,IAAI,EAAEC,WAAAA;AACzC,QAAA,MAAME,iBAAAA,GAAoBN,YAAAA,CAAaG,IAAI,CAACC,WAAW;AACvDF,QAAAA,UAAAA,CAAWC,IAAI,CAACC,WAAW,GAAG,CAC5BG,IAAAA,EACAC,IAAAA,GAAAA;YAEAF,iBAAAA,CAAkBC,IAAAA,EAAM,CAACE,GAAAA,EAA+BC,UAAAA,GAAAA;AACtD,gBAAA,IAAID,GAAAA,EAAK;AACP,oBAAA,OAAOD,KAAKC,GAAAA,EAAKC,UAAAA,CAAAA;AACnB,gBAAA;AACA,gBAAA,IAAIL,eAAAA,EAAiB;AACnB,oBAAA,OAAOA,gBAAgBK,UAAAA,EAAYF,IAAAA,CAAAA;AACrC,gBAAA;AACA,gBAAA,OAAOA,KAAK,IAAA,EAAME,UAAAA,CAAAA;AACpB,YAAA,CAAA,CAAA;AACF,QAAA,CAAA;AACF,IAAA;AAEA,IAAA,MAAMC,WAAWC,qBAAAA,CAAKV,UAAAA,CAAAA;;;;IAKtB,MAAMW,UAAAA,GAAad,WAAWc,UAAU;AACxC,IAAA,IACE,OAAOA,UAAAA,KAAe,QAAA,IACtBA,UAAAA,KAAe,IAAA,IACfC,MAAAA,CAAOC,SAAS,CAACC,cAAc,CAACC,IAAI,CAACJ,YAAY,UAAA,CAAA,EACjD;QACAC,MAAAA,CAAOI,cAAc,CAACL,UAAAA,EAAY,UAAA,EAAY;YAAEM,UAAAA,EAAY;AAAM,SAAA,CAAA;AACpE,IAAA;IAEA,OAAOR,QAAAA;AACT;;;;;"}
|
package/dist/connection.mjs
CHANGED
|
@@ -18,7 +18,10 @@ const createConnection = (userConfig, strapiConfig)=>{
|
|
|
18
18
|
};
|
|
19
19
|
// initialization code to run upon opening a new connection
|
|
20
20
|
if (strapiConfig?.pool?.afterCreate) {
|
|
21
|
-
|
|
21
|
+
// copy so the wrapper below is not written into the caller's pool config (shared with strapi.config)
|
|
22
|
+
knexConfig.pool = {
|
|
23
|
+
...knexConfig.pool
|
|
24
|
+
};
|
|
22
25
|
// if the user has set their own afterCreate in config, we will replace it and call it
|
|
23
26
|
const userAfterCreate = knexConfig.pool?.afterCreate;
|
|
24
27
|
const strapiAfterCreate = strapiConfig.pool.afterCreate;
|
|
@@ -34,7 +37,17 @@ const createConnection = (userConfig, strapiConfig)=>{
|
|
|
34
37
|
});
|
|
35
38
|
};
|
|
36
39
|
}
|
|
37
|
-
|
|
40
|
+
const instance = knex(knexConfig);
|
|
41
|
+
// knex up to 3.2.6 made `password` non-enumerable on the connection object it was given, which
|
|
42
|
+
// is the live config object, so it stayed out of JSON.stringify and Object.keys. 3.2.7 clones the
|
|
43
|
+
// config instead and hides it on the clone only, so do it here. The value is unchanged.
|
|
44
|
+
const connection = userConfig.connection;
|
|
45
|
+
if (typeof connection === 'object' && connection !== null && Object.prototype.hasOwnProperty.call(connection, 'password')) {
|
|
46
|
+
Object.defineProperty(connection, 'password', {
|
|
47
|
+
enumerable: false
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return instance;
|
|
38
51
|
};
|
|
39
52
|
|
|
40
53
|
export { createConnection, isDatabaseClientKind };
|
package/dist/connection.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.mjs","sources":["../src/connection.ts"],"sourcesContent":["import knex from 'knex';\nimport type { Knex } from 'knex';\n\nconst clientMap = {\n sqlite: 'better-sqlite3',\n mysql: 'mysql2',\n postgres: 'pg',\n};\n\ntype ClientKind = keyof typeof clientMap;\n\nexport function isDatabaseClientKind(client: unknown): client is ClientKind {\n return (client as string) in clientMap;\n}\n\nexport const createConnection = (userConfig: Knex.Config, strapiConfig?: Partial<Knex.Config>) => {\n if (!isDatabaseClientKind(userConfig.client)) {\n throw new Error(`Unsupported database client ${userConfig.client}`);\n }\n\n const knexConfig: Knex.Config = { ...userConfig, client: clientMap[userConfig.client] };\n\n // initialization code to run upon opening a new connection\n if (strapiConfig?.pool?.afterCreate) {\n knexConfig.pool = knexConfig.pool
|
|
1
|
+
{"version":3,"file":"connection.mjs","sources":["../src/connection.ts"],"sourcesContent":["import knex from 'knex';\nimport type { Knex } from 'knex';\n\nconst clientMap = {\n sqlite: 'better-sqlite3',\n mysql: 'mysql2',\n postgres: 'pg',\n};\n\ntype ClientKind = keyof typeof clientMap;\n\nexport function isDatabaseClientKind(client: unknown): client is ClientKind {\n return (client as string) in clientMap;\n}\n\nexport const createConnection = (userConfig: Knex.Config, strapiConfig?: Partial<Knex.Config>) => {\n if (!isDatabaseClientKind(userConfig.client)) {\n throw new Error(`Unsupported database client ${userConfig.client}`);\n }\n\n const knexConfig: Knex.Config = { ...userConfig, client: clientMap[userConfig.client] };\n\n // initialization code to run upon opening a new connection\n if (strapiConfig?.pool?.afterCreate) {\n // copy so the wrapper below is not written into the caller's pool config (shared with strapi.config)\n knexConfig.pool = { ...knexConfig.pool };\n // if the user has set their own afterCreate in config, we will replace it and call it\n const userAfterCreate = knexConfig.pool?.afterCreate;\n const strapiAfterCreate = strapiConfig.pool.afterCreate;\n knexConfig.pool.afterCreate = (\n conn: unknown,\n done: (err: Error | null | undefined, connection: any) => void\n ) => {\n strapiAfterCreate(conn, (err: Error | null | undefined, nativeConn: any) => {\n if (err) {\n return done(err, nativeConn);\n }\n if (userAfterCreate) {\n return userAfterCreate(nativeConn, done);\n }\n return done(null, nativeConn);\n });\n };\n }\n\n const instance = knex(knexConfig);\n\n // knex up to 3.2.6 made `password` non-enumerable on the connection object it was given, which\n // is the live config object, so it stayed out of JSON.stringify and Object.keys. 3.2.7 clones the\n // config instead and hides it on the clone only, so do it here. The value is unchanged.\n const connection = userConfig.connection;\n if (\n typeof connection === 'object' &&\n connection !== null &&\n Object.prototype.hasOwnProperty.call(connection, 'password')\n ) {\n Object.defineProperty(connection, 'password', { enumerable: false });\n }\n\n return instance;\n};\n"],"names":["clientMap","sqlite","mysql","postgres","isDatabaseClientKind","client","createConnection","userConfig","strapiConfig","Error","knexConfig","pool","afterCreate","userAfterCreate","strapiAfterCreate","conn","done","err","nativeConn","instance","knex","connection","Object","prototype","hasOwnProperty","call","defineProperty","enumerable"],"mappings":";;AAGA,MAAMA,SAAAA,GAAY;IAChBC,MAAAA,EAAQ,gBAAA;IACRC,KAAAA,EAAO,QAAA;IACPC,QAAAA,EAAU;AACZ,CAAA;AAIO,SAASC,qBAAqBC,MAAe,EAAA;AAClD,IAAA,OAAO,MAACA,IAAqBL,SAAAA;AAC/B;AAEO,MAAMM,gBAAAA,GAAmB,CAACC,UAAAA,EAAyBC,YAAAA,GAAAA;AACxD,IAAA,IAAI,CAACJ,oBAAAA,CAAqBG,UAAAA,CAAWF,MAAM,CAAA,EAAG;AAC5C,QAAA,MAAM,IAAII,KAAAA,CAAM,CAAC,4BAA4B,EAAEF,UAAAA,CAAWF,MAAM,CAAA,CAAE,CAAA;AACpE,IAAA;AAEA,IAAA,MAAMK,UAAAA,GAA0B;AAAE,QAAA,GAAGH,UAAU;AAAEF,QAAAA,MAAAA,EAAQL,SAAS,CAACO,UAAAA,CAAWF,MAAM;AAAE,KAAA;;IAGtF,IAAIG,YAAAA,EAAcG,MAAMC,WAAAA,EAAa;;AAEnCF,QAAAA,UAAAA,CAAWC,IAAI,GAAG;AAAE,YAAA,GAAGD,WAAWC;AAAK,SAAA;;QAEvC,MAAME,eAAAA,GAAkBH,UAAAA,CAAWC,IAAI,EAAEC,WAAAA;AACzC,QAAA,MAAME,iBAAAA,GAAoBN,YAAAA,CAAaG,IAAI,CAACC,WAAW;AACvDF,QAAAA,UAAAA,CAAWC,IAAI,CAACC,WAAW,GAAG,CAC5BG,IAAAA,EACAC,IAAAA,GAAAA;YAEAF,iBAAAA,CAAkBC,IAAAA,EAAM,CAACE,GAAAA,EAA+BC,UAAAA,GAAAA;AACtD,gBAAA,IAAID,GAAAA,EAAK;AACP,oBAAA,OAAOD,KAAKC,GAAAA,EAAKC,UAAAA,CAAAA;AACnB,gBAAA;AACA,gBAAA,IAAIL,eAAAA,EAAiB;AACnB,oBAAA,OAAOA,gBAAgBK,UAAAA,EAAYF,IAAAA,CAAAA;AACrC,gBAAA;AACA,gBAAA,OAAOA,KAAK,IAAA,EAAME,UAAAA,CAAAA;AACpB,YAAA,CAAA,CAAA;AACF,QAAA,CAAA;AACF,IAAA;AAEA,IAAA,MAAMC,WAAWC,IAAAA,CAAKV,UAAAA,CAAAA;;;;IAKtB,MAAMW,UAAAA,GAAad,WAAWc,UAAU;AACxC,IAAA,IACE,OAAOA,UAAAA,KAAe,QAAA,IACtBA,UAAAA,KAAe,IAAA,IACfC,MAAAA,CAAOC,SAAS,CAACC,cAAc,CAACC,IAAI,CAACJ,YAAY,UAAA,CAAA,EACjD;QACAC,MAAAA,CAAOI,cAAc,CAACL,UAAAA,EAAY,UAAA,EAAY;YAAEM,UAAAA,EAAY;AAAM,SAAA,CAAA;AACpE,IAAA;IAEA,OAAOR,QAAAA;AACT;;;;"}
|
|
@@ -11,9 +11,9 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
|
11
11
|
var path__default = /*#__PURE__*/_interopDefault(path);
|
|
12
12
|
var fse__default = /*#__PURE__*/_interopDefault(fse);
|
|
13
13
|
|
|
14
|
-
const UNSUPPORTED_OPERATORS = [
|
|
14
|
+
const UNSUPPORTED_OPERATORS = new Set([
|
|
15
15
|
'$jsonSupersetOf'
|
|
16
|
-
];
|
|
16
|
+
]);
|
|
17
17
|
/** SQLite compound SELECT limit (SQLITE_MAX_COMPOUND_SELECT); Knex batch insert uses UNION ALL per row. */ const SQLITE_BATCH_INSERT_SIZE = 500;
|
|
18
18
|
class SqliteDialect extends dialect {
|
|
19
19
|
getBatchInsertSize() {
|
|
@@ -74,7 +74,7 @@ class SqliteDialect extends dialect {
|
|
|
74
74
|
}
|
|
75
75
|
}
|
|
76
76
|
supportsOperator(operator) {
|
|
77
|
-
return !UNSUPPORTED_OPERATORS.
|
|
77
|
+
return !UNSUPPORTED_OPERATORS.has(operator);
|
|
78
78
|
}
|
|
79
79
|
async startSchemaUpdate() {
|
|
80
80
|
await this.db.connection.raw(`pragma foreign_keys = off`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/dialects/sqlite/index.ts"],"sourcesContent":["import path from 'path';\nimport fse from 'fs-extra';\nimport type { Knex } from 'knex';\n\nimport * as errors from '../../errors';\nimport Dialect from '../dialect';\nimport SqliteSchemaInspector from './schema-inspector';\nimport type { Database } from '../..';\n\nconst UNSUPPORTED_OPERATORS = ['$jsonSupersetOf'];\n\n/** SQLite compound SELECT limit (SQLITE_MAX_COMPOUND_SELECT); Knex batch insert uses UNION ALL per row. */\nconst SQLITE_BATCH_INSERT_SIZE = 500;\n\nexport default class SqliteDialect extends Dialect {\n schemaInspector: SqliteSchemaInspector;\n\n constructor(db: Database) {\n super(db, 'sqlite');\n\n this.schemaInspector = new SqliteSchemaInspector(db);\n }\n\n getBatchInsertSize(): number {\n return SQLITE_BATCH_INSERT_SIZE;\n }\n\n configure(conn?: Knex.Sqlite3ConnectionConfig) {\n const connection =\n conn || (this.db.config.connection.connection as Knex.Sqlite3ConnectionConfig);\n if (typeof connection !== 'string') {\n connection.filename = path.resolve(connection.filename);\n }\n\n const dbDir = path.dirname(connection.filename);\n\n fse.ensureDirSync(dbDir);\n }\n\n useReturning() {\n return true;\n }\n\n async initialize(nativeConnection: unknown) {\n await this.db.connection.raw('pragma foreign_keys = on').connection(nativeConnection);\n }\n\n canAlterConstraints() {\n return false;\n }\n\n /**\n * SQLite foreign keys are unnamed (declared inline on the table), so only\n * indexes need dropping. Queries run on `trx`: SQLite pools hold a single\n * connection, which the migration transaction already owns.\n */\n async dropSchemaObject(\n trx: Knex,\n { table, name }: { table: string; name: string }\n ): Promise<boolean> {\n const indexes: Array<{ name: string }> = await trx.raw('pragma index_list(??)', [table]);\n\n if (!indexes.some((index) => index.name === name)) {\n return false;\n }\n\n await trx.raw('DROP INDEX ??', [name]);\n return true;\n }\n\n getSqlType(type: string) {\n switch (type) {\n case 'enum': {\n return 'text';\n }\n case 'double':\n case 'decimal': {\n return 'float';\n }\n case 'timestamp': {\n return 'datetime';\n }\n default: {\n return type;\n }\n }\n }\n\n supportsOperator(operator: string) {\n return !UNSUPPORTED_OPERATORS.
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/dialects/sqlite/index.ts"],"sourcesContent":["import path from 'path';\nimport fse from 'fs-extra';\nimport type { Knex } from 'knex';\n\nimport * as errors from '../../errors';\nimport Dialect from '../dialect';\nimport SqliteSchemaInspector from './schema-inspector';\nimport type { Database } from '../..';\n\nconst UNSUPPORTED_OPERATORS = new Set(['$jsonSupersetOf']);\n\n/** SQLite compound SELECT limit (SQLITE_MAX_COMPOUND_SELECT); Knex batch insert uses UNION ALL per row. */\nconst SQLITE_BATCH_INSERT_SIZE = 500;\n\nexport default class SqliteDialect extends Dialect {\n schemaInspector: SqliteSchemaInspector;\n\n constructor(db: Database) {\n super(db, 'sqlite');\n\n this.schemaInspector = new SqliteSchemaInspector(db);\n }\n\n getBatchInsertSize(): number {\n return SQLITE_BATCH_INSERT_SIZE;\n }\n\n configure(conn?: Knex.Sqlite3ConnectionConfig) {\n const connection =\n conn || (this.db.config.connection.connection as Knex.Sqlite3ConnectionConfig);\n if (typeof connection !== 'string') {\n connection.filename = path.resolve(connection.filename);\n }\n\n const dbDir = path.dirname(connection.filename);\n\n fse.ensureDirSync(dbDir);\n }\n\n useReturning() {\n return true;\n }\n\n async initialize(nativeConnection: unknown) {\n await this.db.connection.raw('pragma foreign_keys = on').connection(nativeConnection);\n }\n\n canAlterConstraints() {\n return false;\n }\n\n /**\n * SQLite foreign keys are unnamed (declared inline on the table), so only\n * indexes need dropping. Queries run on `trx`: SQLite pools hold a single\n * connection, which the migration transaction already owns.\n */\n async dropSchemaObject(\n trx: Knex,\n { table, name }: { table: string; name: string }\n ): Promise<boolean> {\n const indexes: Array<{ name: string }> = await trx.raw('pragma index_list(??)', [table]);\n\n if (!indexes.some((index) => index.name === name)) {\n return false;\n }\n\n await trx.raw('DROP INDEX ??', [name]);\n return true;\n }\n\n getSqlType(type: string) {\n switch (type) {\n case 'enum': {\n return 'text';\n }\n case 'double':\n case 'decimal': {\n return 'float';\n }\n case 'timestamp': {\n return 'datetime';\n }\n default: {\n return type;\n }\n }\n }\n\n supportsOperator(operator: string) {\n return !UNSUPPORTED_OPERATORS.has(operator);\n }\n\n async startSchemaUpdate() {\n await this.db.connection.raw(`pragma foreign_keys = off`);\n }\n\n async endSchemaUpdate() {\n await this.db.connection.raw(`pragma foreign_keys = on`);\n }\n\n transformErrors(error: NodeJS.ErrnoException) {\n switch (error.errno) {\n case 19: {\n throw new errors.NotNullError(); // TODO: extract column name\n }\n default: {\n super.transformErrors(error);\n }\n }\n }\n\n canAddIncrements() {\n return false;\n }\n}\n"],"names":["UNSUPPORTED_OPERATORS","Set","SQLITE_BATCH_INSERT_SIZE","SqliteDialect","Dialect","getBatchInsertSize","configure","conn","connection","db","config","filename","path","resolve","dbDir","dirname","fse","ensureDirSync","useReturning","initialize","nativeConnection","raw","canAlterConstraints","dropSchemaObject","trx","table","name","indexes","some","index","getSqlType","type","supportsOperator","operator","has","startSchemaUpdate","endSchemaUpdate","transformErrors","error","errno","errors","canAddIncrements","schemaInspector","SqliteSchemaInspector"],"mappings":"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"}
|
|
@@ -4,9 +4,9 @@ import NotNullError from '../../errors/not-null.mjs';
|
|
|
4
4
|
import Dialect from '../dialect.mjs';
|
|
5
5
|
import SqliteSchemaInspector from './schema-inspector.mjs';
|
|
6
6
|
|
|
7
|
-
const UNSUPPORTED_OPERATORS = [
|
|
7
|
+
const UNSUPPORTED_OPERATORS = new Set([
|
|
8
8
|
'$jsonSupersetOf'
|
|
9
|
-
];
|
|
9
|
+
]);
|
|
10
10
|
/** SQLite compound SELECT limit (SQLITE_MAX_COMPOUND_SELECT); Knex batch insert uses UNION ALL per row. */ const SQLITE_BATCH_INSERT_SIZE = 500;
|
|
11
11
|
class SqliteDialect extends Dialect {
|
|
12
12
|
getBatchInsertSize() {
|
|
@@ -67,7 +67,7 @@ class SqliteDialect extends Dialect {
|
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
69
|
supportsOperator(operator) {
|
|
70
|
-
return !UNSUPPORTED_OPERATORS.
|
|
70
|
+
return !UNSUPPORTED_OPERATORS.has(operator);
|
|
71
71
|
}
|
|
72
72
|
async startSchemaUpdate() {
|
|
73
73
|
await this.db.connection.raw(`pragma foreign_keys = off`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../src/dialects/sqlite/index.ts"],"sourcesContent":["import path from 'path';\nimport fse from 'fs-extra';\nimport type { Knex } from 'knex';\n\nimport * as errors from '../../errors';\nimport Dialect from '../dialect';\nimport SqliteSchemaInspector from './schema-inspector';\nimport type { Database } from '../..';\n\nconst UNSUPPORTED_OPERATORS = ['$jsonSupersetOf'];\n\n/** SQLite compound SELECT limit (SQLITE_MAX_COMPOUND_SELECT); Knex batch insert uses UNION ALL per row. */\nconst SQLITE_BATCH_INSERT_SIZE = 500;\n\nexport default class SqliteDialect extends Dialect {\n schemaInspector: SqliteSchemaInspector;\n\n constructor(db: Database) {\n super(db, 'sqlite');\n\n this.schemaInspector = new SqliteSchemaInspector(db);\n }\n\n getBatchInsertSize(): number {\n return SQLITE_BATCH_INSERT_SIZE;\n }\n\n configure(conn?: Knex.Sqlite3ConnectionConfig) {\n const connection =\n conn || (this.db.config.connection.connection as Knex.Sqlite3ConnectionConfig);\n if (typeof connection !== 'string') {\n connection.filename = path.resolve(connection.filename);\n }\n\n const dbDir = path.dirname(connection.filename);\n\n fse.ensureDirSync(dbDir);\n }\n\n useReturning() {\n return true;\n }\n\n async initialize(nativeConnection: unknown) {\n await this.db.connection.raw('pragma foreign_keys = on').connection(nativeConnection);\n }\n\n canAlterConstraints() {\n return false;\n }\n\n /**\n * SQLite foreign keys are unnamed (declared inline on the table), so only\n * indexes need dropping. Queries run on `trx`: SQLite pools hold a single\n * connection, which the migration transaction already owns.\n */\n async dropSchemaObject(\n trx: Knex,\n { table, name }: { table: string; name: string }\n ): Promise<boolean> {\n const indexes: Array<{ name: string }> = await trx.raw('pragma index_list(??)', [table]);\n\n if (!indexes.some((index) => index.name === name)) {\n return false;\n }\n\n await trx.raw('DROP INDEX ??', [name]);\n return true;\n }\n\n getSqlType(type: string) {\n switch (type) {\n case 'enum': {\n return 'text';\n }\n case 'double':\n case 'decimal': {\n return 'float';\n }\n case 'timestamp': {\n return 'datetime';\n }\n default: {\n return type;\n }\n }\n }\n\n supportsOperator(operator: string) {\n return !UNSUPPORTED_OPERATORS.
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../src/dialects/sqlite/index.ts"],"sourcesContent":["import path from 'path';\nimport fse from 'fs-extra';\nimport type { Knex } from 'knex';\n\nimport * as errors from '../../errors';\nimport Dialect from '../dialect';\nimport SqliteSchemaInspector from './schema-inspector';\nimport type { Database } from '../..';\n\nconst UNSUPPORTED_OPERATORS = new Set(['$jsonSupersetOf']);\n\n/** SQLite compound SELECT limit (SQLITE_MAX_COMPOUND_SELECT); Knex batch insert uses UNION ALL per row. */\nconst SQLITE_BATCH_INSERT_SIZE = 500;\n\nexport default class SqliteDialect extends Dialect {\n schemaInspector: SqliteSchemaInspector;\n\n constructor(db: Database) {\n super(db, 'sqlite');\n\n this.schemaInspector = new SqliteSchemaInspector(db);\n }\n\n getBatchInsertSize(): number {\n return SQLITE_BATCH_INSERT_SIZE;\n }\n\n configure(conn?: Knex.Sqlite3ConnectionConfig) {\n const connection =\n conn || (this.db.config.connection.connection as Knex.Sqlite3ConnectionConfig);\n if (typeof connection !== 'string') {\n connection.filename = path.resolve(connection.filename);\n }\n\n const dbDir = path.dirname(connection.filename);\n\n fse.ensureDirSync(dbDir);\n }\n\n useReturning() {\n return true;\n }\n\n async initialize(nativeConnection: unknown) {\n await this.db.connection.raw('pragma foreign_keys = on').connection(nativeConnection);\n }\n\n canAlterConstraints() {\n return false;\n }\n\n /**\n * SQLite foreign keys are unnamed (declared inline on the table), so only\n * indexes need dropping. Queries run on `trx`: SQLite pools hold a single\n * connection, which the migration transaction already owns.\n */\n async dropSchemaObject(\n trx: Knex,\n { table, name }: { table: string; name: string }\n ): Promise<boolean> {\n const indexes: Array<{ name: string }> = await trx.raw('pragma index_list(??)', [table]);\n\n if (!indexes.some((index) => index.name === name)) {\n return false;\n }\n\n await trx.raw('DROP INDEX ??', [name]);\n return true;\n }\n\n getSqlType(type: string) {\n switch (type) {\n case 'enum': {\n return 'text';\n }\n case 'double':\n case 'decimal': {\n return 'float';\n }\n case 'timestamp': {\n return 'datetime';\n }\n default: {\n return type;\n }\n }\n }\n\n supportsOperator(operator: string) {\n return !UNSUPPORTED_OPERATORS.has(operator);\n }\n\n async startSchemaUpdate() {\n await this.db.connection.raw(`pragma foreign_keys = off`);\n }\n\n async endSchemaUpdate() {\n await this.db.connection.raw(`pragma foreign_keys = on`);\n }\n\n transformErrors(error: NodeJS.ErrnoException) {\n switch (error.errno) {\n case 19: {\n throw new errors.NotNullError(); // TODO: extract column name\n }\n default: {\n super.transformErrors(error);\n }\n }\n }\n\n canAddIncrements() {\n return false;\n }\n}\n"],"names":["UNSUPPORTED_OPERATORS","Set","SQLITE_BATCH_INSERT_SIZE","SqliteDialect","Dialect","getBatchInsertSize","configure","conn","connection","db","config","filename","path","resolve","dbDir","dirname","fse","ensureDirSync","useReturning","initialize","nativeConnection","raw","canAlterConstraints","dropSchemaObject","trx","table","name","indexes","some","index","getSqlType","type","supportsOperator","operator","has","startSchemaUpdate","endSchemaUpdate","transformErrors","error","errno","errors","canAddIncrements","schemaInspector","SqliteSchemaInspector"],"mappings":"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"}
|
|
@@ -203,7 +203,7 @@ const getDocumentSiblingIdsQuery = (tableName, id)=>{
|
|
|
203
203
|
WHERE b.id = a.id;
|
|
204
204
|
*/ const updateInverseOrderColumn = async ()=>{
|
|
205
205
|
if (!relations.hasInverseOrderColumn(attribute) || _.isEmpty(inverseRelIds)) return;
|
|
206
|
-
const selectRowsToOrder = (joinTableName)=>db.connection(joinTableName).select('id').rowNumber('inv_order', inverseOrderColumnName, inverseJoinColumn.name).
|
|
206
|
+
const selectRowsToOrder = (joinTableName)=>db.connection(joinTableName).select('id').rowNumber('inv_order', inverseOrderColumnName, inverseJoinColumn.name).whereIn(inverseJoinColumn.name, inverseRelIds).toSQL();
|
|
207
207
|
switch(strapi.db.dialect.client){
|
|
208
208
|
case 'mysql':
|
|
209
209
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"regular-relations.js","sources":["../../src/entity-manager/regular-relations.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-namespace */\nimport { map, isEmpty } from 'lodash';\nimport type { Knex } from 'knex';\n\nimport {\n isBidirectional,\n isOneToAny,\n isManyToAny,\n isAnyToOne,\n hasOrderColumn,\n hasInverseOrderColumn,\n} from '../metadata';\nimport { createQueryBuilder } from '../query';\nimport { addSchema } from '../utils/knex';\nimport type { Database } from '..';\nimport type { ID, Relation, Model } from '../types';\n\ndeclare module 'knex' {\n namespace Knex {\n interface ChainableInterface {\n transacting(trx?: Knex.Transaction): this;\n }\n }\n}\n\n// TODO: This is a short term solution, to not steal relations from the same document.\nconst getDocumentSiblingIdsQuery = (tableName: string, id: ID) => {\n // Find if the model is a content type or something else (e.g. component)\n // to only get the documentId if it's a content type\n const models: Model[] = Array.from(strapi.db.metadata.values());\n\n const isContentType = models.find((model) => {\n return model.tableName === tableName && model.attributes.documentId;\n });\n\n if (!isContentType) {\n return [id];\n }\n\n // NOTE: SubQueries are wrapped in a function to not reuse the same connection,\n // which causes infinite self references\n return function findDocumentSiblingIds(query) {\n query\n .select('id')\n .from(tableName)\n // Get all child ids of the document id\n .whereIn('document_id', (documentIDSubQuery) => {\n documentIDSubQuery\n .from(tableName)\n // get document id related to the current id\n .select('document_id')\n .where('id', id);\n });\n } satisfies Knex.QueryCallback;\n};\n\n/**\n * If some relations currently exist for this oneToX relation, on the one side, this function removes them and update the inverse order if needed.\n */\nconst deletePreviousOneToAnyRelations = async ({\n id,\n attribute,\n relIdsToadd,\n db,\n transaction: trx,\n}: {\n id: ID;\n attribute: Relation.Bidirectional;\n relIdsToadd: ID[];\n db: Database;\n transaction?: Knex.Transaction;\n}) => {\n if (!(isBidirectional(attribute) && isOneToAny(attribute))) {\n throw new Error(\n 'deletePreviousOneToAnyRelations can only be called for bidirectional oneToAny relations'\n );\n }\n const { joinTable } = attribute;\n const { joinColumn, inverseJoinColumn } = joinTable;\n\n const con = db.getConnection();\n\n await con\n .delete()\n .from(joinTable.name)\n // Exclude the ids of the current document\n .whereNotIn(joinColumn.name, getDocumentSiblingIdsQuery(joinColumn.referencedTable!, id))\n // Include all the ids that are being connected\n .whereIn(inverseJoinColumn.name, relIdsToadd)\n .where(joinTable.on || {})\n .transacting(trx);\n\n await cleanOrderColumns({ attribute, db, inverseRelIds: relIdsToadd, transaction: trx });\n};\n\n/**\n * If a relation currently exists for this xToOne relations, this function removes it and update the inverse order if needed.\n */\nconst deletePreviousAnyToOneRelations = async ({\n id,\n attribute,\n relIdToadd,\n db,\n transaction: trx,\n}: {\n id: ID;\n attribute: Relation.Bidirectional;\n relIdToadd: ID;\n db: Database;\n transaction?: Knex.Transaction;\n}) => {\n const { joinTable } = attribute;\n const { joinColumn, inverseJoinColumn } = joinTable;\n const con = db.getConnection();\n\n if (!isAnyToOne(attribute)) {\n throw new Error('deletePreviousAnyToOneRelations can only be called for anyToOne relations');\n }\n // handling manyToOne\n if (isManyToAny(attribute)) {\n // if the database integrity was not broken relsToDelete is supposed to be of length 1\n const relsToDelete = await con\n .select(inverseJoinColumn.name)\n .from(joinTable.name)\n .where(joinColumn.name, id)\n .whereNotIn(\n inverseJoinColumn.name,\n getDocumentSiblingIdsQuery(inverseJoinColumn.referencedTable!, relIdToadd)\n )\n .where(joinTable.on || {})\n .transacting(trx);\n\n const relIdsToDelete = map(relsToDelete, inverseJoinColumn.name);\n\n await createQueryBuilder(joinTable.name, db)\n .delete()\n .where({\n [joinColumn.name]: id,\n [inverseJoinColumn.name]: { $in: relIdsToDelete },\n })\n .where(joinTable.on || {})\n .transacting(trx)\n .execute();\n\n await cleanOrderColumns({ attribute, db, inverseRelIds: relIdsToDelete, transaction: trx });\n\n // handling oneToOne\n } else {\n await con\n .delete()\n .from(joinTable.name)\n .where(joinColumn.name, id)\n // Exclude the ids of the current document\n .whereNotIn(\n inverseJoinColumn.name,\n getDocumentSiblingIdsQuery(inverseJoinColumn.referencedTable!, relIdToadd)\n )\n .where(joinTable.on || {})\n .transacting(trx);\n }\n};\n\n/**\n * Delete all or some relations of entity field\n */\nconst deleteRelations = async ({\n id,\n attribute,\n db,\n relIdsToNotDelete = [],\n relIdsToDelete = [],\n transaction: trx,\n}: {\n id: ID;\n attribute: Relation.Bidirectional;\n db: Database;\n relIdsToNotDelete?: ID[];\n relIdsToDelete?: ID[] | 'all';\n transaction?: Knex.Transaction;\n}) => {\n const { joinTable } = attribute;\n const { joinColumn, inverseJoinColumn } = joinTable;\n const all = relIdsToDelete === 'all';\n\n if (hasOrderColumn(attribute) || hasInverseOrderColumn(attribute)) {\n let lastId: ID = 0;\n let done = false;\n const batchSize = 100;\n\n while (!done) {\n const batchToDelete: { id: ID }[] = await createQueryBuilder(joinTable.name, db)\n .select(inverseJoinColumn.name)\n .where({\n [joinColumn.name]: id,\n id: { $gt: lastId },\n [inverseJoinColumn.name]: { $notIn: relIdsToNotDelete },\n ...(all ? {} : { [inverseJoinColumn.name]: { $in: relIdsToDelete } }),\n })\n .where(joinTable.on || {})\n .orderBy('id')\n .limit(batchSize)\n .transacting(trx)\n .execute();\n\n done = batchToDelete.length < batchSize;\n lastId = batchToDelete[batchToDelete.length - 1]?.id || 0;\n\n const batchIds = map(batchToDelete, inverseJoinColumn.name);\n\n await createQueryBuilder(joinTable.name, db)\n .delete()\n .where({\n [joinColumn.name]: id,\n [inverseJoinColumn.name]: { $in: batchIds },\n })\n .where(joinTable.on || {})\n .transacting(trx)\n .execute();\n\n await cleanOrderColumns({ attribute, db, id, inverseRelIds: batchIds, transaction: trx });\n }\n } else {\n await createQueryBuilder(joinTable.name, db)\n .delete()\n .where({\n [joinColumn.name]: id,\n [inverseJoinColumn.name]: { $notIn: relIdsToNotDelete },\n ...(all ? {} : { [inverseJoinColumn.name]: { $in: relIdsToDelete } }),\n })\n .where(joinTable.on || {})\n .transacting(trx)\n .execute();\n }\n};\n\n/**\n * Clean the order columns by ensuring the order value are continuous (ex: 1, 2, 3 and not 1, 5, 10)\n */\nconst cleanOrderColumns = async ({\n id,\n attribute,\n db,\n inverseRelIds = [],\n transaction: trx,\n}: {\n id?: ID;\n attribute: Relation.Bidirectional;\n db: Database;\n inverseRelIds?: ID[];\n transaction?: Knex.Transaction;\n}) => {\n if (\n !(hasOrderColumn(attribute) && id) &&\n !(hasInverseOrderColumn(attribute) && !isEmpty(inverseRelIds))\n ) {\n return;\n }\n\n const { joinTable } = attribute;\n const { joinColumn, inverseJoinColumn, orderColumnName, inverseOrderColumnName } = joinTable;\n\n /**\n UPDATE :joinTable: as a,\n (\n SELECT\n id,\n ROW_NUMBER() OVER ( PARTITION BY :joinColumn: ORDER BY :orderColumn:) AS src_order,\n FROM :joinTable:\n WHERE :joinColumn: = :id\n ) AS b\n SET :orderColumn: = b.src_order\n WHERE b.id = a.id;\n */\n const updateOrderColumn = async () => {\n if (!hasOrderColumn(attribute) || !id) {\n return;\n }\n\n const selectRowsToOrder = (joinTableName: string) =>\n db\n .connection(joinTableName)\n .select('id')\n .rowNumber('src_order', orderColumnName, joinColumn.name)\n .where(joinColumn.name, id)\n .toSQL();\n\n switch (strapi.db.dialect.client) {\n case 'mysql': {\n // Here it's MariaDB and MySQL 8\n const select = selectRowsToOrder(joinTable.name);\n\n await db\n .getConnection()\n .raw(\n `UPDATE ?? as a, ( ${select.sql} ) AS b\n SET ?? = b.src_order\n WHERE b.id = a.id`,\n [joinTable.name, ...select.bindings, orderColumnName]\n )\n .transacting(trx);\n\n break;\n }\n default: {\n const joinTableName = addSchema(db, joinTable.name);\n const select = selectRowsToOrder(joinTableName);\n\n // raw query as knex doesn't allow updating from a subquery\n await db.connection\n .raw(\n `UPDATE ?? as a\n SET ?? = b.src_order\n FROM ( ${select.sql} ) AS b\n WHERE b.id = a.id`,\n [joinTableName, orderColumnName, ...select.bindings]\n )\n .transacting(trx);\n }\n }\n };\n\n /**\n UPDATE :joinTable: as a,\n (\n SELECT\n id,\n ROW_NUMBER() OVER ( PARTITION BY :inverseJoinColumn: ORDER BY :inverseOrderColumn:) AS inv_order\n FROM :joinTable:\n WHERE :inverseJoinColumn: IN (:inverseRelIds)\n ) AS b\n SET :inverseOrderColumn: = b.inv_order\n WHERE b.id = a.id;\n */\n const updateInverseOrderColumn = async () => {\n if (!hasInverseOrderColumn(attribute) || isEmpty(inverseRelIds)) return;\n\n const selectRowsToOrder = (joinTableName: string) =>\n db\n .connection(joinTableName)\n .select('id')\n .rowNumber('inv_order', inverseOrderColumnName, inverseJoinColumn.name)\n .where(inverseJoinColumn.name, 'in', inverseRelIds)\n .toSQL();\n\n switch (strapi.db.dialect.client) {\n case 'mysql': {\n // Here it's MariaDB and MySQL 8\n const select = selectRowsToOrder(joinTable.name);\n\n await db\n .getConnection()\n .raw(\n `UPDATE ?? as a, ( ${select.sql} ) AS b\n SET ?? = b.inv_order\n WHERE b.id = a.id`,\n [joinTable.name, ...select.bindings, inverseOrderColumnName]\n )\n .transacting(trx);\n break;\n }\n default: {\n const joinTableName = addSchema(db, joinTable.name);\n const select = selectRowsToOrder(joinTableName);\n\n // raw query as knex doesn't allow updating from a subquery\n await db.connection\n .raw(\n `UPDATE ?? as a\n SET ?? = b.inv_order\n FROM ( ${select.sql} ) AS b\n WHERE b.id = a.id`,\n [joinTableName, inverseOrderColumnName, ...select.bindings]\n )\n .transacting(trx);\n }\n }\n };\n\n // Run updates in a deterministic order to avoid lock cycles on the same join table.\n await updateOrderColumn();\n await updateInverseOrderColumn();\n};\n\nexport {\n deletePreviousOneToAnyRelations,\n deletePreviousAnyToOneRelations,\n deleteRelations,\n cleanOrderColumns,\n};\n"],"names":["getDocumentSiblingIdsQuery","tableName","id","models","Array","from","strapi","db","metadata","values","isContentType","find","model","attributes","documentId","findDocumentSiblingIds","query","select","whereIn","documentIDSubQuery","where","deletePreviousOneToAnyRelations","attribute","relIdsToadd","transaction","trx","isBidirectional","isOneToAny","Error","joinTable","joinColumn","inverseJoinColumn","con","getConnection","delete","name","whereNotIn","referencedTable","on","transacting","cleanOrderColumns","inverseRelIds","deletePreviousAnyToOneRelations","relIdToadd","isAnyToOne","isManyToAny","relsToDelete","relIdsToDelete","map","createQueryBuilder","$in","execute","deleteRelations","relIdsToNotDelete","all","hasOrderColumn","hasInverseOrderColumn","lastId","done","batchSize","batchToDelete","$gt","$notIn","orderBy","limit","length","batchIds","isEmpty","orderColumnName","inverseOrderColumnName","updateOrderColumn","selectRowsToOrder","joinTableName","connection","rowNumber","toSQL","dialect","client","raw","sql","bindings","addSchema","updateInverseOrderColumn"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"regular-relations.js","sources":["../../src/entity-manager/regular-relations.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-namespace */\nimport { map, isEmpty } from 'lodash';\nimport type { Knex } from 'knex';\n\nimport {\n isBidirectional,\n isOneToAny,\n isManyToAny,\n isAnyToOne,\n hasOrderColumn,\n hasInverseOrderColumn,\n} from '../metadata';\nimport { createQueryBuilder } from '../query';\nimport { addSchema } from '../utils/knex';\nimport type { Database } from '..';\nimport type { ID, Relation, Model } from '../types';\n\ndeclare module 'knex' {\n namespace Knex {\n interface ChainableInterface {\n transacting(trx?: Knex.Transaction): this;\n }\n }\n}\n\n// TODO: This is a short term solution, to not steal relations from the same document.\nconst getDocumentSiblingIdsQuery = (tableName: string, id: ID) => {\n // Find if the model is a content type or something else (e.g. component)\n // to only get the documentId if it's a content type\n const models: Model[] = Array.from(strapi.db.metadata.values());\n\n const isContentType = models.find((model) => {\n return model.tableName === tableName && model.attributes.documentId;\n });\n\n if (!isContentType) {\n return [id];\n }\n\n // NOTE: SubQueries are wrapped in a function to not reuse the same connection,\n // which causes infinite self references\n return function findDocumentSiblingIds(query) {\n query\n .select('id')\n .from(tableName)\n // Get all child ids of the document id\n .whereIn('document_id', (documentIDSubQuery) => {\n documentIDSubQuery\n .from(tableName)\n // get document id related to the current id\n .select('document_id')\n .where('id', id);\n });\n } satisfies Knex.QueryCallback;\n};\n\n/**\n * If some relations currently exist for this oneToX relation, on the one side, this function removes them and update the inverse order if needed.\n */\nconst deletePreviousOneToAnyRelations = async ({\n id,\n attribute,\n relIdsToadd,\n db,\n transaction: trx,\n}: {\n id: ID;\n attribute: Relation.Bidirectional;\n relIdsToadd: ID[];\n db: Database;\n transaction?: Knex.Transaction;\n}) => {\n if (!(isBidirectional(attribute) && isOneToAny(attribute))) {\n throw new Error(\n 'deletePreviousOneToAnyRelations can only be called for bidirectional oneToAny relations'\n );\n }\n const { joinTable } = attribute;\n const { joinColumn, inverseJoinColumn } = joinTable;\n\n const con = db.getConnection();\n\n await con\n .delete()\n .from(joinTable.name)\n // Exclude the ids of the current document\n .whereNotIn(joinColumn.name, getDocumentSiblingIdsQuery(joinColumn.referencedTable!, id))\n // Include all the ids that are being connected\n .whereIn(inverseJoinColumn.name, relIdsToadd)\n .where(joinTable.on || {})\n .transacting(trx);\n\n await cleanOrderColumns({ attribute, db, inverseRelIds: relIdsToadd, transaction: trx });\n};\n\n/**\n * If a relation currently exists for this xToOne relations, this function removes it and update the inverse order if needed.\n */\nconst deletePreviousAnyToOneRelations = async ({\n id,\n attribute,\n relIdToadd,\n db,\n transaction: trx,\n}: {\n id: ID;\n attribute: Relation.Bidirectional;\n relIdToadd: ID;\n db: Database;\n transaction?: Knex.Transaction;\n}) => {\n const { joinTable } = attribute;\n const { joinColumn, inverseJoinColumn } = joinTable;\n const con = db.getConnection();\n\n if (!isAnyToOne(attribute)) {\n throw new Error('deletePreviousAnyToOneRelations can only be called for anyToOne relations');\n }\n // handling manyToOne\n if (isManyToAny(attribute)) {\n // if the database integrity was not broken relsToDelete is supposed to be of length 1\n const relsToDelete = await con\n .select(inverseJoinColumn.name)\n .from(joinTable.name)\n .where(joinColumn.name, id)\n .whereNotIn(\n inverseJoinColumn.name,\n getDocumentSiblingIdsQuery(inverseJoinColumn.referencedTable!, relIdToadd)\n )\n .where(joinTable.on || {})\n .transacting(trx);\n\n const relIdsToDelete = map(relsToDelete, inverseJoinColumn.name);\n\n await createQueryBuilder(joinTable.name, db)\n .delete()\n .where({\n [joinColumn.name]: id,\n [inverseJoinColumn.name]: { $in: relIdsToDelete },\n })\n .where(joinTable.on || {})\n .transacting(trx)\n .execute();\n\n await cleanOrderColumns({ attribute, db, inverseRelIds: relIdsToDelete, transaction: trx });\n\n // handling oneToOne\n } else {\n await con\n .delete()\n .from(joinTable.name)\n .where(joinColumn.name, id)\n // Exclude the ids of the current document\n .whereNotIn(\n inverseJoinColumn.name,\n getDocumentSiblingIdsQuery(inverseJoinColumn.referencedTable!, relIdToadd)\n )\n .where(joinTable.on || {})\n .transacting(trx);\n }\n};\n\n/**\n * Delete all or some relations of entity field\n */\nconst deleteRelations = async ({\n id,\n attribute,\n db,\n relIdsToNotDelete = [],\n relIdsToDelete = [],\n transaction: trx,\n}: {\n id: ID;\n attribute: Relation.Bidirectional;\n db: Database;\n relIdsToNotDelete?: ID[];\n relIdsToDelete?: ID[] | 'all';\n transaction?: Knex.Transaction;\n}) => {\n const { joinTable } = attribute;\n const { joinColumn, inverseJoinColumn } = joinTable;\n const all = relIdsToDelete === 'all';\n\n if (hasOrderColumn(attribute) || hasInverseOrderColumn(attribute)) {\n let lastId: ID = 0;\n let done = false;\n const batchSize = 100;\n\n while (!done) {\n const batchToDelete: { id: ID }[] = await createQueryBuilder(joinTable.name, db)\n .select(inverseJoinColumn.name)\n .where({\n [joinColumn.name]: id,\n id: { $gt: lastId },\n [inverseJoinColumn.name]: { $notIn: relIdsToNotDelete },\n ...(all ? {} : { [inverseJoinColumn.name]: { $in: relIdsToDelete } }),\n })\n .where(joinTable.on || {})\n .orderBy('id')\n .limit(batchSize)\n .transacting(trx)\n .execute();\n\n done = batchToDelete.length < batchSize;\n lastId = batchToDelete[batchToDelete.length - 1]?.id || 0;\n\n const batchIds = map(batchToDelete, inverseJoinColumn.name);\n\n await createQueryBuilder(joinTable.name, db)\n .delete()\n .where({\n [joinColumn.name]: id,\n [inverseJoinColumn.name]: { $in: batchIds },\n })\n .where(joinTable.on || {})\n .transacting(trx)\n .execute();\n\n await cleanOrderColumns({ attribute, db, id, inverseRelIds: batchIds, transaction: trx });\n }\n } else {\n await createQueryBuilder(joinTable.name, db)\n .delete()\n .where({\n [joinColumn.name]: id,\n [inverseJoinColumn.name]: { $notIn: relIdsToNotDelete },\n ...(all ? {} : { [inverseJoinColumn.name]: { $in: relIdsToDelete } }),\n })\n .where(joinTable.on || {})\n .transacting(trx)\n .execute();\n }\n};\n\n/**\n * Clean the order columns by ensuring the order value are continuous (ex: 1, 2, 3 and not 1, 5, 10)\n */\nconst cleanOrderColumns = async ({\n id,\n attribute,\n db,\n inverseRelIds = [],\n transaction: trx,\n}: {\n id?: ID;\n attribute: Relation.Bidirectional;\n db: Database;\n inverseRelIds?: ID[];\n transaction?: Knex.Transaction;\n}) => {\n if (\n !(hasOrderColumn(attribute) && id) &&\n !(hasInverseOrderColumn(attribute) && !isEmpty(inverseRelIds))\n ) {\n return;\n }\n\n const { joinTable } = attribute;\n const { joinColumn, inverseJoinColumn, orderColumnName, inverseOrderColumnName } = joinTable;\n\n /**\n UPDATE :joinTable: as a,\n (\n SELECT\n id,\n ROW_NUMBER() OVER ( PARTITION BY :joinColumn: ORDER BY :orderColumn:) AS src_order,\n FROM :joinTable:\n WHERE :joinColumn: = :id\n ) AS b\n SET :orderColumn: = b.src_order\n WHERE b.id = a.id;\n */\n const updateOrderColumn = async () => {\n if (!hasOrderColumn(attribute) || !id) {\n return;\n }\n\n const selectRowsToOrder = (joinTableName: string) =>\n db\n .connection(joinTableName)\n .select('id')\n .rowNumber('src_order', orderColumnName, joinColumn.name)\n .where(joinColumn.name, id)\n .toSQL();\n\n switch (strapi.db.dialect.client) {\n case 'mysql': {\n // Here it's MariaDB and MySQL 8\n const select = selectRowsToOrder(joinTable.name);\n\n await db\n .getConnection()\n .raw(\n `UPDATE ?? as a, ( ${select.sql} ) AS b\n SET ?? = b.src_order\n WHERE b.id = a.id`,\n [joinTable.name, ...select.bindings, orderColumnName]\n )\n .transacting(trx);\n\n break;\n }\n default: {\n const joinTableName = addSchema(db, joinTable.name);\n const select = selectRowsToOrder(joinTableName);\n\n // raw query as knex doesn't allow updating from a subquery\n await db.connection\n .raw(\n `UPDATE ?? as a\n SET ?? = b.src_order\n FROM ( ${select.sql} ) AS b\n WHERE b.id = a.id`,\n [joinTableName, orderColumnName, ...select.bindings]\n )\n .transacting(trx);\n }\n }\n };\n\n /**\n UPDATE :joinTable: as a,\n (\n SELECT\n id,\n ROW_NUMBER() OVER ( PARTITION BY :inverseJoinColumn: ORDER BY :inverseOrderColumn:) AS inv_order\n FROM :joinTable:\n WHERE :inverseJoinColumn: IN (:inverseRelIds)\n ) AS b\n SET :inverseOrderColumn: = b.inv_order\n WHERE b.id = a.id;\n */\n const updateInverseOrderColumn = async () => {\n if (!hasInverseOrderColumn(attribute) || isEmpty(inverseRelIds)) return;\n\n const selectRowsToOrder = (joinTableName: string) =>\n db\n .connection(joinTableName)\n .select('id')\n .rowNumber('inv_order', inverseOrderColumnName, inverseJoinColumn.name)\n .whereIn(inverseJoinColumn.name, inverseRelIds)\n .toSQL();\n\n switch (strapi.db.dialect.client) {\n case 'mysql': {\n // Here it's MariaDB and MySQL 8\n const select = selectRowsToOrder(joinTable.name);\n\n await db\n .getConnection()\n .raw(\n `UPDATE ?? as a, ( ${select.sql} ) AS b\n SET ?? = b.inv_order\n WHERE b.id = a.id`,\n [joinTable.name, ...select.bindings, inverseOrderColumnName]\n )\n .transacting(trx);\n break;\n }\n default: {\n const joinTableName = addSchema(db, joinTable.name);\n const select = selectRowsToOrder(joinTableName);\n\n // raw query as knex doesn't allow updating from a subquery\n await db.connection\n .raw(\n `UPDATE ?? as a\n SET ?? = b.inv_order\n FROM ( ${select.sql} ) AS b\n WHERE b.id = a.id`,\n [joinTableName, inverseOrderColumnName, ...select.bindings]\n )\n .transacting(trx);\n }\n }\n };\n\n // Run updates in a deterministic order to avoid lock cycles on the same join table.\n await updateOrderColumn();\n await updateInverseOrderColumn();\n};\n\nexport {\n deletePreviousOneToAnyRelations,\n deletePreviousAnyToOneRelations,\n deleteRelations,\n cleanOrderColumns,\n};\n"],"names":["getDocumentSiblingIdsQuery","tableName","id","models","Array","from","strapi","db","metadata","values","isContentType","find","model","attributes","documentId","findDocumentSiblingIds","query","select","whereIn","documentIDSubQuery","where","deletePreviousOneToAnyRelations","attribute","relIdsToadd","transaction","trx","isBidirectional","isOneToAny","Error","joinTable","joinColumn","inverseJoinColumn","con","getConnection","delete","name","whereNotIn","referencedTable","on","transacting","cleanOrderColumns","inverseRelIds","deletePreviousAnyToOneRelations","relIdToadd","isAnyToOne","isManyToAny","relsToDelete","relIdsToDelete","map","createQueryBuilder","$in","execute","deleteRelations","relIdsToNotDelete","all","hasOrderColumn","hasInverseOrderColumn","lastId","done","batchSize","batchToDelete","$gt","$notIn","orderBy","limit","length","batchIds","isEmpty","orderColumnName","inverseOrderColumnName","updateOrderColumn","selectRowsToOrder","joinTableName","connection","rowNumber","toSQL","dialect","client","raw","sql","bindings","addSchema","updateInverseOrderColumn"],"mappings":"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"}
|
|
@@ -201,7 +201,7 @@ const getDocumentSiblingIdsQuery = (tableName, id)=>{
|
|
|
201
201
|
WHERE b.id = a.id;
|
|
202
202
|
*/ const updateInverseOrderColumn = async ()=>{
|
|
203
203
|
if (!hasInverseOrderColumn(attribute) || isEmpty(inverseRelIds)) return;
|
|
204
|
-
const selectRowsToOrder = (joinTableName)=>db.connection(joinTableName).select('id').rowNumber('inv_order', inverseOrderColumnName, inverseJoinColumn.name).
|
|
204
|
+
const selectRowsToOrder = (joinTableName)=>db.connection(joinTableName).select('id').rowNumber('inv_order', inverseOrderColumnName, inverseJoinColumn.name).whereIn(inverseJoinColumn.name, inverseRelIds).toSQL();
|
|
205
205
|
switch(strapi.db.dialect.client){
|
|
206
206
|
case 'mysql':
|
|
207
207
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"regular-relations.mjs","sources":["../../src/entity-manager/regular-relations.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-namespace */\nimport { map, isEmpty } from 'lodash';\nimport type { Knex } from 'knex';\n\nimport {\n isBidirectional,\n isOneToAny,\n isManyToAny,\n isAnyToOne,\n hasOrderColumn,\n hasInverseOrderColumn,\n} from '../metadata';\nimport { createQueryBuilder } from '../query';\nimport { addSchema } from '../utils/knex';\nimport type { Database } from '..';\nimport type { ID, Relation, Model } from '../types';\n\ndeclare module 'knex' {\n namespace Knex {\n interface ChainableInterface {\n transacting(trx?: Knex.Transaction): this;\n }\n }\n}\n\n// TODO: This is a short term solution, to not steal relations from the same document.\nconst getDocumentSiblingIdsQuery = (tableName: string, id: ID) => {\n // Find if the model is a content type or something else (e.g. component)\n // to only get the documentId if it's a content type\n const models: Model[] = Array.from(strapi.db.metadata.values());\n\n const isContentType = models.find((model) => {\n return model.tableName === tableName && model.attributes.documentId;\n });\n\n if (!isContentType) {\n return [id];\n }\n\n // NOTE: SubQueries are wrapped in a function to not reuse the same connection,\n // which causes infinite self references\n return function findDocumentSiblingIds(query) {\n query\n .select('id')\n .from(tableName)\n // Get all child ids of the document id\n .whereIn('document_id', (documentIDSubQuery) => {\n documentIDSubQuery\n .from(tableName)\n // get document id related to the current id\n .select('document_id')\n .where('id', id);\n });\n } satisfies Knex.QueryCallback;\n};\n\n/**\n * If some relations currently exist for this oneToX relation, on the one side, this function removes them and update the inverse order if needed.\n */\nconst deletePreviousOneToAnyRelations = async ({\n id,\n attribute,\n relIdsToadd,\n db,\n transaction: trx,\n}: {\n id: ID;\n attribute: Relation.Bidirectional;\n relIdsToadd: ID[];\n db: Database;\n transaction?: Knex.Transaction;\n}) => {\n if (!(isBidirectional(attribute) && isOneToAny(attribute))) {\n throw new Error(\n 'deletePreviousOneToAnyRelations can only be called for bidirectional oneToAny relations'\n );\n }\n const { joinTable } = attribute;\n const { joinColumn, inverseJoinColumn } = joinTable;\n\n const con = db.getConnection();\n\n await con\n .delete()\n .from(joinTable.name)\n // Exclude the ids of the current document\n .whereNotIn(joinColumn.name, getDocumentSiblingIdsQuery(joinColumn.referencedTable!, id))\n // Include all the ids that are being connected\n .whereIn(inverseJoinColumn.name, relIdsToadd)\n .where(joinTable.on || {})\n .transacting(trx);\n\n await cleanOrderColumns({ attribute, db, inverseRelIds: relIdsToadd, transaction: trx });\n};\n\n/**\n * If a relation currently exists for this xToOne relations, this function removes it and update the inverse order if needed.\n */\nconst deletePreviousAnyToOneRelations = async ({\n id,\n attribute,\n relIdToadd,\n db,\n transaction: trx,\n}: {\n id: ID;\n attribute: Relation.Bidirectional;\n relIdToadd: ID;\n db: Database;\n transaction?: Knex.Transaction;\n}) => {\n const { joinTable } = attribute;\n const { joinColumn, inverseJoinColumn } = joinTable;\n const con = db.getConnection();\n\n if (!isAnyToOne(attribute)) {\n throw new Error('deletePreviousAnyToOneRelations can only be called for anyToOne relations');\n }\n // handling manyToOne\n if (isManyToAny(attribute)) {\n // if the database integrity was not broken relsToDelete is supposed to be of length 1\n const relsToDelete = await con\n .select(inverseJoinColumn.name)\n .from(joinTable.name)\n .where(joinColumn.name, id)\n .whereNotIn(\n inverseJoinColumn.name,\n getDocumentSiblingIdsQuery(inverseJoinColumn.referencedTable!, relIdToadd)\n )\n .where(joinTable.on || {})\n .transacting(trx);\n\n const relIdsToDelete = map(relsToDelete, inverseJoinColumn.name);\n\n await createQueryBuilder(joinTable.name, db)\n .delete()\n .where({\n [joinColumn.name]: id,\n [inverseJoinColumn.name]: { $in: relIdsToDelete },\n })\n .where(joinTable.on || {})\n .transacting(trx)\n .execute();\n\n await cleanOrderColumns({ attribute, db, inverseRelIds: relIdsToDelete, transaction: trx });\n\n // handling oneToOne\n } else {\n await con\n .delete()\n .from(joinTable.name)\n .where(joinColumn.name, id)\n // Exclude the ids of the current document\n .whereNotIn(\n inverseJoinColumn.name,\n getDocumentSiblingIdsQuery(inverseJoinColumn.referencedTable!, relIdToadd)\n )\n .where(joinTable.on || {})\n .transacting(trx);\n }\n};\n\n/**\n * Delete all or some relations of entity field\n */\nconst deleteRelations = async ({\n id,\n attribute,\n db,\n relIdsToNotDelete = [],\n relIdsToDelete = [],\n transaction: trx,\n}: {\n id: ID;\n attribute: Relation.Bidirectional;\n db: Database;\n relIdsToNotDelete?: ID[];\n relIdsToDelete?: ID[] | 'all';\n transaction?: Knex.Transaction;\n}) => {\n const { joinTable } = attribute;\n const { joinColumn, inverseJoinColumn } = joinTable;\n const all = relIdsToDelete === 'all';\n\n if (hasOrderColumn(attribute) || hasInverseOrderColumn(attribute)) {\n let lastId: ID = 0;\n let done = false;\n const batchSize = 100;\n\n while (!done) {\n const batchToDelete: { id: ID }[] = await createQueryBuilder(joinTable.name, db)\n .select(inverseJoinColumn.name)\n .where({\n [joinColumn.name]: id,\n id: { $gt: lastId },\n [inverseJoinColumn.name]: { $notIn: relIdsToNotDelete },\n ...(all ? {} : { [inverseJoinColumn.name]: { $in: relIdsToDelete } }),\n })\n .where(joinTable.on || {})\n .orderBy('id')\n .limit(batchSize)\n .transacting(trx)\n .execute();\n\n done = batchToDelete.length < batchSize;\n lastId = batchToDelete[batchToDelete.length - 1]?.id || 0;\n\n const batchIds = map(batchToDelete, inverseJoinColumn.name);\n\n await createQueryBuilder(joinTable.name, db)\n .delete()\n .where({\n [joinColumn.name]: id,\n [inverseJoinColumn.name]: { $in: batchIds },\n })\n .where(joinTable.on || {})\n .transacting(trx)\n .execute();\n\n await cleanOrderColumns({ attribute, db, id, inverseRelIds: batchIds, transaction: trx });\n }\n } else {\n await createQueryBuilder(joinTable.name, db)\n .delete()\n .where({\n [joinColumn.name]: id,\n [inverseJoinColumn.name]: { $notIn: relIdsToNotDelete },\n ...(all ? {} : { [inverseJoinColumn.name]: { $in: relIdsToDelete } }),\n })\n .where(joinTable.on || {})\n .transacting(trx)\n .execute();\n }\n};\n\n/**\n * Clean the order columns by ensuring the order value are continuous (ex: 1, 2, 3 and not 1, 5, 10)\n */\nconst cleanOrderColumns = async ({\n id,\n attribute,\n db,\n inverseRelIds = [],\n transaction: trx,\n}: {\n id?: ID;\n attribute: Relation.Bidirectional;\n db: Database;\n inverseRelIds?: ID[];\n transaction?: Knex.Transaction;\n}) => {\n if (\n !(hasOrderColumn(attribute) && id) &&\n !(hasInverseOrderColumn(attribute) && !isEmpty(inverseRelIds))\n ) {\n return;\n }\n\n const { joinTable } = attribute;\n const { joinColumn, inverseJoinColumn, orderColumnName, inverseOrderColumnName } = joinTable;\n\n /**\n UPDATE :joinTable: as a,\n (\n SELECT\n id,\n ROW_NUMBER() OVER ( PARTITION BY :joinColumn: ORDER BY :orderColumn:) AS src_order,\n FROM :joinTable:\n WHERE :joinColumn: = :id\n ) AS b\n SET :orderColumn: = b.src_order\n WHERE b.id = a.id;\n */\n const updateOrderColumn = async () => {\n if (!hasOrderColumn(attribute) || !id) {\n return;\n }\n\n const selectRowsToOrder = (joinTableName: string) =>\n db\n .connection(joinTableName)\n .select('id')\n .rowNumber('src_order', orderColumnName, joinColumn.name)\n .where(joinColumn.name, id)\n .toSQL();\n\n switch (strapi.db.dialect.client) {\n case 'mysql': {\n // Here it's MariaDB and MySQL 8\n const select = selectRowsToOrder(joinTable.name);\n\n await db\n .getConnection()\n .raw(\n `UPDATE ?? as a, ( ${select.sql} ) AS b\n SET ?? = b.src_order\n WHERE b.id = a.id`,\n [joinTable.name, ...select.bindings, orderColumnName]\n )\n .transacting(trx);\n\n break;\n }\n default: {\n const joinTableName = addSchema(db, joinTable.name);\n const select = selectRowsToOrder(joinTableName);\n\n // raw query as knex doesn't allow updating from a subquery\n await db.connection\n .raw(\n `UPDATE ?? as a\n SET ?? = b.src_order\n FROM ( ${select.sql} ) AS b\n WHERE b.id = a.id`,\n [joinTableName, orderColumnName, ...select.bindings]\n )\n .transacting(trx);\n }\n }\n };\n\n /**\n UPDATE :joinTable: as a,\n (\n SELECT\n id,\n ROW_NUMBER() OVER ( PARTITION BY :inverseJoinColumn: ORDER BY :inverseOrderColumn:) AS inv_order\n FROM :joinTable:\n WHERE :inverseJoinColumn: IN (:inverseRelIds)\n ) AS b\n SET :inverseOrderColumn: = b.inv_order\n WHERE b.id = a.id;\n */\n const updateInverseOrderColumn = async () => {\n if (!hasInverseOrderColumn(attribute) || isEmpty(inverseRelIds)) return;\n\n const selectRowsToOrder = (joinTableName: string) =>\n db\n .connection(joinTableName)\n .select('id')\n .rowNumber('inv_order', inverseOrderColumnName, inverseJoinColumn.name)\n .where(inverseJoinColumn.name, 'in', inverseRelIds)\n .toSQL();\n\n switch (strapi.db.dialect.client) {\n case 'mysql': {\n // Here it's MariaDB and MySQL 8\n const select = selectRowsToOrder(joinTable.name);\n\n await db\n .getConnection()\n .raw(\n `UPDATE ?? as a, ( ${select.sql} ) AS b\n SET ?? = b.inv_order\n WHERE b.id = a.id`,\n [joinTable.name, ...select.bindings, inverseOrderColumnName]\n )\n .transacting(trx);\n break;\n }\n default: {\n const joinTableName = addSchema(db, joinTable.name);\n const select = selectRowsToOrder(joinTableName);\n\n // raw query as knex doesn't allow updating from a subquery\n await db.connection\n .raw(\n `UPDATE ?? as a\n SET ?? = b.inv_order\n FROM ( ${select.sql} ) AS b\n WHERE b.id = a.id`,\n [joinTableName, inverseOrderColumnName, ...select.bindings]\n )\n .transacting(trx);\n }\n }\n };\n\n // Run updates in a deterministic order to avoid lock cycles on the same join table.\n await updateOrderColumn();\n await updateInverseOrderColumn();\n};\n\nexport {\n deletePreviousOneToAnyRelations,\n deletePreviousAnyToOneRelations,\n deleteRelations,\n cleanOrderColumns,\n};\n"],"names":["getDocumentSiblingIdsQuery","tableName","id","models","Array","from","strapi","db","metadata","values","isContentType","find","model","attributes","documentId","findDocumentSiblingIds","query","select","whereIn","documentIDSubQuery","where","deletePreviousOneToAnyRelations","attribute","relIdsToadd","transaction","trx","isBidirectional","isOneToAny","Error","joinTable","joinColumn","inverseJoinColumn","con","getConnection","delete","name","whereNotIn","referencedTable","on","transacting","cleanOrderColumns","inverseRelIds","deletePreviousAnyToOneRelations","relIdToadd","isAnyToOne","isManyToAny","relsToDelete","relIdsToDelete","map","createQueryBuilder","$in","execute","deleteRelations","relIdsToNotDelete","all","hasOrderColumn","hasInverseOrderColumn","lastId","done","batchSize","batchToDelete","$gt","$notIn","orderBy","limit","length","batchIds","isEmpty","orderColumnName","inverseOrderColumnName","updateOrderColumn","selectRowsToOrder","joinTableName","connection","rowNumber","toSQL","dialect","client","raw","sql","bindings","addSchema","updateInverseOrderColumn"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"regular-relations.mjs","sources":["../../src/entity-manager/regular-relations.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-namespace */\nimport { map, isEmpty } from 'lodash';\nimport type { Knex } from 'knex';\n\nimport {\n isBidirectional,\n isOneToAny,\n isManyToAny,\n isAnyToOne,\n hasOrderColumn,\n hasInverseOrderColumn,\n} from '../metadata';\nimport { createQueryBuilder } from '../query';\nimport { addSchema } from '../utils/knex';\nimport type { Database } from '..';\nimport type { ID, Relation, Model } from '../types';\n\ndeclare module 'knex' {\n namespace Knex {\n interface ChainableInterface {\n transacting(trx?: Knex.Transaction): this;\n }\n }\n}\n\n// TODO: This is a short term solution, to not steal relations from the same document.\nconst getDocumentSiblingIdsQuery = (tableName: string, id: ID) => {\n // Find if the model is a content type or something else (e.g. component)\n // to only get the documentId if it's a content type\n const models: Model[] = Array.from(strapi.db.metadata.values());\n\n const isContentType = models.find((model) => {\n return model.tableName === tableName && model.attributes.documentId;\n });\n\n if (!isContentType) {\n return [id];\n }\n\n // NOTE: SubQueries are wrapped in a function to not reuse the same connection,\n // which causes infinite self references\n return function findDocumentSiblingIds(query) {\n query\n .select('id')\n .from(tableName)\n // Get all child ids of the document id\n .whereIn('document_id', (documentIDSubQuery) => {\n documentIDSubQuery\n .from(tableName)\n // get document id related to the current id\n .select('document_id')\n .where('id', id);\n });\n } satisfies Knex.QueryCallback;\n};\n\n/**\n * If some relations currently exist for this oneToX relation, on the one side, this function removes them and update the inverse order if needed.\n */\nconst deletePreviousOneToAnyRelations = async ({\n id,\n attribute,\n relIdsToadd,\n db,\n transaction: trx,\n}: {\n id: ID;\n attribute: Relation.Bidirectional;\n relIdsToadd: ID[];\n db: Database;\n transaction?: Knex.Transaction;\n}) => {\n if (!(isBidirectional(attribute) && isOneToAny(attribute))) {\n throw new Error(\n 'deletePreviousOneToAnyRelations can only be called for bidirectional oneToAny relations'\n );\n }\n const { joinTable } = attribute;\n const { joinColumn, inverseJoinColumn } = joinTable;\n\n const con = db.getConnection();\n\n await con\n .delete()\n .from(joinTable.name)\n // Exclude the ids of the current document\n .whereNotIn(joinColumn.name, getDocumentSiblingIdsQuery(joinColumn.referencedTable!, id))\n // Include all the ids that are being connected\n .whereIn(inverseJoinColumn.name, relIdsToadd)\n .where(joinTable.on || {})\n .transacting(trx);\n\n await cleanOrderColumns({ attribute, db, inverseRelIds: relIdsToadd, transaction: trx });\n};\n\n/**\n * If a relation currently exists for this xToOne relations, this function removes it and update the inverse order if needed.\n */\nconst deletePreviousAnyToOneRelations = async ({\n id,\n attribute,\n relIdToadd,\n db,\n transaction: trx,\n}: {\n id: ID;\n attribute: Relation.Bidirectional;\n relIdToadd: ID;\n db: Database;\n transaction?: Knex.Transaction;\n}) => {\n const { joinTable } = attribute;\n const { joinColumn, inverseJoinColumn } = joinTable;\n const con = db.getConnection();\n\n if (!isAnyToOne(attribute)) {\n throw new Error('deletePreviousAnyToOneRelations can only be called for anyToOne relations');\n }\n // handling manyToOne\n if (isManyToAny(attribute)) {\n // if the database integrity was not broken relsToDelete is supposed to be of length 1\n const relsToDelete = await con\n .select(inverseJoinColumn.name)\n .from(joinTable.name)\n .where(joinColumn.name, id)\n .whereNotIn(\n inverseJoinColumn.name,\n getDocumentSiblingIdsQuery(inverseJoinColumn.referencedTable!, relIdToadd)\n )\n .where(joinTable.on || {})\n .transacting(trx);\n\n const relIdsToDelete = map(relsToDelete, inverseJoinColumn.name);\n\n await createQueryBuilder(joinTable.name, db)\n .delete()\n .where({\n [joinColumn.name]: id,\n [inverseJoinColumn.name]: { $in: relIdsToDelete },\n })\n .where(joinTable.on || {})\n .transacting(trx)\n .execute();\n\n await cleanOrderColumns({ attribute, db, inverseRelIds: relIdsToDelete, transaction: trx });\n\n // handling oneToOne\n } else {\n await con\n .delete()\n .from(joinTable.name)\n .where(joinColumn.name, id)\n // Exclude the ids of the current document\n .whereNotIn(\n inverseJoinColumn.name,\n getDocumentSiblingIdsQuery(inverseJoinColumn.referencedTable!, relIdToadd)\n )\n .where(joinTable.on || {})\n .transacting(trx);\n }\n};\n\n/**\n * Delete all or some relations of entity field\n */\nconst deleteRelations = async ({\n id,\n attribute,\n db,\n relIdsToNotDelete = [],\n relIdsToDelete = [],\n transaction: trx,\n}: {\n id: ID;\n attribute: Relation.Bidirectional;\n db: Database;\n relIdsToNotDelete?: ID[];\n relIdsToDelete?: ID[] | 'all';\n transaction?: Knex.Transaction;\n}) => {\n const { joinTable } = attribute;\n const { joinColumn, inverseJoinColumn } = joinTable;\n const all = relIdsToDelete === 'all';\n\n if (hasOrderColumn(attribute) || hasInverseOrderColumn(attribute)) {\n let lastId: ID = 0;\n let done = false;\n const batchSize = 100;\n\n while (!done) {\n const batchToDelete: { id: ID }[] = await createQueryBuilder(joinTable.name, db)\n .select(inverseJoinColumn.name)\n .where({\n [joinColumn.name]: id,\n id: { $gt: lastId },\n [inverseJoinColumn.name]: { $notIn: relIdsToNotDelete },\n ...(all ? {} : { [inverseJoinColumn.name]: { $in: relIdsToDelete } }),\n })\n .where(joinTable.on || {})\n .orderBy('id')\n .limit(batchSize)\n .transacting(trx)\n .execute();\n\n done = batchToDelete.length < batchSize;\n lastId = batchToDelete[batchToDelete.length - 1]?.id || 0;\n\n const batchIds = map(batchToDelete, inverseJoinColumn.name);\n\n await createQueryBuilder(joinTable.name, db)\n .delete()\n .where({\n [joinColumn.name]: id,\n [inverseJoinColumn.name]: { $in: batchIds },\n })\n .where(joinTable.on || {})\n .transacting(trx)\n .execute();\n\n await cleanOrderColumns({ attribute, db, id, inverseRelIds: batchIds, transaction: trx });\n }\n } else {\n await createQueryBuilder(joinTable.name, db)\n .delete()\n .where({\n [joinColumn.name]: id,\n [inverseJoinColumn.name]: { $notIn: relIdsToNotDelete },\n ...(all ? {} : { [inverseJoinColumn.name]: { $in: relIdsToDelete } }),\n })\n .where(joinTable.on || {})\n .transacting(trx)\n .execute();\n }\n};\n\n/**\n * Clean the order columns by ensuring the order value are continuous (ex: 1, 2, 3 and not 1, 5, 10)\n */\nconst cleanOrderColumns = async ({\n id,\n attribute,\n db,\n inverseRelIds = [],\n transaction: trx,\n}: {\n id?: ID;\n attribute: Relation.Bidirectional;\n db: Database;\n inverseRelIds?: ID[];\n transaction?: Knex.Transaction;\n}) => {\n if (\n !(hasOrderColumn(attribute) && id) &&\n !(hasInverseOrderColumn(attribute) && !isEmpty(inverseRelIds))\n ) {\n return;\n }\n\n const { joinTable } = attribute;\n const { joinColumn, inverseJoinColumn, orderColumnName, inverseOrderColumnName } = joinTable;\n\n /**\n UPDATE :joinTable: as a,\n (\n SELECT\n id,\n ROW_NUMBER() OVER ( PARTITION BY :joinColumn: ORDER BY :orderColumn:) AS src_order,\n FROM :joinTable:\n WHERE :joinColumn: = :id\n ) AS b\n SET :orderColumn: = b.src_order\n WHERE b.id = a.id;\n */\n const updateOrderColumn = async () => {\n if (!hasOrderColumn(attribute) || !id) {\n return;\n }\n\n const selectRowsToOrder = (joinTableName: string) =>\n db\n .connection(joinTableName)\n .select('id')\n .rowNumber('src_order', orderColumnName, joinColumn.name)\n .where(joinColumn.name, id)\n .toSQL();\n\n switch (strapi.db.dialect.client) {\n case 'mysql': {\n // Here it's MariaDB and MySQL 8\n const select = selectRowsToOrder(joinTable.name);\n\n await db\n .getConnection()\n .raw(\n `UPDATE ?? as a, ( ${select.sql} ) AS b\n SET ?? = b.src_order\n WHERE b.id = a.id`,\n [joinTable.name, ...select.bindings, orderColumnName]\n )\n .transacting(trx);\n\n break;\n }\n default: {\n const joinTableName = addSchema(db, joinTable.name);\n const select = selectRowsToOrder(joinTableName);\n\n // raw query as knex doesn't allow updating from a subquery\n await db.connection\n .raw(\n `UPDATE ?? as a\n SET ?? = b.src_order\n FROM ( ${select.sql} ) AS b\n WHERE b.id = a.id`,\n [joinTableName, orderColumnName, ...select.bindings]\n )\n .transacting(trx);\n }\n }\n };\n\n /**\n UPDATE :joinTable: as a,\n (\n SELECT\n id,\n ROW_NUMBER() OVER ( PARTITION BY :inverseJoinColumn: ORDER BY :inverseOrderColumn:) AS inv_order\n FROM :joinTable:\n WHERE :inverseJoinColumn: IN (:inverseRelIds)\n ) AS b\n SET :inverseOrderColumn: = b.inv_order\n WHERE b.id = a.id;\n */\n const updateInverseOrderColumn = async () => {\n if (!hasInverseOrderColumn(attribute) || isEmpty(inverseRelIds)) return;\n\n const selectRowsToOrder = (joinTableName: string) =>\n db\n .connection(joinTableName)\n .select('id')\n .rowNumber('inv_order', inverseOrderColumnName, inverseJoinColumn.name)\n .whereIn(inverseJoinColumn.name, inverseRelIds)\n .toSQL();\n\n switch (strapi.db.dialect.client) {\n case 'mysql': {\n // Here it's MariaDB and MySQL 8\n const select = selectRowsToOrder(joinTable.name);\n\n await db\n .getConnection()\n .raw(\n `UPDATE ?? as a, ( ${select.sql} ) AS b\n SET ?? = b.inv_order\n WHERE b.id = a.id`,\n [joinTable.name, ...select.bindings, inverseOrderColumnName]\n )\n .transacting(trx);\n break;\n }\n default: {\n const joinTableName = addSchema(db, joinTable.name);\n const select = selectRowsToOrder(joinTableName);\n\n // raw query as knex doesn't allow updating from a subquery\n await db.connection\n .raw(\n `UPDATE ?? as a\n SET ?? = b.inv_order\n FROM ( ${select.sql} ) AS b\n WHERE b.id = a.id`,\n [joinTableName, inverseOrderColumnName, ...select.bindings]\n )\n .transacting(trx);\n }\n }\n };\n\n // Run updates in a deterministic order to avoid lock cycles on the same join table.\n await updateOrderColumn();\n await updateInverseOrderColumn();\n};\n\nexport {\n deletePreviousOneToAnyRelations,\n deletePreviousAnyToOneRelations,\n deleteRelations,\n cleanOrderColumns,\n};\n"],"names":["getDocumentSiblingIdsQuery","tableName","id","models","Array","from","strapi","db","metadata","values","isContentType","find","model","attributes","documentId","findDocumentSiblingIds","query","select","whereIn","documentIDSubQuery","where","deletePreviousOneToAnyRelations","attribute","relIdsToadd","transaction","trx","isBidirectional","isOneToAny","Error","joinTable","joinColumn","inverseJoinColumn","con","getConnection","delete","name","whereNotIn","referencedTable","on","transacting","cleanOrderColumns","inverseRelIds","deletePreviousAnyToOneRelations","relIdToadd","isAnyToOne","isManyToAny","relsToDelete","relIdsToDelete","map","createQueryBuilder","$in","execute","deleteRelations","relIdsToNotDelete","all","hasOrderColumn","hasInverseOrderColumn","lastId","done","batchSize","batchToDelete","$gt","$notIn","orderBy","limit","length","batchIds","isEmpty","orderColumnName","inverseOrderColumnName","updateOrderColumn","selectRowsToOrder","joinTableName","connection","rowNumber","toSQL","dialect","client","raw","sql","bindings","addSchema","updateInverseOrderColumn"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -18,9 +18,18 @@ export type { Event } from './lifecycles';
|
|
|
18
18
|
export type { Attribute, Model, JoinTable } from './types';
|
|
19
19
|
export type { AttributeRenameHandler, AttributeRenames } from './schema';
|
|
20
20
|
export type { Identifiers } from './utils/identifiers';
|
|
21
|
+
export { POOL_TIMEOUT_CODE } from './pool-diagnostics';
|
|
22
|
+
export type { EventLoopDelay, PoolDiagnostics, PoolState, PoolTimeoutDetails, } from './pool-diagnostics';
|
|
21
23
|
interface Settings {
|
|
22
24
|
forceMigration?: boolean;
|
|
23
25
|
runMigrations?: boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Describe the pool on knex connection pool timeouts (details on the error, a docs link, one
|
|
28
|
+
* warning block per 30 s). Defaults to true; false leaves knex's error untouched. Must be a
|
|
29
|
+
* boolean (for example `env.bool('DATABASE_POOL_TIMEOUT_DIAGNOSTICS', true)`): a string is not
|
|
30
|
+
* read as false.
|
|
31
|
+
*/
|
|
32
|
+
poolTimeoutDiagnostics?: boolean;
|
|
24
33
|
migrations: {
|
|
25
34
|
dir: string;
|
|
26
35
|
};
|
|
@@ -31,6 +40,8 @@ export interface DatabaseConfig {
|
|
|
31
40
|
connection: Knex.Config;
|
|
32
41
|
settings: Settings;
|
|
33
42
|
logger?: Logger;
|
|
43
|
+
/** Lifecycle phase of the host application, e.g. "boot" or "runtime", for pool timeout reports. */
|
|
44
|
+
getPhase?: () => string | undefined;
|
|
34
45
|
}
|
|
35
46
|
declare class Database {
|
|
36
47
|
connection: Knex;
|
|
@@ -43,12 +54,26 @@ declare class Database {
|
|
|
43
54
|
entityManager: EntityManager;
|
|
44
55
|
repair: RepairManager;
|
|
45
56
|
logger: Logger;
|
|
57
|
+
/** Set unless `settings.poolTimeoutDiagnostics` is false or the install failed. */
|
|
58
|
+
private poolDiagnostics?;
|
|
59
|
+
private phase?;
|
|
46
60
|
constructor(config: DatabaseConfig);
|
|
47
61
|
init({ models }: {
|
|
48
62
|
models: Model[];
|
|
49
63
|
}): Promise<this>;
|
|
50
64
|
query(uid: string): import("./entity-manager").Repository;
|
|
51
65
|
inTransaction(): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Labels pool timeout reports raised while `fn` runs, for example "schema sync". Nested calls
|
|
68
|
+
* restore the outer label. Calls that overlap without nesting can restore the wrong label; core
|
|
69
|
+
* only nests them (schema sync, then a migration).
|
|
70
|
+
*
|
|
71
|
+
* The label is process-wide, not per call: a call made at runtime relabels every concurrent
|
|
72
|
+
* timeout report until it returns. It is meant for boot-time work (schema sync, migrations).
|
|
73
|
+
*
|
|
74
|
+
* @internal
|
|
75
|
+
*/
|
|
76
|
+
runInPhase<T>(phase: string, fn: () => Promise<T>): Promise<T>;
|
|
52
77
|
/**
|
|
53
78
|
* Run work inside a DB transaction. On a fulfilled callback, the transaction
|
|
54
79
|
* is committed; on rejection, it is rolled back. The callback receives Knex
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAIjC,OAAO,EAAE,OAAO,EAAc,MAAM,YAAY,CAAC;AACjD,OAAO,EAAwB,cAAc,EAAE,MAAM,UAAU,CAAC;AAChE,OAAO,EAAkB,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAuB,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAA4B,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EAA4B,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAE3E,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAkB,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAEpF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|