mirror of https://gitee.com/bigwinds/arangodb
246 lines
8.0 KiB
JavaScript
246 lines
8.0 KiB
JavaScript
/*jshint strict: false */
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief Arango statements
|
|
///
|
|
/// @file
|
|
///
|
|
/// DISCLAIMER
|
|
///
|
|
/// Copyright 2012 triagens GmbH, Cologne, Germany
|
|
///
|
|
/// Licensed 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.
|
|
///
|
|
/// Copyright holder is triAGENS GmbH, Cologne, Germany
|
|
///
|
|
/// @author Jan Steemann
|
|
/// @author Copyright 2012, triAGENS GmbH, Cologne, Germany
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief constructor
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
function ArangoStatement (database, data) {
|
|
this._database = database;
|
|
this._doCount = false;
|
|
this._batchSize = null;
|
|
this._bindVars = {};
|
|
this._options = undefined;
|
|
this._cache = undefined;
|
|
|
|
if (! data) {
|
|
throw "ArangoStatement needs initial data";
|
|
}
|
|
|
|
if (typeof data === "string") {
|
|
data = { query: data };
|
|
}
|
|
else if (typeof data === 'object' && typeof data.toAQL === 'function') {
|
|
data = { query: data.toAQL() };
|
|
}
|
|
|
|
if (! (data instanceof Object)) {
|
|
throw "ArangoStatement needs initial data";
|
|
}
|
|
|
|
if (data.query === undefined || data.query === "") {
|
|
throw "ArangoStatement needs a valid query attribute";
|
|
}
|
|
this.setQuery(data.query);
|
|
|
|
if (data.bindVars instanceof Object) {
|
|
this.bind(data.bindVars);
|
|
}
|
|
if (data.options instanceof Object) {
|
|
this.setOptions(data.options);
|
|
}
|
|
if (data.count !== undefined) {
|
|
this.setCount(data.count);
|
|
}
|
|
if (data.batchSize !== undefined) {
|
|
this.setBatchSize(data.batchSize);
|
|
}
|
|
if (data.cache !== undefined) {
|
|
this.setCache(data.cache);
|
|
}
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief binds a parameter to the statement
|
|
///
|
|
/// This function can be called multiple times, once for each bind parameter.
|
|
/// All bind parameters will be transferred to the server in one go when
|
|
/// execute() is called.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
ArangoStatement.prototype.bind = function (key, value) {
|
|
if (key instanceof Object) {
|
|
if (value !== undefined) {
|
|
throw "invalid bind parameter declaration";
|
|
}
|
|
|
|
this._bindVars = key;
|
|
}
|
|
else if (typeof(key) === "string") {
|
|
this._bindVars[key] = value;
|
|
}
|
|
else if (typeof(key) === "number") {
|
|
var strKey = String(parseInt(key, 10));
|
|
|
|
if (strKey !== String(key)) {
|
|
throw "invalid bind parameter declaration";
|
|
}
|
|
|
|
this._bindVars[strKey] = value;
|
|
}
|
|
else {
|
|
throw "invalid bind parameter declaration";
|
|
}
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief returns the bind variables already set
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
ArangoStatement.prototype.getBindVariables = function () {
|
|
return this._bindVars;
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief gets the cache flag for the statement
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
ArangoStatement.prototype.getCache = function () {
|
|
return this._cache;
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief gets the count flag for the statement
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
ArangoStatement.prototype.getCount = function () {
|
|
return this._doCount;
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief gets the maximum number of results documents the cursor will return
|
|
/// in a single server roundtrip.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
ArangoStatement.prototype.getBatchSize = function () {
|
|
return this._batchSize;
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief gets the user options
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
ArangoStatement.prototype.getOptions = function () {
|
|
return this._options;
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief gets query string
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
ArangoStatement.prototype.getQuery = function () {
|
|
return this._query;
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief sets the cache flag for the statement
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
ArangoStatement.prototype.setCache = function (bool) {
|
|
this._cache = bool ? true : false;
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief sets the count flag for the statement
|
|
///
|
|
/// Setting the count flag will make the statement's result cursor return the
|
|
/// total number of result documents. The count flag is not set by default.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
ArangoStatement.prototype.setCount = function (bool) {
|
|
this._doCount = bool ? true : false;
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief sets the maximum number of results documents the cursor will return
|
|
/// in a single server roundtrip.
|
|
/// The higher this number is, the less server roundtrips will be made when
|
|
/// iterating over the result documents of a cursor.
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
ArangoStatement.prototype.setBatchSize = function (value) {
|
|
var batch = parseInt(value, 10);
|
|
|
|
if (batch > 0) {
|
|
this._batchSize = batch;
|
|
}
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief sets the user options
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
ArangoStatement.prototype.setOptions = function (value) {
|
|
this._options = value;
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief sets the query string
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
ArangoStatement.prototype.setQuery = function (query) {
|
|
this._query = (query && typeof query.toAQL === 'function') ? query.toAQL() : query;
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief parses a query and return the results
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
ArangoStatement.prototype.parse = function () {
|
|
throw "cannot call abstract method parse()";
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief explains a query and return the results
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
ArangoStatement.prototype.explain = function () {
|
|
throw "cannot call abstract method explain()";
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief executes the query
|
|
///
|
|
/// Invoking execute() will transfer the query and all bind parameters to the
|
|
/// server. It will return a cursor with the query results in case of success.
|
|
/// In case of an error, the error will be printed
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
ArangoStatement.prototype.execute = function () {
|
|
throw "cannot call abstract method execute()";
|
|
};
|
|
|
|
|
|
exports.ArangoStatement = ArangoStatement;
|
|
|
|
|