strapi/packages/core/database/lib/connection.js

72 lines
1.6 KiB
JavaScript
Raw Normal View History

2022-03-23 10:37:12 +01:00
/* eslint-disable node/no-missing-require */
/* eslint-disable node/no-extraneous-require */
'use strict';
const knex = require('knex');
const SqliteClient = require('knex/lib/dialects/sqlite3/index');
const tryBetterSqlite3Client = config => {
try {
require.resolve('better-sqlite3');
config.client = 'better-sqlite3';
return true;
} catch (error) {
if (error.code === 'MODULE_NOT_FOUND') {
return false;
}
throw error;
}
};
const tryVscodeSqlite3Client = () => {
try {
require.resolve('@vscode/sqlite3');
return true;
} catch (error) {
if (error.code === 'MODULE_NOT_FOUND') {
return false;
}
throw error;
}
};
const tryLegacySqlite3Client = config => {
try {
require.resolve('sqlite3');
config.client = class MySqliteClient extends SqliteClient {
_driver() {
return require('sqlite3');
}
};
return true;
} catch (error) {
if (error.code === 'MODULE_NOT_FOUND') {
return false;
}
throw error;
}
};
const createConnection = config => {
const knexConfig = { ...config };
if (knexConfig.client === 'sqlite') {
// NOTE: this tries to find the best sqlite module possible to use
// while keeping retro compatibiity
tryBetterSqlite3Client(knexConfig) ||
tryVscodeSqlite3Client(knexConfig) ||
tryLegacySqlite3Client(knexConfig);
}
const knexInstance = knex(knexConfig);
return Object.assign(knexInstance, {
getSchemaName() {
return this.client.connectionSettings.schema;
},
});
};
module.exports = createConnection;