const config = require('./config') const mysql = require( 'mysql') const forBigTable = require('./forBigTable') const { BrowserWindow } = require("electron"); const url = require('url') const path = require('path') const fs = require('fs') const currentVersion = 3 module.exports = (callback, mainWindow, sphinxApp) => { const sphinx = mysql.createConnection({ host : config.sphinx.host, port : config.sphinx.port }); const query = (sql) => new Promise((resolve, reject) => { sphinx.query(sql, (err, res) => { if(err) reject(err) else resolve(res) }) }) const insertValues = (table, values, callback) => new Promise((resolve) => { let names = ''; let data = ''; for(const val in values) { if(values[val] === null) continue; names += '`' + val + '`,'; data += sphinx.escape(values[val]) + ','; } names = names.slice(0, -1) data = data.slice(0, -1) let query = `INSERT INTO ${table}(${names}) VALUES(${data})`; sphinx.query(query, (...responce) => { if(callback) callback(...responce) resolve(...responce) }) }) const setVersion = async (version) => { await query(`delete from version where id = 1`) await query(`insert into version(id, version) values(1, ${version})`) if(sphinxApp) fs.writeFileSync(`${sphinxApp.directoryPath}/version.vrs`, version) } let patchWindow; const openPatchWindow = () => { if(patchWindow) return if(mainWindow) mainWindow.hide() patchWindow = new BrowserWindow({width: 800, height: 400, closable: false}) patchWindow.setMenu(null) patchWindow.loadURL("data:text/html;charset=utf-8," + encodeURI(` Database patching...
`)) } const patch = async (version) => { console.log('db version', version) switch(version) { case 1: { console.log('patch db to version 2') openPatchWindow() let i = 1 const torrents = (await query("SELECT COUNT(*) AS c FROM torrents"))[0].c const files = (await query("SELECT COUNT(*) AS c FROM files"))[0].c await forBigTable(sphinx, 'torrents', async (torrent) => { console.log('update index', torrent.id, torrent.name, '[', i, 'of', torrents, ']') if(patchWindow) patchWindow.webContents.send('reindex', {field: torrent.name, index: i++, all: torrents, torrent: true}) torrent.nameIndex = torrent.name await query(`DELETE FROM torrents WHERE id = ${torrent.id}`) await insertValues('torrents', torrent) }) i = 1 await forBigTable(sphinx, 'files', async (file) => { console.log('update index', file.id, file.path, '[', i, 'of', files, ']') if(patchWindow) patchWindow.webContents.send('reindex', {field: file.path, index: i++, all: files}) file.pathIndex = file.path await query(`DELETE FROM files WHERE id = ${file.id}`) await insertValues('files', file) }) await setVersion(2) } case 2: { openPatchWindow() console.log('optimizing torrents') if(patchWindow) patchWindow.webContents.send('optimize', {field: 'torrents'}) query(`OPTIMIZE INDEX torrents`) await sphinxApp.waitOptimized('torrents') console.log('optimizing files') if(patchWindow) patchWindow.webContents.send('optimize', {field: 'files'}) query(`OPTIMIZE INDEX files`) await sphinxApp.waitOptimized('files') await setVersion(3) } } console.log('db patch done') sphinx.destroy() if(patchWindow) { patchWindow.destroy() if(mainWindow) mainWindow.show() } callback() } sphinx.connect(async (mysqlError) => { if(mysqlError) { console.log('error on sphinx connecting on db patching', mysqlError) return } // init of db, we can set version to last if(sphinxApp && sphinxApp.isInitDb) { console.log('new db, set version to last version', currentVersion) await setVersion(currentVersion) } sphinx.query('select * from version', async (err, version) => { if(err) { console.log('error on version get on db patch') return } if(!version || !version[0] || !version[0].version) { if(sphinxApp && fs.existsSync(`${sphinxApp.directoryPath}/version.vrs`)) { const ver = parseInt(fs.readFileSync(`${sphinxApp.directoryPath}/version.vrs`)) if(ver > 0) { console.log('readed version from version.vrs', ver) patch(ver) } else { console.log('error: bad version in version.vrs') } } else { console.log('version not founded, set db version to 1') await setVersion(1) patch(1) } } else { patch(version[0].version) } }) }) }