2018-09-28 05:37:08 +00:00
module . exports = function ( s , config ) {
2018-12-17 00:54:06 +00:00
s . onBeforeDatabaseLoadExtensions . forEach ( function ( extender ) {
extender ( config )
} )
2018-09-28 05:37:08 +00:00
//sql/database connection with knex
2018-10-23 18:36:02 +00:00
s . databaseOptions = {
2018-09-28 05:37:08 +00:00
client : config . databaseType ,
connection : config . db ,
}
2018-10-23 18:36:02 +00:00
if ( s . databaseOptions . client . indexOf ( 'sqlite' ) > - 1 ) {
s . databaseOptions . client = 'sqlite3' ;
s . databaseOptions . useNullAsDefault = true ;
2018-12-29 19:32:12 +00:00
try {
require ( 'sqlite3' )
} catch ( err ) {
console . log ( 'Installing SQlite3 Module...' )
require ( 'child_process' ) . execSync ( 'npm install sqlite3 --unsafe-perm' )
}
2018-09-28 05:37:08 +00:00
}
2018-10-23 18:36:02 +00:00
if ( s . databaseOptions . client === 'sqlite3' && s . databaseOptions . connection . filename === undefined ) {
s . databaseOptions . connection . filename = s . mainDirectory + "/shinobi.sqlite"
2018-09-28 05:37:08 +00:00
}
s . mergeQueryValues = function ( query , values ) {
if ( ! values ) { values = [ ] }
var valuesNotFunction = true ;
if ( typeof values === 'function' ) {
var values = [ ] ;
valuesNotFunction = false ;
}
if ( values && valuesNotFunction ) {
var splitQuery = query . split ( '?' )
var newQuery = ''
splitQuery . forEach ( function ( v , n ) {
newQuery += v
var value = values [ n ]
if ( value ) {
if ( isNaN ( value ) || value instanceof Date ) {
newQuery += "'" + value + "'"
} else {
newQuery += value
}
}
} )
} else {
newQuery = query
}
return newQuery
}
2019-03-21 21:30:50 +00:00
s . getUnixDate = function ( value ) {
newValue = new Date ( value ) . valueOf ( )
return newValue
}
2018-09-28 05:37:08 +00:00
s . stringToSqlTime = function ( value ) {
2019-03-23 16:00:50 +00:00
newValue = new Date ( value . replace ( 'T' , ' ' ) )
2018-09-28 05:37:08 +00:00
return newValue
}
2018-09-28 16:18:49 +00:00
s . sqlQuery = function ( query , values , onMoveOn , hideLog ) {
2018-09-28 05:37:08 +00:00
if ( ! values ) { values = [ ] }
if ( typeof values === 'function' ) {
var onMoveOn = values ;
var values = [ ] ;
}
if ( ! onMoveOn ) { onMoveOn = function ( ) { } }
2019-03-21 21:30:50 +00:00
// if(s.databaseOptions.client === 'pg'){
// query = query
// .replace(/ NOT LIKE /g," NOT ILIKE ")
// .replace(/ LIKE /g," ILIKE ")
// }
2018-09-28 05:37:08 +00:00
var mergedQuery = s . mergeQueryValues ( query , values )
s . debugLog ( 's.sqlQuery QUERY' , mergedQuery )
2018-11-11 03:59:02 +00:00
if ( ! s . databaseEngine || ! s . databaseEngine . raw ) {
s . connectDatabase ( )
}
2018-09-28 05:37:08 +00:00
return s . databaseEngine
. raw ( query , values )
. asCallback ( function ( err , r ) {
2018-09-28 16:18:49 +00:00
if ( err && ! hideLog ) {
2018-09-28 05:37:08 +00:00
console . log ( 's.sqlQuery QUERY ERRORED' , query )
console . log ( 's.sqlQuery ERROR' , err )
}
if ( onMoveOn && typeof onMoveOn === 'function' ) {
2018-10-23 18:36:02 +00:00
switch ( s . databaseOptions . client ) {
2018-09-28 05:37:08 +00:00
case 'sqlite3' :
if ( ! r ) r = [ ]
break ;
default :
if ( r ) r = r [ 0 ]
break ;
}
onMoveOn ( err , r )
}
} )
}
2018-11-11 03:59:02 +00:00
s . connectDatabase = function ( ) {
s . databaseEngine = require ( 'knex' ) ( s . databaseOptions )
}
2018-09-29 23:03:55 +00:00
s . preQueries = function ( ) {
2018-12-17 00:54:06 +00:00
var knex = s . databaseEngine
var mySQLtail = ''
if ( config . databaseType === 'mysql' ) {
mySQLtail = ' ENGINE=InnoDB DEFAULT CHARSET=utf8'
}
//add Presets table and modernize
2018-12-17 01:24:59 +00:00
var createPresetsTableQuery = 'CREATE TABLE IF NOT EXISTS `Presets` ( `ke` varchar(50) DEFAULT NULL, `name` text, `details` text, `type` varchar(50) DEFAULT NULL)'
2018-12-17 00:54:06 +00:00
s . sqlQuery ( createPresetsTableQuery + mySQLtail + ';' , [ ] , function ( err ) {
if ( err ) console . error ( err )
if ( config . databaseType === 'sqlite3' ) {
var aQuery = "ALTER TABLE Presets RENAME TO _Presets_old;"
aQuery += createPresetsTableQuery
aQuery += "INSERT INTO Presets (`ke`, `name`, `details`, `type`) SELECT `ke`, `name`, `details`, `type` FROM _Presets_old;COMMIT;DROP TABLE _Presets_old;"
} else {
s . sqlQuery ( 'ALTER TABLE `Presets` CHANGE COLUMN `type` `type` VARCHAR(50) NULL DEFAULT NULL AFTER `details`;' , [ ] , function ( err ) {
if ( err ) console . error ( err )
} , true )
}
2018-09-29 23:03:55 +00:00
} , true )
2018-12-29 19:32:12 +00:00
//add Schedules table, will remove in future
s . sqlQuery ( "CREATE TABLE IF NOT EXISTS `Schedules` (`ke` varchar(50) DEFAULT NULL,`name` text,`details` text,`start` varchar(10) DEFAULT NULL,`end` varchar(10) DEFAULT NULL,`enabled` int(1) NOT NULL DEFAULT '1')" + mySQLtail + ';' , [ ] , function ( err ) {
if ( err ) console . error ( err )
} , true )
2019-03-21 21:30:50 +00:00
//add Schedules table, will remove in future
2019-03-23 16:00:50 +00:00
s . sqlQuery ( "CREATE TABLE IF NOT EXISTS `Timelapses` (`ke`varchar(50)NOT NULL,`mid`varchar(50)NOT NULL,`details`longtext,`date`date NOT NULL,`time`timestamp NOT NULL,`end`timestamp NOT NULL,`size`int(11)NOT NULL)" + mySQLtail + ';' , [ ] , function ( err ) {
2019-03-21 21:30:50 +00:00
if ( err ) console . error ( err )
} , true )
2018-12-17 00:54:06 +00:00
//add Cloud Videos table, will remove in future
s . sqlQuery ( 'CREATE TABLE IF NOT EXISTS `Cloud Videos` (`mid` varchar(50) NOT NULL,`ke` varchar(50) DEFAULT NULL,`href` text NOT NULL,`size` float DEFAULT NULL,`time` timestamp NULL DEFAULT NULL,`end` timestamp NULL DEFAULT NULL,`status` int(1) DEFAULT \'0\',`details` text)' + mySQLtail + ';' , [ ] , function ( err ) {
if ( err ) console . error ( err )
2018-11-11 03:59:02 +00:00
} , true )
2018-09-29 23:03:55 +00:00
//create Files table
2018-12-17 00:54:06 +00:00
var createFilesTableQuery = "CREATE TABLE IF NOT EXISTS `Files` (`ke` varchar(50) NOT NULL,`mid` varchar(50) NOT NULL,`name` tinytext NOT NULL,`size` float NOT NULL DEFAULT '0',`details` text NOT NULL,`status` int(1) NOT NULL DEFAULT '0',`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP)"
s . sqlQuery ( createFilesTableQuery + mySQLtail + ';' , [ ] , function ( err ) {
if ( err ) console . error ( err )
2018-09-29 23:03:55 +00:00
//add time column to Files table
2018-12-17 00:54:06 +00:00
if ( config . databaseType === 'sqlite3' ) {
var aQuery = "ALTER TABLE Files RENAME TO _Files_old;"
aQuery += createPresetsTableQuery
aQuery += "INSERT INTO Files (`ke`, `mid`, `name`, `details`, `size`, `status`, `time`) SELECT `ke`, `mid`, `name`, `details`, `size`, `status`, `time` FROM _Files_old;COMMIT;DROP TABLE _Files_old;"
} else {
s . sqlQuery ( 'ALTER TABLE `Files` ADD COLUMN `time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER `status`;' , [ ] , function ( err ) {
2018-12-17 01:24:59 +00:00
if ( err && err . sqlMessage . indexOf ( 'Duplicate' ) === - 1 ) console . error ( err )
2018-12-17 00:54:06 +00:00
} , true )
}
2018-09-29 23:03:55 +00:00
} , true )
delete ( s . preQueries )
}
2018-09-28 05:37:08 +00:00
}