diff --git a/.gitignore b/.gitignore index 49cce80515..40eccd6ae0 100644 --- a/.gitignore +++ b/.gitignore @@ -89,3 +89,7 @@ mongod shared.json /scripts/Cypress/screenshots /scripts/exp/ + +# NC_DBs +#========= +nc_minimal_dbs/ diff --git a/packages/nocodb/src/lib/Noco.ts b/packages/nocodb/src/lib/Noco.ts index 7e5bc855a3..728a9a7f18 100644 --- a/packages/nocodb/src/lib/Noco.ts +++ b/packages/nocodb/src/lib/Noco.ts @@ -103,6 +103,10 @@ export default class Noco { // todo: move process.env.NC_VERSION = '0090000'; + if (process.env.NC_MINIMAL_DBS) { + process.env.NC_CONNECT_TO_EXTERNAL_DB_DISABLED = 'true'; + } + this.router = express.Router(); this.projectRouter = express.Router(); diff --git a/packages/nocodb/src/lib/meta/api/projectApis.ts b/packages/nocodb/src/lib/meta/api/projectApis.ts index 75ca810f80..e28ac386a4 100644 --- a/packages/nocodb/src/lib/meta/api/projectApis.ts +++ b/packages/nocodb/src/lib/meta/api/projectApis.ts @@ -24,6 +24,7 @@ import mapDefaultPrimaryValue from '../helpers/mapDefaultPrimaryValue'; import { extractAndGenerateManyToManyRelations } from './metaDiffApis'; import { metaApiMetrics } from '../helpers/apiMetrics'; import { extractPropsAndSanitize } from '../helpers/extractProps'; +import NcConfigFactory from '../../utils/NcConfigFactory'; const nanoid = customAlphabet('1234567890abcdefghijklmnopqrstuvwxyz_', 4); @@ -107,16 +108,46 @@ async function projectCreate(req: Request, res) { const ranId = nanoid(); projectBody.prefix = `nc_${ranId}__`; projectBody.is_meta = true; - const db = Noco.getConfig().meta?.db; - projectBody.bases = [ - { - type: db?.client, - config: null, - is_meta: true, - inflection_column: 'camelize', - inflection_table: 'camelize', - }, - ]; + if (process.env.NC_MINIMAL_DBS) { + const fs = require('fs'); + const toolDir = NcConfigFactory.getToolDir(); + const nanoidv2 = customAlphabet('1234567890abcdefghijklmnopqrstuvwxyz', 14); + if (!fs.existsSync(`${toolDir}/nc_minimal_dbs`)) { + fs.mkdirSync(`${toolDir}/nc_minimal_dbs`); + } + const dbId = nanoidv2(); + const projectTitle = DOMPurify.sanitize(projectBody.title); + projectBody.prefix = ''; + projectBody.bases = [ + { + type: "sqlite3", + config: { + client: "sqlite3", + connection: { + client: "sqlite3", + database: projectTitle, + connection: { + filename: `${toolDir}/nc_minimal_dbs/${projectTitle}_${dbId}.sql`, + }, + useNullAsDefault: true, + }, + }, + inflection_column: "camelize", + inflection_table: "camelize", + }, + ]; + } else { + const db = Noco.getConfig().meta?.db; + projectBody.bases = [ + { + type: db?.client, + config: null, + is_meta: true, + inflection_column: 'camelize', + inflection_table: 'camelize', + }, + ]; + } } else { if (process.env.NC_CONNECT_TO_EXTERNAL_DB_DISABLED) { NcError.badRequest('Connecting to external db is disabled');