/*jshint strict: false, -W051: true */ /*global require, ArangoConnection, SYS_ARANGO, window */ //////////////////////////////////////////////////////////////////////////////// /// @brief module "internal" /// /// @file /// /// DISCLAIMER /// /// Copyright 2004-2013 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 Dr. Frank Celler /// @author Copyright 2010-2013, triAGENS GmbH, Cologne, Germany //////////////////////////////////////////////////////////////////////////////// // ----------------------------------------------------------------------------- // --SECTION-- Module "internal" // ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- // --SECTION-- private variables // ----------------------------------------------------------------------------- (function () { var internal = require("internal"); //////////////////////////////////////////////////////////////////////////////// /// @brief hide global variables //////////////////////////////////////////////////////////////////////////////// if (typeof ArangoConnection !== "undefined") { internal.ArangoConnection = ArangoConnection; delete ArangoConnection; } if (typeof SYS_ARANGO !== "undefined") { internal.arango = SYS_ARANGO; delete SYS_ARANGO; } // ----------------------------------------------------------------------------- // --SECTION-- private functions // ----------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////// /// @brief write-ahead log functionality //////////////////////////////////////////////////////////////////////////////// internal.wal = { flush: function (waitForSync, waitForCollector) { if (typeof internal.arango !== 'undefined') { var wfs = waitForSync ? "true" : "false"; var wfc = waitForCollector ? "true" : "false"; internal.arango.PUT("/_admin/wal/flush?waitForSync=" + wfs + "&waitForCollector=" + wfc, ""); return; } throw "not connected"; }, properties: function (value) { if (typeof internal.arango !== 'undefined') { if (value !== undefined) { return internal.arango.PUT("/_admin/wal/properties", JSON.stringify(value)); } return internal.arango.GET("/_admin/wal/properties", ""); } throw "not connected"; } }; //////////////////////////////////////////////////////////////////////////////// /// @brief reloads the AQL user functions //////////////////////////////////////////////////////////////////////////////// internal.reloadAqlFunctions = function () { if (typeof internal.arango !== 'undefined') { internal.arango.POST("/_admin/aql/reload", ""); return; } throw "not connected"; }; //////////////////////////////////////////////////////////////////////////////// /// @brief flushes the module cache of the server //////////////////////////////////////////////////////////////////////////////// internal.flushServerModules = function () { if (typeof internal.arango !== 'undefined') { internal.arango.POST("/_admin/modules/flush", ""); return; } throw "not connected"; }; //////////////////////////////////////////////////////////////////////////////// /// @brief rebuilds the routing cache //////////////////////////////////////////////////////////////////////////////// internal.reloadRouting = function () { if (typeof internal.arango !== 'undefined') { internal.arango.POST("/_admin/routing/reload", ""); return; } throw "not connected"; }; //////////////////////////////////////////////////////////////////////////////// /// @brief rebuilds the routing cache //////////////////////////////////////////////////////////////////////////////// internal.routingCache = function () { if (typeof internal.arango !== 'undefined') { return internal.arango.GET("/_admin/routing/routes", ""); } throw "not connected"; }; //////////////////////////////////////////////////////////////////////////////// /// @brief rebuilds the authentication cache //////////////////////////////////////////////////////////////////////////////// internal.reloadAuth = function () { if (typeof internal.arango !== 'undefined') { internal.arango.POST("/_admin/auth/reload", ""); return; } throw "not connected"; }; //////////////////////////////////////////////////////////////////////////////// /// @brief execute javascript file on the server //////////////////////////////////////////////////////////////////////////////// internal.executeServer = function (body) { if (typeof internal.arango !== 'undefined') { return internal.arango.POST("/_admin/execute", body); } throw "not connected"; }; //////////////////////////////////////////////////////////////////////////////// /// @brief logs a request in curl format //////////////////////////////////////////////////////////////////////////////// internal.appendCurlRequest = function (appender) { return function (method, url, body, headers) { var response; var curl; var i; if (typeof body !== 'string') { body = internal.inspect(body); } curl = "shell> curl "; if (method === 'POST') { response = internal.arango.POST_RAW(url, body, headers); curl += "-X " + method + " "; } else if (method === 'PUT') { response = internal.arango.PUT_RAW(url, body, headers); curl += "-X " + method + " "; } else if (method === 'GET') { response = internal.arango.GET_RAW(url, headers); } else if (method === 'DELETE') { response = internal.arango.DELETE_RAW(url, headers); curl += "-X " + method + " "; } else if (method === 'PATCH') { response = internal.arango.PATCH_RAW(url, body, headers); curl += "-X " + method + " "; } else if (method === 'HEAD') { response = internal.arango.HEAD_RAW(url, headers); curl += "-X " + method + " "; } else if (method === 'OPTION') { response = internal.arango.OPTION_RAW(url, body, headers); curl += "-X " + method + " "; } if (headers !== undefined && headers !== "") { for (i in headers) { if (headers.hasOwnProperty(i)) { curl += "--header \'" + i + ": " + headers[i] + "\' "; } } } if (body !== undefined && body !== "") { curl += "--data-binary @- "; } curl += "--dump - http://localhost:8529" + url; appender(curl + "\n"); if (body !== undefined && body !== "" && body !== "undefined") { appender(body + "\n"); } appender("\n"); return response; }; }; //////////////////////////////////////////////////////////////////////////////// /// @brief logs a raw response //////////////////////////////////////////////////////////////////////////////// internal.appendRawResponse = function (appender) { return function (response) { var key; var headers = response.headers; // generate header appender("HTTP/1.1 " + headers['http/1.1'] + "\n"); for (key in headers) { if (headers.hasOwnProperty(key)) { if (key !== 'http/1.1' && key !== 'server' && key !== 'connection' && key !== 'content-length') { appender(key + ": " + headers[key] + "\n"); } } } appender("\n"); // append body if (response.body !== undefined) { appender(internal.inspect(response.body)); appender("\n"); } }; }; //////////////////////////////////////////////////////////////////////////////// /// @brief logs a response in JSON //////////////////////////////////////////////////////////////////////////////// internal.appendJsonResponse = function (appender) { return function (response) { var rawAppend = internal.appendRawResponse(appender); // copy original body (this is necessary because "response" is passed by reference) var copy = response.body; // overwrite body with parsed JSON && append response.body = JSON.parse(response.body); rawAppend(response); // restore original body response.body = copy; }; }; // ----------------------------------------------------------------------------- // --SECTION-- public functions // ----------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////// /// @brief log function //////////////////////////////////////////////////////////////////////////////// internal.log = function (level, msg) { internal.output(level, ": ", msg, "\n"); }; //////////////////////////////////////////////////////////////////////////////// /// @brief sprintf wrapper //////////////////////////////////////////////////////////////////////////////// try { if (window) { internal.sprintf = function (format) { var n = arguments.length; if (n === 0) { return ""; } if (n <= 1) { return String(format); } var i = 0; return format.replace(/%[dfs]/, function () { return String(arguments[++i]); }); }; } } catch (err) { } }()); // ----------------------------------------------------------------------------- // --SECTION-- END-OF-FILE // ----------------------------------------------------------------------------- // Local Variables: // mode: outline-minor // outline-regexp: "/// @brief\\|/// @addtogroup\\|/// @page\\|// --SECTION--\\|/// @\\}\\|/\\*jslint" // End: