|  |  | @ -3,7 +3,6 @@ const { sleep, debug, isDev } = require("../src/util"); | 
			
		
	
		
			
				
					|  |  |  | const { R } = require("redbean-node"); | 
			
		
	
		
			
				
					|  |  |  | const { setSetting, setting } = require("./util-server"); | 
			
		
	
		
			
				
					|  |  |  | const knex = require("knex"); | 
			
		
	
		
			
				
					|  |  |  | const sqlite3 = require("@louislam/sqlite3"); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  | class Database { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  | @ -14,50 +13,23 @@ class Database { | 
			
		
	
		
			
				
					|  |  |  |     static sqliteInstance = null; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     static async connect() { | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         if (! this.sqliteInstance) { | 
			
		
	
		
			
				
					|  |  |  |             this.sqliteInstance = new sqlite3.Database(Database.path); | 
			
		
	
		
			
				
					|  |  |  |             this.sqliteInstance.run("PRAGMA journal_mode = WAL"); | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         const Dialect = require("knex/lib/dialects/sqlite3/index.js"); | 
			
		
	
		
			
				
					|  |  |  |         Dialect.prototype._driver = () => sqlite3; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         if (isDev) { | 
			
		
	
		
			
				
					|  |  |  |             Dialect.prototype.acquireConnectionOrg = Dialect.prototype.acquireConnection; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |             Dialect.prototype.acquireConnection = async function () { | 
			
		
	
		
			
				
					|  |  |  |                 let a = await this.acquireConnectionOrg(); | 
			
		
	
		
			
				
					|  |  |  |                 debug("acquired Connection"); | 
			
		
	
		
			
				
					|  |  |  |                 return a; | 
			
		
	
		
			
				
					|  |  |  |             }; | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         // Always return same connection.
 | 
			
		
	
		
			
				
					|  |  |  |         Dialect.prototype.acquireRawConnection = async function () { | 
			
		
	
		
			
				
					|  |  |  |             return Database.sqliteInstance; | 
			
		
	
		
			
				
					|  |  |  |         }; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         Dialect.prototype.destroyRawConnection = async () => { } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         const acquireConnectionTimeout = 120 * 1000; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         const knexInstance = knex({ | 
			
		
	
		
			
				
					|  |  |  |             client: Dialect, | 
			
		
	
		
			
				
					|  |  |  |             connection: { },        // Do not remove, Leave it empty is ok
 | 
			
		
	
		
			
				
					|  |  |  |         R.useBetterSQLite3 = true; | 
			
		
	
		
			
				
					|  |  |  |         R.betterSQLite3Options.timeout = acquireConnectionTimeout; | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         R.setup("sqlite", { | 
			
		
	
		
			
				
					|  |  |  |             filename: Database.path, | 
			
		
	
		
			
				
					|  |  |  |             useNullAsDefault: true, | 
			
		
	
		
			
				
					|  |  |  |             acquireConnectionTimeout: acquireConnectionTimeout, | 
			
		
	
		
			
				
					|  |  |  |             pool: { | 
			
		
	
		
			
				
					|  |  |  |                 min: 1, | 
			
		
	
		
			
				
					|  |  |  |                 max: 1, | 
			
		
	
		
			
				
					|  |  |  |                 idleTimeoutMillis: 120 * 1000, | 
			
		
	
		
			
				
					|  |  |  |                 propagateCreateError: false, | 
			
		
	
		
			
				
					|  |  |  |                 acquireTimeoutMillis: acquireConnectionTimeout, | 
			
		
	
		
			
				
					|  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |         }, { | 
			
		
	
		
			
				
					|  |  |  |             min: 1, | 
			
		
	
		
			
				
					|  |  |  |             max: 1, | 
			
		
	
		
			
				
					|  |  |  |             idleTimeoutMillis: 120 * 1000, | 
			
		
	
		
			
				
					|  |  |  |             propagateCreateError: false, | 
			
		
	
		
			
				
					|  |  |  |             acquireTimeoutMillis: acquireConnectionTimeout, | 
			
		
	
		
			
				
					|  |  |  |         }); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         R.setup(knexInstance); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         if (process.env.SQL_LOG === "1") { | 
			
		
	
		
			
				
					|  |  |  |             R.debug(true); | 
			
		
	
		
			
				
					|  |  |  |         } | 
			
		
	
	
		
			
				
					|  |  | @ -65,6 +37,10 @@ class Database { | 
			
		
	
		
			
				
					|  |  |  |         // Auto map the model to a bean object
 | 
			
		
	
		
			
				
					|  |  |  |         R.freeze(true) | 
			
		
	
		
			
				
					|  |  |  |         await R.autoloadModels("./server/model"); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |         // Change to WAL
 | 
			
		
	
		
			
				
					|  |  |  |         await R.exec("PRAGMA journal_mode = WAL"); | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |     static async patch() { | 
			
		
	
	
		
			
				
					|  |  | 
 |