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)
}
})
})
}