Решение проблемы скачивания файлов в режиме "Удаленная библиотека"

(запрашивался не тот файл из-за несовпадения bookId)
This commit is contained in:
Book Pauk
2022-11-13 01:59:42 +07:00
parent 4d3661b758
commit 2db2b8cff4
8 changed files with 43 additions and 26 deletions

View File

@@ -65,6 +65,8 @@ class DbCreator {
let librateMap = new Map();//оценка
let librateArr = [];
let uidSet = new Set();//уникальные идентификаторы
//stats
let authorCount = 0;
let bookCount = 0;
@@ -221,13 +223,14 @@ class DbCreator {
let filtered = false;
for (const rec of chunk) {
//сначала фильтр
if (!filter(rec)) {
if (!filter(rec) || uidSet.has(rec._uid)) {
rec.id = 0;
filtered = true;
continue;
}
rec.id = ++id;
uidSet.add(rec._uid);
if (!rec.del) {
bookCount++;
@@ -269,6 +272,7 @@ class DbCreator {
delMap = null;
dateMap = null;
librateMap = null;
uidSet = null;
await db.close({table: 'book'});
await db.freeMemory();
@@ -624,6 +628,12 @@ class DbCreator {
stats.filesDelCount = res.filesDelCount;
}
//заодно добавим нужный индекс
await db.create({
in: 'book',
hash: {field: '_uid', type: 'string', depth: 100, unique: true},
});
countDone = true;
}
}

View File

@@ -1,4 +1,5 @@
const path = require('path');
const crypto = require('crypto');
const ZipReader = require('./ZipReader');
const collectionInfo = 'collection.info';
@@ -98,9 +99,13 @@ class InpxParser {
if (line[line.length - 1] == '\x0D')
line = line.substring(0, line.length - 1);
const rec = {};
//уникальный идентификатор записи
const sha256 = crypto.createHash('sha256');
rec._uid = sha256.update(line).digest('base64');
//парсим запись
const parts = line.split('\x04');
const rec = {};
const len = (parts.length > structLen ? structLen : parts.length);
for (let i = 0; i < len; i++) {

View File

@@ -58,9 +58,9 @@ class RemoteLib {
}
}
async downloadBook(bookId) {
async downloadBook(bookUid) {
try {
const response = await await this.wsRequest({action: 'get-book-link', bookId});
const response = await await this.wsRequest({action: 'get-book-link', bookUid});
const link = response.link;
const buf = await this.down.load(`${this.remoteHost}${link}`, {decompress: false});

View File

@@ -354,7 +354,7 @@ class WebWorker {
}
}
async restoreBook(bookId, bookPath, downFileName) {
async restoreBook(bookUid, bookPath, downFileName) {
const db = this.db;
let extractedFile = '';
@@ -364,7 +364,7 @@ class WebWorker {
extractedFile = await this.extractBook(bookPath);
hash = await utils.getFileHash(extractedFile, 'sha256', 'hex');
} else {
hash = await this.remoteLib.downloadBook(bookId);
hash = await this.remoteLib.downloadBook(bookUid);
}
const link = `${this.config.filesPathStatic}/${hash}`;
@@ -402,7 +402,7 @@ class WebWorker {
return link;
}
async getBookLink(bookId) {
async getBookLink(bookUid) {
this.checkMyState();
try {
@@ -410,11 +410,11 @@ class WebWorker {
let link = '';
//найдем bookPath и downFileName
let rows = await db.select({table: 'book', where: `@@id(${db.esc(bookId)})`});
let rows = await db.select({table: 'book', where: `@@hash('_uid', ${db.esc(bookUid)})`});
if (!rows.length)
throw new Error('404 Файл не найден');
const book = rows[0];
const book = rows[0];
let downFileName = book.file;
const author = book.author.split(',');
const at = [author[0], book.title];
@@ -443,7 +443,7 @@ class WebWorker {
}
if (!link) {
link = await this.restoreBook(bookId, bookPath, downFileName)
link = await this.restoreBook(bookUid, bookPath, downFileName)
}
if (!link)
@@ -458,13 +458,13 @@ class WebWorker {
}
}
async getBookInfo(bookId) {
async getBookInfo(bookUid) {
this.checkMyState();
try {
const db = this.db;
let bookInfo = await this.getBookLink(bookId);
let bookInfo = await this.getBookLink(bookUid);
const hash = path.basename(bookInfo.link);
const bookFile = `${this.config.filesDir}/${hash}`;
const bookFileInfo = `${bookFile}.i.json`;
@@ -472,7 +472,9 @@ class WebWorker {
const restoreBookInfo = async(info) => {
const result = {};
const rows = await db.select({table: 'book', where: `@@id(${db.esc(bookId)})`});
let rows = await db.select({table: 'book', where: `@@hash('_uid', ${db.esc(bookUid)})`});
if (!rows.length)
throw new Error('404 Файл не найден');
const book = rows[0];
result.book = book;