182 lines
5.7 KiB
JavaScript
182 lines
5.7 KiB
JavaScript
/*
|
|
Copyright (c) 2012, 2014, 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 path = require("path"),
|
|
conf = require("../adapter_config");
|
|
|
|
/** Include Path Helpers */
|
|
exports.fs = conf;
|
|
|
|
exports.common = {
|
|
"BitMask" : path.join(conf.spi_dir, "common", "BitMask"),
|
|
"DBTableHandler" : path.join(conf.spi_dir, "common", "DBTableHandler"),
|
|
"IndexBounds" : path.join(conf.spi_dir, "common", "IndexBounds"),
|
|
"QueuedAsyncCall" : path.join(conf.spi_dir, "common", "QueuedAsyncCall")
|
|
};
|
|
|
|
exports.api = {
|
|
"TableMapping" : path.join(conf.api_dir, "TableMapping"),
|
|
"unified_debug" : path.join(conf.api_dir, "unified_debug"),
|
|
"stats" : path.join(conf.api_dir, "stats"),
|
|
"UserContext" : path.join(conf.api_dir, "UserContext")
|
|
};
|
|
|
|
exports.spi = conf.spi_module;
|
|
|
|
/* Make it global */
|
|
global.mynode = exports;
|
|
|
|
|
|
var spi = require(conf.spi_module),
|
|
TableMapping = require("./TableMapping").TableMapping,
|
|
Projection = require("./Projection").Projection,
|
|
unified_debug = require("./unified_debug"),
|
|
udebug = unified_debug.getLogger("mynode.js"),
|
|
meta = require("./Meta.js"),
|
|
userContext = require("./UserContext.js");
|
|
|
|
var converters = {};
|
|
converters.JSONConverter = require(path.join(conf.converters_dir, "JSONConverter.js"));
|
|
converters.JSONSparseConverter = require(path.join(conf.converters_dir, "JSONSparseConverter.js"));
|
|
|
|
|
|
/** make TableMapping public */
|
|
exports.TableMapping = TableMapping;
|
|
/** make Projection public */
|
|
exports.Projection = Projection;
|
|
|
|
/** connections is a hash of connectionKey to Connection */
|
|
var connections = {};
|
|
|
|
var deleteFactory;
|
|
|
|
/** Connection contains a hash of database to SessionFactory */
|
|
var Connection = function(connectionKey) {
|
|
this.connectionKey = connectionKey;
|
|
this.factories = {};
|
|
this.count = 0;
|
|
this.isConnecting = true;
|
|
this.waitingForConnection = [];
|
|
};
|
|
|
|
/*jslint forin: true */
|
|
exports.ConnectionProperties = function(nameOrProperties) {
|
|
var serviceProvider, newProperties, key, value;
|
|
if(typeof nameOrProperties === 'string') {
|
|
udebug.log("ConnectionProperties [default for " + nameOrProperties + "]");
|
|
serviceProvider = spi.getDBServiceProvider(nameOrProperties);
|
|
newProperties = serviceProvider.getDefaultConnectionProperties();
|
|
}
|
|
else if(typeof nameOrProperties === 'object' &&
|
|
typeof nameOrProperties.implementation === 'string') {
|
|
udebug.log("ConnectionProperties [copy constructor]");
|
|
newProperties = {};
|
|
for(key in nameOrProperties) {
|
|
value = nameOrProperties[key];
|
|
if(typeof value === 'string' || typeof value === 'number') {
|
|
newProperties[key] = value;
|
|
}
|
|
else {
|
|
udebug.log(" .. not copying property:", key);
|
|
}
|
|
}
|
|
}
|
|
return newProperties;
|
|
};
|
|
|
|
exports.connect = function(properties, annotations, user_callback) {
|
|
var context = new userContext.UserContext(arguments, 3, 2, null, null);
|
|
return context.connect();
|
|
};
|
|
|
|
exports.getConnectionKey = function(properties) {
|
|
var sp = spi.getDBServiceProvider(properties.implementation);
|
|
return sp.getFactoryKey(properties);
|
|
};
|
|
|
|
exports.getConnection = function(connectionKey) {
|
|
return this.connections[connectionKey];
|
|
};
|
|
|
|
exports.newConnection = function(connectionKey) {
|
|
var connection = new Connection(connectionKey);
|
|
this.connections[connectionKey] = connection;
|
|
return connection;
|
|
};
|
|
|
|
exports.openSession = function() {
|
|
var context = new userContext.UserContext(arguments, 3, 2, null, null);
|
|
return context.openSession();
|
|
};
|
|
|
|
|
|
exports.getOpenSessionFactories = function() {
|
|
var result = [];
|
|
var x, y;
|
|
for (x in connections) {
|
|
if (connections.hasOwnProperty(x)) {
|
|
for (y in connections[x].factories) {
|
|
if (connections[x].factories.hasOwnProperty(y)) {
|
|
var factory = connections[x].factories[y];
|
|
result.push(factory);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
};
|
|
|
|
exports.closeAllOpenSessionFactories = function() {
|
|
var context = new userContext.UserContext(arguments, 1, 1);
|
|
return context.closeAllOpenSessionFactories();
|
|
};
|
|
|
|
|
|
/** deleteFactory is called only from SessionFactory.close().
|
|
* Multiple session factories share a db connection pool. When
|
|
* the last session factory using the db connection pool is closed,
|
|
* this function will also close the db connection pool.
|
|
*/
|
|
deleteFactory = function(key, database, callback) {
|
|
udebug.log('deleteFactory for key', key, 'database', database);
|
|
var connection = connections[key];
|
|
var factory = connection.factories[database];
|
|
var dbConnectionPool = factory.dbConnectionPool;
|
|
|
|
delete connection.factories[database];
|
|
if (--connection.count === 0) {
|
|
// no more factories in this connection
|
|
udebug.log('deleteFactory closing dbConnectionPool for key', key, 'database', database);
|
|
dbConnectionPool.close(callback);
|
|
dbConnectionPool = null;
|
|
delete connections[key];
|
|
} else {
|
|
callback();
|
|
}
|
|
};
|
|
|
|
exports.connections = connections;
|
|
exports.Connection = Connection;
|
|
exports.deleteFactory = deleteFactory;
|
|
exports.converters = converters;
|
|
exports.meta = meta;
|