2018-04-02 21:25:20 -04:00
const log = require ( './log' ) ;
const fs = require ( 'fs' ) ;
const resourceDir = require ( './resource_dir' ) ;
const sql = require ( './sql' ) ;
2019-04-23 21:27:45 +02:00
const utils = require ( './utils' ) ;
2018-07-24 20:35:03 +02:00
const optionService = require ( './options' ) ;
2020-04-08 20:38:50 +02:00
const port = require ( './port' ) ;
2018-07-24 20:35:03 +02:00
const Option = require ( '../entities/option' ) ;
2019-10-17 21:11:35 +02:00
const TaskContext = require ( './task_context.js' ) ;
2020-07-02 22:57:17 +02:00
const migrationService = require ( './migration' ) ;
2020-07-23 22:31:06 +02:00
const cls = require ( './cls' ) ;
2018-04-02 21:25:20 -04:00
2020-06-20 21:42:41 +02:00
const dbReady = utils . deferred ( ) ;
2020-04-04 21:49:57 +02:00
2020-07-23 22:31:06 +02:00
cls . init ( initDbConnection ) ;
2018-04-02 21:25:20 -04:00
2020-06-20 12:31:38 +02:00
function schemaExists ( ) {
2020-06-20 21:42:41 +02:00
return ! ! sql . getValue ( ` SELECT name FROM sqlite_master
WHERE type = 'table' AND name = 'options' ` );
2018-07-22 19:56:20 +02:00
}
2018-07-21 08:55:24 +02:00
2020-06-20 12:31:38 +02:00
function isDbInitialized ( ) {
if ( ! schemaExists ( ) ) {
2018-07-24 08:12:36 +02:00
return false ;
}
2020-06-20 12:31:38 +02:00
const initialized = sql . getValue ( "SELECT value FROM options WHERE name = 'initialized'" ) ;
2018-07-24 08:12:36 +02:00
2020-06-20 21:42:41 +02:00
return initialized === 'true' ;
2018-07-24 08:12:36 +02:00
}
2020-07-02 22:57:17 +02:00
async function initDbConnection ( ) {
2020-06-20 21:42:41 +02:00
if ( ! isDbInitialized ( ) ) {
log . info ( ` DB not initialized, please visit setup page ` + ( utils . isElectron ( ) ? '' : ` - http://[your-server-host]: ${ port } to see instructions on how to initialize Trilium. ` ) ) ;
2018-04-02 21:25:20 -04:00
2020-06-20 21:42:41 +02:00
return ;
}
2018-04-03 22:15:28 -04:00
2020-07-02 22:57:17 +02:00
await migrationService . migrateIfNecessary ( ) ;
2018-04-03 22:15:28 -04:00
2020-06-20 21:42:41 +02:00
require ( './options_init' ) . initStartupOptions ( ) ;
dbReady . resolve ( ) ;
2018-07-22 19:56:20 +02:00
}
2018-04-02 21:25:20 -04:00
2020-07-02 21:08:18 +02:00
async function createInitialDatabase ( username , password , theme ) {
2018-07-23 21:15:32 +02:00
log . info ( "Creating initial database ..." ) ;
2018-04-02 22:33:54 -04:00
2020-06-20 12:31:38 +02:00
if ( isDbInitialized ( ) ) {
2018-07-24 08:12:36 +02:00
throw new Error ( "DB is already initialized" ) ;
}
2018-04-02 22:33:54 -04:00
const schema = fs . readFileSync ( resourceDir . DB _INIT _DIR + '/schema.sql' , 'UTF-8' ) ;
2020-03-26 17:05:17 +01:00
const demoFile = fs . readFileSync ( resourceDir . DB _INIT _DIR + '/demo.zip' ) ;
2018-04-02 22:33:54 -04:00
2020-07-02 21:08:18 +02:00
let rootNote ;
2020-06-20 12:31:38 +02:00
sql . transactional ( ( ) => {
sql . executeScript ( schema ) ;
2018-11-16 14:36:50 +01:00
const Note = require ( "../entities/note" ) ;
const Branch = require ( "../entities/branch" ) ;
2020-07-02 21:08:18 +02:00
rootNote = new Note ( {
2018-11-16 14:36:50 +01:00
noteId : 'root' ,
title : 'root' ,
type : 'text' ,
mime : 'text/html'
} ) . save ( ) ;
2020-06-20 12:31:38 +02:00
rootNote . setContent ( '' ) ;
2019-02-20 23:07:57 +01:00
2020-06-20 12:31:38 +02:00
new Branch ( {
2018-11-16 14:36:50 +01:00
branchId : 'root' ,
noteId : 'root' ,
parentNoteId : 'none' ,
isExpanded : true ,
2019-10-19 12:36:16 +02:00
notePosition : 10
2018-11-16 14:36:50 +01:00
} ) . save ( ) ;
2020-07-02 21:08:18 +02:00
} ) ;
const dummyTaskContext = new TaskContext ( "initial-demo-import" , 'import' , false ) ;
2018-11-16 14:36:50 +01:00
2020-07-02 21:08:18 +02:00
const zipImportService = require ( "./import/zip" ) ;
await zipImportService . importZip ( dummyTaskContext , demoFile , rootNote ) ;
2019-02-24 12:24:28 +01:00
2020-07-02 21:08:18 +02:00
sql . transactional ( ( ) => {
2020-06-20 12:31:38 +02:00
const startNoteId = sql . getValue ( "SELECT noteId FROM branches WHERE parentNoteId = 'root' AND isDeleted = 0 ORDER BY notePosition" ) ;
2018-04-02 22:33:54 -04:00
2018-07-23 21:15:32 +02:00
const optionsInitService = require ( './options_init' ) ;
2020-06-20 12:31:38 +02:00
optionsInitService . initDocumentOptions ( ) ;
optionsInitService . initSyncedOptions ( username , password ) ;
optionsInitService . initNotSyncedOptions ( true , startNoteId , { theme } ) ;
2018-04-02 22:33:54 -04:00
} ) ;
2018-07-23 21:15:32 +02:00
log . info ( "Schema and initial content generated." ) ;
2018-04-02 22:33:54 -04:00
2020-06-20 12:31:38 +02:00
initDbConnection ( ) ;
2018-04-02 21:25:20 -04:00
}
2020-06-20 12:31:38 +02:00
function createDatabaseForSync ( options , syncServerHost = '' , syncProxy = '' ) {
2018-07-24 20:35:03 +02:00
log . info ( "Creating database for sync" ) ;
2020-06-20 12:31:38 +02:00
if ( isDbInitialized ( ) ) {
2018-07-24 20:35:03 +02:00
throw new Error ( "DB is already initialized" ) ;
}
2018-07-23 21:15:32 +02:00
const schema = fs . readFileSync ( resourceDir . DB _INIT _DIR + '/schema.sql' , 'UTF-8' ) ;
2020-06-20 12:31:38 +02:00
sql . transactional ( ( ) => {
sql . executeScript ( schema ) ;
2018-07-23 21:15:32 +02:00
2020-06-20 12:31:38 +02:00
require ( './options_init' ) . initNotSyncedOptions ( false , 'root' , { syncServerHost , syncProxy } ) ;
2018-07-24 20:35:03 +02:00
// document options required for sync to kick off
for ( const opt of options ) {
2020-06-20 12:31:38 +02:00
new Option ( opt ) . save ( ) ;
2018-07-24 20:35:03 +02:00
}
2018-07-23 21:15:32 +02:00
} ) ;
log . info ( "Schema and not synced options generated." ) ;
}
2020-06-20 21:42:41 +02:00
function setDbAsInitialized ( ) {
2020-06-20 12:31:38 +02:00
if ( ! isDbInitialized ( ) ) {
optionService . setOption ( 'initialized' , 'true' ) ;
2018-07-24 20:35:03 +02:00
2020-06-20 12:31:38 +02:00
initDbConnection ( ) ;
2019-11-30 11:36:36 +01:00
}
2018-07-24 20:35:03 +02:00
}
2020-07-02 22:57:17 +02:00
dbReady . then ( ( ) => {
setInterval ( ( ) => require ( './backup' ) . regularBackup ( ) , 4 * 60 * 60 * 1000 ) ;
// kickoff first backup soon after start up
setTimeout ( ( ) => require ( './backup' ) . regularBackup ( ) , 5 * 60 * 1000 ) ;
} ) ;
2020-06-20 12:31:38 +02:00
log . info ( "DB size: " + sql . getValue ( "SELECT page_count * page_size / 1000 as size FROM pragma_page_count(), pragma_page_size()" ) + " KB" ) ;
2019-01-15 20:00:24 +01:00
2018-04-02 21:25:20 -04:00
module . exports = {
dbReady ,
2018-07-24 08:12:36 +02:00
schemaExists ,
2018-07-22 19:56:20 +02:00
isDbInitialized ,
initDbConnection ,
2018-07-23 21:15:32 +02:00
createInitialDatabase ,
2018-07-24 20:35:03 +02:00
createDatabaseForSync ,
2020-06-20 21:42:41 +02:00
setDbAsInitialized
2020-06-17 23:03:46 +02:00
} ;