//////////////////////////////////////////////////////////////////////////////// /// @brief V8-vocbase bridge /// /// @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 2011-2013, triAGENS GmbH, Cologne, Germany //////////////////////////////////////////////////////////////////////////////// #ifndef TRIAGENS_V8_V8_GLOBALS_H #define TRIAGENS_V8_V8_GLOBALS_H 1 #include "Basics/Common.h" #include #include #include "Basics/ReadWriteLock.h" // ----------------------------------------------------------------------------- // --SECTION-- public macros // ----------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for creating a v8 symbol for the specified string //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_SYMBOL(name) \ v8::String::NewSymbol(name, strlen(name)) //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for creating a v8 string for the specified string //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_STRING(name) \ v8::String::New(name) //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for current v8 globals //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_CURRENT_GLOBALS \ v8::Isolate* isolate = v8::Isolate::GetCurrent(); \ TRI_v8_global_t* v8g = (TRI_v8_global_t*) isolate->GetData(); \ while (0) //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for current v8 globals and scope //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_CURRENT_GLOBALS_AND_SCOPE \ v8::Isolate* isolate = v8::Isolate::GetCurrent(); \ TRI_v8_global_t* v8g = (TRI_v8_global_t*) isolate->GetData(); \ v8::HandleScope scope; \ while (0) //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for throwing an exception with an error code //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_EXCEPTION(scope, code) \ return scope.Close(v8::ThrowException(TRI_CreateErrorObject(code))) //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for throwing an exception and returning //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_EXCEPTION_MESSAGE(scope, code, message) \ return scope.Close(v8::ThrowException(TRI_CreateErrorObject(code, message, true))) //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for throwing a usage exception and returning //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_EXCEPTION_USAGE(scope, usage) \ do { \ std::string msg = "usage: "; \ msg += usage; \ return scope.Close( \ v8::ThrowException( \ TRI_CreateErrorObject(TRI_ERROR_BAD_PARAMETER, msg.c_str()))); \ } \ while (0) //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for throwing an internal exception and returning //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_EXCEPTION_INTERNAL(scope, message) \ return scope.Close(v8::ThrowException(TRI_CreateErrorObject(TRI_ERROR_INTERNAL, message))); //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for throwing a parameter exception and returning //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_EXCEPTION_PARAMETER(scope, message) \ return scope.Close(v8::ThrowException(TRI_CreateErrorObject(TRI_ERROR_BAD_PARAMETER, message))); //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for throwing an out-of-memory exception and returning //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_EXCEPTION_MEMORY(scope) \ return scope.Close(v8::ThrowException(TRI_CreateErrorObject(TRI_ERROR_OUT_OF_MEMORY))); //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for throwing an exception for an system error //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_EXCEPTION_SYS(scope, message) \ do { \ TRI_set_errno(TRI_ERROR_SYS_ERROR); \ std::string msg = message; \ msg += ": "; \ msg += TRI_LAST_ERROR_STR; \ return scope.Close(v8::ThrowException( \ TRI_CreateErrorObject( \ TRI_errno(), \ msg.c_str()))); \ } \ while (0) //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for throwing an error //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_ERROR(scope, message) \ return scope.Close(v8::ThrowException(v8::Exception::Error(v8::String::New(message)))) //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for throwing a range error //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_RANGE_ERROR(scope, message) \ return scope.Close(v8::ThrowException(v8::Exception::RangeError(v8::String::New(message)))) //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for throwing a syntax error //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_SYNTAX_ERROR(scope, message) \ return scope.Close(v8::ThrowException(v8::Exception::SyntaxError(v8::String::New(message)))) //////////////////////////////////////////////////////////////////////////////// /// @brief shortcut for throwing a type error //////////////////////////////////////////////////////////////////////////////// #define TRI_V8_TYPE_ERROR(scope, message) \ return scope.Close(v8::ThrowException(v8::Exception::TypeError(v8::String::New(message)))) // ----------------------------------------------------------------------------- // --SECTION-- public types // ----------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////// /// @brief globals stored in the isolate //////////////////////////////////////////////////////////////////////////////// typedef struct TRI_v8_global_s { //////////////////////////////////////////////////////////////////////////////// /// @brief constructor //////////////////////////////////////////////////////////////////////////////// TRI_v8_global_s (v8::Isolate*); //////////////////////////////////////////////////////////////////////////////// /// @brief destructor //////////////////////////////////////////////////////////////////////////////// ~TRI_v8_global_s (); // ----------------------------------------------------------------------------- // --SECTION-- HELPERS // ----------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////// /// @brief barrier mapping for weak pointers //////////////////////////////////////////////////////////////////////////////// std::map< void*, v8::Persistent > JSBarriers; // ----------------------------------------------------------------------------- // --SECTION-- JAVASCRIPT OBJECT TEMPLATES // ----------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////// /// @brief error template //////////////////////////////////////////////////////////////////////////////// v8::Persistent ErrorTempl; //////////////////////////////////////////////////////////////////////////////// /// @brief general cursor template //////////////////////////////////////////////////////////////////////////////// v8::Persistent GeneralCursorTempl; //////////////////////////////////////////////////////////////////////////////// /// @brief TRI_shaped_json_t template //////////////////////////////////////////////////////////////////////////////// v8::Persistent ShapedJsonTempl; //////////////////////////////////////////////////////////////////////////////// /// @brief transaction template //////////////////////////////////////////////////////////////////////////////// v8::Persistent TransactionTempl; //////////////////////////////////////////////////////////////////////////////// /// @brief TRI_vocbase_col_t template //////////////////////////////////////////////////////////////////////////////// v8::Persistent VocbaseColTempl; //////////////////////////////////////////////////////////////////////////////// /// @brief TRI_vocbase_t template //////////////////////////////////////////////////////////////////////////////// v8::Persistent VocbaseTempl; // ----------------------------------------------------------------------------- // --SECTION-- JAVASCRIPT FUNCTION TEMPLATES // ----------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////// /// @brief Buffer template //////////////////////////////////////////////////////////////////////////////// v8::Persistent BufferTempl; //////////////////////////////////////////////////////////////////////////////// /// @brief fast Buffer constructor //////////////////////////////////////////////////////////////////////////////// v8::Persistent FastBufferConstructor; // ----------------------------------------------------------------------------- // --SECTION-- JAVASCRIPT CONSTANTS // ----------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////// /// @brief "Buffer" constant //////////////////////////////////////////////////////////////////////////////// v8::Persistent BufferConstant; //////////////////////////////////////////////////////////////////////////////// /// @brief "DELETE" constant //////////////////////////////////////////////////////////////////////////////// v8::Persistent DeleteConstant; //////////////////////////////////////////////////////////////////////////////// /// @brief "GET" constant //////////////////////////////////////////////////////////////////////////////// v8::Persistent GetConstant; //////////////////////////////////////////////////////////////////////////////// /// @brief "HEAD" constant //////////////////////////////////////////////////////////////////////////////// v8::Persistent HeadConstant; //////////////////////////////////////////////////////////////////////////////// /// @brief "OPTIONS" constant //////////////////////////////////////////////////////////////////////////////// v8::Persistent OptionsConstant; //////////////////////////////////////////////////////////////////////////////// /// @brief "PATCH" constant //////////////////////////////////////////////////////////////////////////////// v8::Persistent PatchConstant; //////////////////////////////////////////////////////////////////////////////// /// @brief "POST" constant //////////////////////////////////////////////////////////////////////////////// v8::Persistent PostConstant; //////////////////////////////////////////////////////////////////////////////// /// @brief "PUT" constant //////////////////////////////////////////////////////////////////////////////// v8::Persistent PutConstant; // ----------------------------------------------------------------------------- // --SECTION-- JAVASCRIPT KEY NAMES // ----------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////// /// @brief "address" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent AddressKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "bodyFromFile" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent BodyFromFileKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "body" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent BodyKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "client" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent ClientKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "code" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent CodeKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "contentType" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent ContentTypeKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "cookies" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent CookiesKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "database" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent DatabaseKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "doCompact" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent DoCompactKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "domain" key //////////////////////////////////////////////////////////////////////////////// v8::Persistent DomainKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "error" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent ErrorKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "errorMessage" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent ErrorMessageKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "errorNum" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent ErrorNumKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "headers" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent HeadersKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "httpOnly" key //////////////////////////////////////////////////////////////////////////////// v8::Persistent HttpOnlyKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "id" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent IdKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "isSystem" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent IsSystemKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "isVolatile" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent IsVolatileKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "journalSize" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent JournalSizeKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "keyOptions" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent KeyOptionsKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "length" key //////////////////////////////////////////////////////////////////////////////// v8::Persistent LengthKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "lifeTime" key //////////////////////////////////////////////////////////////////////////////// v8::Persistent LifeTimeKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "name" key //////////////////////////////////////////////////////////////////////////////// v8::Persistent NameKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "parameters" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent ParametersKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "path" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent PathKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "prefix" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent PrefixKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "port" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent PortKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "protocol" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent ProtocolKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "requestBody" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent RequestBodyKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "requestType" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent RequestTypeKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "responseCode" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent ResponseCodeKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "secure" key //////////////////////////////////////////////////////////////////////////////// v8::Persistent SecureKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "server" key //////////////////////////////////////////////////////////////////////////////// v8::Persistent ServerKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "suffix" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent SuffixKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "transformations" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent TransformationsKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "url" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent UrlKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "user" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent UserKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "value" key //////////////////////////////////////////////////////////////////////////////// v8::Persistent ValueKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "waitForSync" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent WaitForSyncKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "_from" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent _FromKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "_id" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent _IdKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "_key" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent _KeyKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "_oldRev" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent _OldRevKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "_rev" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent _RevKey; //////////////////////////////////////////////////////////////////////////////// /// @brief "_to" key name //////////////////////////////////////////////////////////////////////////////// v8::Persistent _ToKey; // ----------------------------------------------------------------------------- // --SECTION-- REGULAR EXPRESSIONS // ----------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////// /// @brief document identifier as collection name/key //////////////////////////////////////////////////////////////////////////////// regex_t DocumentIdRegex; //////////////////////////////////////////////////////////////////////////////// /// @brief document identifier //////////////////////////////////////////////////////////////////////////////// regex_t DocumentKeyRegex; //////////////////////////////////////////////////////////////////////////////// /// @brief numeric id, used for index ids //////////////////////////////////////////////////////////////////////////////// regex_t IdRegex; //////////////////////////////////////////////////////////////////////////////// /// @brief index identifier as collection-name:index-id //////////////////////////////////////////////////////////////////////////////// regex_t IndexIdRegex; // ----------------------------------------------------------------------------- // --SECTION-- DATABASE // ----------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////// /// @brief currently running transaction //////////////////////////////////////////////////////////////////////////////// void* _currentTransaction; //////////////////////////////////////////////////////////////////////////////// /// @brief pointer to the server (TRI_server_t*) //////////////////////////////////////////////////////////////////////////////// void* _server; //////////////////////////////////////////////////////////////////////////////// /// @brief pointer to the vocbase (TRI_vocbase_t*) //////////////////////////////////////////////////////////////////////////////// void* _vocbase; //////////////////////////////////////////////////////////////////////////////// /// @brief pointer to the startup loader (JSLoader*) //////////////////////////////////////////////////////////////////////////////// void* _loader; //////////////////////////////////////////////////////////////////////////////// /// @brief whether or not useDatabase() is allowed //////////////////////////////////////////////////////////////////////////////// bool _allowUseDatabase; } TRI_v8_global_t; // ----------------------------------------------------------------------------- // --SECTION-- GLOBAL FUNCTIONS // ----------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////// /// @brief creates a global context //////////////////////////////////////////////////////////////////////////////// TRI_v8_global_t* TRI_CreateV8Globals(v8::Isolate*); //////////////////////////////////////////////////////////////////////////////// /// @brief adds a method to the prototype of an object //////////////////////////////////////////////////////////////////////////////// template void TRI_V8_AddProtoMethod (TARGET tpl, const char* const name, v8::InvocationCallback callback, const bool isHidden = false) { // hidden method if (isHidden) { tpl->PrototypeTemplate()->Set(TRI_V8_SYMBOL(name), v8::FunctionTemplate::New(callback), v8::DontEnum); } // normal method else { tpl->PrototypeTemplate()->Set(TRI_V8_SYMBOL(name), v8::FunctionTemplate::New(callback)); } } //////////////////////////////////////////////////////////////////////////////// /// @brief adds a method to an object //////////////////////////////////////////////////////////////////////////////// template inline void TRI_V8_AddMethod (TARGET tpl, const char* const name, v8::Handle callback, const bool isHidden = false) { // hidden method if (isHidden) { tpl->Set(TRI_V8_SYMBOL(name), callback->GetFunction(), v8::DontEnum); } // normal method else { tpl->Set(TRI_V8_SYMBOL(name), callback->GetFunction()); } } template inline void TRI_V8_AddMethod (TARGET tpl, const char* const name, v8::InvocationCallback callback, const bool isHidden = false) { // hidden method if (isHidden) { tpl->Set(TRI_V8_SYMBOL(name), v8::FunctionTemplate::New(callback)->GetFunction(), v8::DontEnum); } // normal method else { tpl->Set(TRI_V8_SYMBOL(name), v8::FunctionTemplate::New(callback)->GetFunction()); } } template <> inline void TRI_V8_AddMethod (v8::Handle tpl, const char* const name, v8::InvocationCallback callback, const bool isHidden) { TRI_V8_AddMethod(tpl->GetFunction(), name, callback, isHidden); } //////////////////////////////////////////////////////////////////////////////// /// @brief adds a method to an object //////////////////////////////////////////////////////////////////////////////// void TRI_AddMethodVocbase (v8::Handle tpl, const char* const name, v8::Handle(*func)(v8::Arguments const&), const bool isHidden = false); //////////////////////////////////////////////////////////////////////////////// /// @brief adds a global function to the given context //////////////////////////////////////////////////////////////////////////////// void TRI_AddGlobalFunctionVocbase (v8::Handle context, const char* const name, v8::Handle(*func)(v8::Arguments const&), const bool isHidden = false); //////////////////////////////////////////////////////////////////////////////// /// @brief adds a global function to the given context //////////////////////////////////////////////////////////////////////////////// void TRI_AddGlobalFunctionVocbase (v8::Handle context, const char* const name, v8::Handle func, const bool isHidden = false); //////////////////////////////////////////////////////////////////////////////// /// @brief adds a global variable to the given context //////////////////////////////////////////////////////////////////////////////// void TRI_AddGlobalVariableVocbase (v8::Handle context, const char* const name, v8::Handle value); #endif // ----------------------------------------------------------------------------- // --SECTION-- END-OF-FILE // ----------------------------------------------------------------------------- // Local Variables: // mode: outline-minor // outline-regexp: "/// @brief\\|/// {@inheritDoc}\\|/// @addtogroup\\|/// @page\\|// --SECTION--\\|/// @\\}" // End: