perftest/jscrund_dbspi.js (114 lines of code) (raw):

/* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ 'use strict'; var jones = require("database-jones"), DBTableHandler = require(jones.common.DBTableHandler).DBTableHandler, unified_debug = require("unified_debug"), udebug = unified_debug.getLogger('jscrund_dbspi.js'); function implementation() { }; implementation.prototype = { dbServiceProvider : null, dbConnPool : null, dbSession : null, inBatchMode : false, operations : null }; implementation.prototype.close = function(callback) { var impl = this; impl.dbSession.close(function() { impl.dbConnPool.close(callback); }); }; implementation.prototype.initialize = function(options, callback) { udebug.log("initialize"); var impl = this; var mappings = options.annotations; var nmappings = mappings.length; function getMapping(n) { function gotMapping(err, tableMetadata) { udebug.log("gotMapping", n); nmappings--; var dbt = new DBTableHandler(tableMetadata, mappings[n].prototype.jones.mapping, mappings[n]); udebug.log("Got DBTableHandler", dbt); mappings[n].dbt = dbt; if(nmappings == 0) { callback(null); /* All done */ } } impl.dbConnPool.getTableMetadata(options.properties.database, mappings[n].prototype.jones.mapping.table, impl.dbSession, gotMapping); } function onDbSession(err, dbSession) { var n; if(err) { callback(err, null); } else { impl.dbSession = dbSession; if(mappings.length) { for(n = 0 ; n < mappings.length ; n++) { getMapping(n); } } else { callback(null); } } } function onConnect(err, dbConnectionPool) { impl.dbConnPool = dbConnectionPool; if(err) { callback(err, null); } else { dbConnectionPool.getDBSession(1, onDbSession); } } impl.dbServiceProvider = jones.getDBServiceProvider(options.adapter); impl.dbServiceProvider.connect(options.properties, onConnect); }; implementation.prototype.execOneOperation = function(op, tx, callback, row) { if(this.inBatchMode) { this.operations.push(op); } else { tx.execute([op], function(err) { if(err) console.log("TX EXECUTE ERR:", err, row); }); } }; implementation.prototype.persist = function(parameters, callback) { udebug.log_detail('persist object:', parameters.object); var dbt = parameters.object.constructor.dbt; var tx = this.dbSession.getTransactionHandler(); var op = this.dbSession.buildInsertOperation(dbt, parameters.object, tx, callback); this.execOneOperation(op, tx, callback, parameters.object); }; implementation.prototype.find = function(parameters, callback) { udebug.log_detail('find key:', parameters.key); var dbt = parameters.object.constructor.dbt; var tx = this.dbSession.getTransactionHandler(); var index = dbt.getUniqueIndexHandler(parameters.key); var op = this.dbSession.buildReadOperation(index, parameters.key, tx, 0, callback); this.execOneOperation(op, tx, callback); }; implementation.prototype.remove = function(parameters, callback) { udebug.log_detail('remove key:', parameters.key); var dbt = parameters.object.constructor.dbt; var tx = this.dbSession.getTransactionHandler(); var index = dbt.getUniqueIndexHandler(parameters.key); var op = this.dbSession.buildDeleteOperation(index, parameters.key, tx, callback); this.execOneOperation(op, tx, callback); }; implementation.prototype.createBatch = function(callback) { udebug.log_detail('createBatch'); this.operations = []; this.inBatchMode = true; callback(null); }; implementation.prototype.executeBatch = function(callback) { udebug.log_detail('executeBatch'); this.inBatchMode = false; this.dbSession.getTransactionHandler().execute(this.operations, callback); }; implementation.prototype.begin = function(callback) { udebug.log_detail('begin'); this.dbSession.begin(); callback(null); }; implementation.prototype.commit = function(callback) { udebug.log_detail('commit'); this.dbSession.commit(callback); }; exports.implementation = implementation;