blob: bb7146de52399e695b10698cfe25202509eda8de [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import {getQuery} from "../tools/SQLFlavorManager";
import * as util from "util";
import GraphRepository from '../models/GraphRepository';
class DatabaseService {
constructor() {
this._agensDatabaseHelper = null;
}
async getMetaData() {
let metadata = {};
try {
let connectionInfo = this.getConnectionInfo();
metadata.nodes = await this.getNodes();
metadata.edges = await this.getEdges();
metadata.propertyKeys = await this.getPropertyKeys();
metadata.graph = connectionInfo.graph;
metadata.database = connectionInfo.database;
metadata.role = await this.getRole();
} catch (error) {
throw error;
}
return metadata;
}
async getGraphLabels() {
let agensDatabaseHelper = this._agensDatabaseHelper;
let queryResult = {};
try {
queryResult = await agensDatabaseHelper.execute(getQuery(agensDatabaseHelper.flavor, 'graph_labels'), [this.getConnectionInfo().graph]);
} catch (error) {
throw error;
}
return queryResult.rows;
}
async getGraphLabelCount(labelName, labelKind) {
let agensDatabaseHelper = this._agensDatabaseHelper;
let query = null;
if (labelKind === 'v') {
query = util.format(getQuery(agensDatabaseHelper.flavor, 'label_count_vertex'), `${this.getConnectionInfo().graph}.${labelName}`);
} else if (labelKind === 'e') {
query = util.format(getQuery(agensDatabaseHelper.flavor, 'label_count_edge'), `${this.getConnectionInfo().graph}.${labelName}`);
}
let queryResult = await agensDatabaseHelper.execute(query);
return queryResult.rows;
}
async getNodes() {
let agensDatabaseHelper = this._agensDatabaseHelper;
let queryResult = await agensDatabaseHelper.execute(util.format(getQuery(agensDatabaseHelper.flavor, 'meta_nodes'), agensDatabaseHelper._graph, agensDatabaseHelper._graph));
return queryResult.rows;
}
async getEdges() {
let agensDatabaseHelper = this._agensDatabaseHelper;
let queryResult = await agensDatabaseHelper.execute(util.format(getQuery(agensDatabaseHelper.flavor, 'meta_edges'), agensDatabaseHelper._graph, agensDatabaseHelper._graph));
return queryResult.rows;
}
async getPropertyKeys() {
let agensDatabaseHelper = this._agensDatabaseHelper;
let queryResult = await agensDatabaseHelper.execute(getQuery(agensDatabaseHelper.flavor, 'property_keys'));
return queryResult.rows;
}
async getRole() {
let agensDatabaseHelper = this._agensDatabaseHelper;
let queryResult = await agensDatabaseHelper.execute(getQuery(agensDatabaseHelper.flavor, 'get_role'), [this.getConnectionInfo().user]);
return queryResult.rows[0];
}
async connectDatabase(connectionInfo) {
let agensDatabaseHelper = this._agensDatabaseHelper;
if (agensDatabaseHelper == null) {
this._agensDatabaseHelper = new GraphRepository(connectionInfo);
agensDatabaseHelper = this._agensDatabaseHelper;
}
try {
let client = await agensDatabaseHelper.getConnection(agensDatabaseHelper.getConnectionInfo(), true);
client.release();
} catch (e) {
this._agensDatabaseHelper = null;
throw e;
}
return true;
}
async disconnectDatabase() {
let agensDatabaseHelper = this._agensDatabaseHelper;
if (agensDatabaseHelper == null) {
console.log('Already Disconnected');
return false;
} else {
let isRelease = await this._agensDatabaseHelper.releaseConnection();
if (isRelease) {
this._agensDatabaseHelper = null;
return true;
} else {
console.log('Failed releaseConnection()');
return false;
}
}
}
async getConnectionStatus() {
let agensDatabaseHelper = this._agensDatabaseHelper;
if (agensDatabaseHelper == null) {
return false;
}
try {
let client = await GraphRepository.getConnection(agensDatabaseHelper.getConnectionInfo());
client.release();
} catch (err) {
return false;
}
return true;
}
getConnectionInfo() {
if (this.isConnected() === false)
throw new Error("Not connected");
return this._agensDatabaseHelper.getConnectionInfo();
}
isConnected() {
return this._agensDatabaseHelper != null;
}
get agensDatabaseHelper() {
return this._agensDatabaseHelper;
}
convertEdge({label, id, start, end, props}) {
return {
label: label,
id: `${id.oid}.${id.id}`,
start: `${start.oid}.${start.id}`,
end: `${end.oid}.${end.id}`,
properties: props,
};
}
}
module.exports = DatabaseService;