archive folder supports links

This commit is contained in:
Jan Prochazka
2021-10-14 19:51:46 +02:00
parent 8f54a6b03d
commit 2e196178ab
12 changed files with 74 additions and 22 deletions

View File

@@ -3,7 +3,7 @@ const stream = require('stream');
const readline = require('readline');
const path = require('path');
const { formatWithOptions } = require('util');
const { archivedir } = require('../utility/directories');
const { archivedir, clearArchiveLinksCache, resolveArchiveFolder } = require('../utility/directories');
const socket = require('../utility/socket');
const JsonLinesDatastore = require('../utility/JsonLinesDatastore');
const { saveFreeTableData } = require('../utility/freeTableStorage');
@@ -33,9 +33,18 @@ module.exports = {
return true;
},
createLink_meta: 'post',
async createLink({ linkedFolder }) {
const folder = await this.getNewArchiveFolder({ database: path.parse(linkedFolder).name + '.link' });
fs.writeFile(path.join(archivedir(), folder), linkedFolder);
clearArchiveLinksCache();
socket.emitChanged('archive-folders-changed');
return true;
},
files_meta: 'get',
async files({ folder }) {
const dir = path.join(archivedir(), folder);
const dir = resolveArchiveFolder(folder);
if (!(await fs.exists(dir))) return [];
const files = await fs.readdir(dir);
@@ -71,27 +80,31 @@ module.exports = {
deleteFile_meta: 'post',
async deleteFile({ folder, file }) {
await fs.unlink(path.join(archivedir(), folder, `${file}.jsonl`));
await fs.unlink(path.join(resolveArchiveFolder(folder), `${file}.jsonl`));
socket.emitChanged(`archive-files-changed-${folder}`);
},
deleteFolder_meta: 'post',
async deleteFolder({ folder }) {
if (!folder) throw new Error('Missing folder parameter');
await fs.rmdir(path.join(archivedir(), folder), { recursive: true });
if (folder.endsWith('.link')) {
await fs.unlink(path.join(archivedir(), folder));
} else {
await fs.rmdir(path.join(archivedir(), folder), { recursive: true });
}
socket.emitChanged(`archive-folders-changed`);
},
saveFreeTable_meta: 'post',
async saveFreeTable({ folder, file, data }) {
saveFreeTableData(path.join(archivedir(), folder, `${file}.jsonl`), data);
saveFreeTableData(path.join(resolveArchiveFolder(folder), `${file}.jsonl`), data);
return true;
},
loadFreeTable_meta: 'post',
async loadFreeTable({ folder, file }) {
return new Promise((resolve, reject) => {
const fileStream = fs.createReadStream(path.join(archivedir(), folder, `${file}.jsonl`));
const fileStream = fs.createReadStream(path.join(resolveArchiveFolder(folder), `${file}.jsonl`));
const liner = readline.createInterface({
input: fileStream,
});

View File

@@ -8,7 +8,7 @@ const { handleProcessCommunication } = require('../utility/processComm');
const config = require('./config');
const fs = require('fs-extra');
const exportDbModel = require('../utility/exportDbModel');
const { archivedir } = require('../utility/directories');
const { archivedir, resolveArchiveFolder } = require('../utility/directories');
const path = require('path');
const importDbModel = require('../utility/importDbModel');
const requireEngineDriver = require('../utility/requireEngineDriver');
@@ -262,7 +262,7 @@ module.exports = {
return generateDeploySql({
connection,
analysedStructure: await this.structure({ conid, database }),
modelFolder: path.join(archivedir(), archiveFolder),
modelFolder: resolveArchiveFolder(archiveFolder),
});
// const deployedModel = generateDbPairingId(await importDbModel(path.join(archivedir(), archiveFolder)));
// const currentModel = generateDbPairingId(await this.structure({ conid, database }));

View File

@@ -1,6 +1,6 @@
const fs = require('fs-extra');
const path = require('path');
const { filesdir, archivedir } = require('../utility/directories');
const { filesdir, archivedir, resolveArchiveFolder } = require('../utility/directories');
const hasPermission = require('../utility/hasPermission');
const socket = require('../utility/socket');
const scheduler = require('./scheduler');
@@ -59,7 +59,7 @@ module.exports = {
load_meta: 'post',
async load({ folder, file, format }) {
if (folder.startsWith('archive:')) {
const text = await fs.readFile(path.join(archivedir(), folder.substring('archive:'.length), file), {
const text = await fs.readFile(path.join(resolveArchiveFolder(folder.substring('archive:'.length)), file), {
encoding: 'utf-8',
});
return deserialize(format, text);
@@ -73,7 +73,7 @@ module.exports = {
save_meta: 'post',
async save({ folder, file, data, format }) {
if (folder.startsWith('archive:')) {
const dir = path.join(archivedir(), folder.substring('archive:'.length));
const dir = resolveArchiveFolder(folder.substring('archive:'.length));
await fs.writeFile(path.join(dir, file), serialize(format, data));
socket.emitChanged(`archive-files-changed-${folder.substring('archive:'.length)}`);
} else {

View File

@@ -1,9 +1,9 @@
const path = require('path');
const { archivedir } = require('../utility/directories');
const { archivedir, resolveArchiveFolder } = require('../utility/directories');
const jsonLinesReader = require('./jsonLinesReader');
function archiveReader({ folderName, fileName, ...other }) {
const jsonlFile = path.join(archivedir(), folderName, `${fileName}.jsonl`);
const jsonlFile = path.join(resolveArchiveFolder(folderName), `${fileName}.jsonl`);
const res = jsonLinesReader({ fileName: jsonlFile, ...other });
return res;
}

View File

@@ -1,11 +1,11 @@
const path = require('path');
const fs = require('fs');
const { archivedir } = require('../utility/directories');
const { archivedir, resolveArchiveFolder } = require('../utility/directories');
// const socket = require('../utility/socket');
const jsonLinesWriter = require('./jsonLinesWriter');
function archiveWriter({ folderName, fileName }) {
const dir = path.join(archivedir(), folderName);
const dir = resolveArchiveFolder(folderName);
if (!fs.existsSync(dir)) {
console.log(`Creating directory ${dir}`);
fs.mkdirSync(dir);

View File

@@ -71,6 +71,22 @@ function getPluginBackendPath(packageName) {
return path.join(pluginsdir(), packageName, 'dist', 'backend.js');
}
let archiveLinksCache = {};
function resolveArchiveFolder(folder) {
if (folder.endsWith('.link')) {
if (!archiveLinksCache[folder]) {
archiveLinksCache[folder] = fs.readFileSync(path.join(archivedir(), folder), 'utf-8');
}
return archiveLinksCache[folder];
}
return path.join(archivedir(), folder);
}
function clearArchiveLinksCache() {
archiveLinksCache = {};
}
module.exports = {
datadir,
jsldir,
@@ -83,4 +99,6 @@ module.exports = {
packagedPluginsDir,
packagedPluginList,
getPluginBackendPath,
resolveArchiveFolder,
clearArchiveLinksCache,
};

View File

@@ -1,10 +1,10 @@
const path = require('path');
const { jsldir, archivedir } = require('./directories');
const { jsldir, archivedir, resolveArchiveFolder } = require('./directories');
function getJslFileName(jslid) {
const archiveMatch = jslid.match(/^archive:\/\/([^/]+)\/(.*)$/);
if (archiveMatch) {
return path.join(archivedir(), archiveMatch[1], `${archiveMatch[2]}.jsonl`);
return path.join(resolveArchiveFolder(archiveMatch[1]), `${archiveMatch[2]}.jsonl`);
}
return path.join(jsldir(), `${jslid}.jsonl`);
}

View File

@@ -3,14 +3,12 @@ const path = require('path');
const yaml = require('js-yaml');
const { databaseInfoFromYamlModel, DatabaseAnalyser } = require('dbgate-tools');
const { startsWith } = require('lodash');
const { archivedir } = require('./directories');
const { archivedir, resolveArchiveFolder } = require('./directories');
async function importDbModel(inputDir) {
const files = [];
const dir = inputDir.startsWith('archive:')
? path.join(archivedir(), inputDir.substring('archive:'.length))
: inputDir;
const dir = inputDir.startsWith('archive:') ? resolveArchiveFolder(inputDir.substring('archive:'.length)) : inputDir;
for (const name of await fs.readdir(dir)) {
if (name.endsWith('.table.yaml') || name.endsWith('.sql')) {