diff --git a/arangod/V8Server/v8-vocbase.cpp b/arangod/V8Server/v8-vocbase.cpp index ecf7dd033b..5511dd4015 100644 --- a/arangod/V8Server/v8-vocbase.cpp +++ b/arangod/V8Server/v8-vocbase.cpp @@ -5423,7 +5423,8 @@ static v8::Handle MapGetVocBase (v8::Local name, const v8::AccessorInfo& info) { v8::HandleScope scope; - TRI_vocbase_t* vocbase = TRI_UnwrapClass(info.Holder(), WRP_VOCBASE_TYPE); + v8::Handle holder = info.Holder()->ToObject(); + TRI_vocbase_t* vocbase = TRI_UnwrapClass(holder, WRP_VOCBASE_TYPE); if (vocbase == 0) { return scope.Close(v8::ThrowException(v8::String::New("corrupted vocbase"))); @@ -5443,24 +5444,40 @@ static v8::Handle MapGetVocBase (v8::Local name, return scope.Close(v8::Handle()); } - // get the collection type (document/edge) - const TRI_col_type_e collectionType = GetVocBaseCollectionType(info.Holder()); + if (holder->HasRealNamedProperty(name)) { + v8::Handle value = holder->GetRealNamedProperty(name)->ToObject(); + TRI_vocbase_col_t* collection = TRI_UnwrapClass(value, WRP_VOCBASE_COL_TYPE); - // look up the value if it exists - TRI_vocbase_col_t const* collection; + if (collection != 0) { + TRI_READ_LOCK_STATUS_VOCBASE_COL(collection); + TRI_vocbase_col_status_e status = collection->_status; + TRI_READ_UNLOCK_STATUS_VOCBASE_COL(collection); + + if (status != TRI_VOC_COL_STATUS_DELETED) { + return scope.Close(value); + } + else { + holder->Delete(name); + } + } + } - collection = TRI_FindCollectionByNameOrBearVocBase(vocbase, key.c_str(), (TRI_col_type_t) collectionType); + // look up the collection + TRI_vocbase_col_t const* collection = TRI_LookupCollectionByNameVocBase(vocbase, key.c_str()); - // if the key is not present return an empty handle as signal if (collection == 0) { - return scope.Close(v8::ThrowException(v8::String::New("cannot load or create collection"))); + return scope.Close(v8::Undefined()); } if (! TRI_IS_DOCUMENT_COLLECTION(collection->_type)) { return scope.Close(v8::ThrowException(v8::String::New("collection is not a document or edge collection"))); } - return scope.Close(TRI_WrapCollection(collection)); + v8::Handle result = TRI_WrapCollection(collection); + + holder->Set(name, result); + + return scope.Close(result); } ////////////////////////////////////////////////////////////////////////////////