/* * DB Constructor and also used for constructor for sub classes. * * function DB(connectionString: String) */ static EjsVar *dbConstructor(Ejs *ejs, EjsDb *db, int argc, EjsVar **argv) { sqlite3 *sdb; EjsDb **dbp; char *path; path = ejsGetString(argv[0]); /* * Create a memory context for use by sqlite. This is a virtual paged memory region. * TODO - this is not ideal for long running applications. */ db->arena = mprAllocArena(ejs, "sqlite", EJS_MAX_DB_MEM, 0, 0); if (db->arena == 0) { return 0; } /* * Create a destructor object so we can cleanup and close the database. Must create after the arena so it will be * invoked before the arena is freed. */ if ((dbp = mprAllocObject(ejs, 1, (MprDestructor) dbDestructor)) == 0) { ejsThrowMemoryError(ejs); return 0; } *dbp = db; db->tls = mprCreateThreadLocal(db->arena); if (db->tls == 0) { return 0; } ejsSetDbMemoryContext(db->tls, db->arena); sdb = 0; if (sqlite3_open(path, &sdb /* TODO remove , SQLITE_OPEN_READWRITE, 0 */) != SQLITE_OK) { ejsThrowIOError(ejs, "Can't open database %s", path); return 0; } db->sdb = sdb; sqlite3_busy_timeout(sdb, 15000); /* * Query or change the count-changes flag. Normally, when the count-changes flag is not set, INSERT, UPDATE and * DELETE statements return no data. When count-changes is set, each of these commands returns a single row of * data consisting of one integer value - the number of rows inserted, modified or deleted by the command. The * returned change count does not include any insertions, modifications or deletions performed by triggers. */ // sqlite3_exec(sdb, "PRAGMA count_changes = OFF", NULL, NULL, NULL); ejsSetProperty(ejs, (EjsVar*) db, ES_ejs_db_Database__connection, (EjsVar*) ejsCreateString(ejs, path)); ejsSetProperty(ejs, (EjsVar*) db, ES_ejs_db_Database__name, (EjsVar*) ejsCreateString(ejs, mprGetBaseName(path))); return 0; }
/* Load and initialize ESP module. Manually loaded when used inside esp.c. */ PUBLIC int espOpen(MprModule *module) { HttpStage *handler; if ((handler = httpCreateHandler("espHandler", module)) == 0) { return MPR_ERR_CANT_CREATE; } HTTP->espHandler = handler; handler->open = openEsp; handler->close = closeEsp; handler->start = startEsp; /* Using the standard 'incoming' callback that simply transfers input to the queue head Applications should read by defining a notifier for READABLE events and then calling httpGetPacket on the read queue. */ if ((esp = mprAllocObj(Esp, manageEsp)) == 0) { return MPR_ERR_MEMORY; } MPR->espService = esp; handler->stageData = esp; esp->mutex = mprCreateLock(); esp->local = mprCreateThreadLocal(); if (espInitParser() < 0) { return 0; } if ((esp->ediService = ediCreateService()) == 0) { return 0; } #if ME_COM_MDB mdbInit(); #endif #if ME_COM_SQLITE sdbInit(); #endif if (module) { mprSetModuleFinalizer(module, unloadEsp); } return 0; }