diff options
Diffstat (limited to 'Firestore/Source/Local/FSTLevelDBRemoteDocumentCache.mm')
-rw-r--r-- | Firestore/Source/Local/FSTLevelDBRemoteDocumentCache.mm | 46 |
1 files changed, 14 insertions, 32 deletions
diff --git a/Firestore/Source/Local/FSTLevelDBRemoteDocumentCache.mm b/Firestore/Source/Local/FSTLevelDBRemoteDocumentCache.mm index cd14390..4ddd29f 100644 --- a/Firestore/Source/Local/FSTLevelDBRemoteDocumentCache.mm +++ b/Firestore/Source/Local/FSTLevelDBRemoteDocumentCache.mm @@ -22,6 +22,7 @@ #import "Firestore/Protos/objc/firestore/local/MaybeDocument.pbobjc.h" #import "Firestore/Source/Core/FSTQuery.h" +#import "Firestore/Source/Local/FSTLevelDB.h" #import "Firestore/Source/Local/FSTLevelDBKey.h" #import "Firestore/Source/Local/FSTLocalSerializer.h" #import "Firestore/Source/Local/FSTWriteGroup.h" @@ -29,18 +30,16 @@ #import "Firestore/Source/Model/FSTDocumentDictionary.h" #import "Firestore/Source/Model/FSTDocumentSet.h" #import "Firestore/Source/Util/FSTAssert.h" +#include "Firestore/core/src/firebase/firestore/local/leveldb_transaction.h" #include "Firestore/core/src/firebase/firestore/model/document_key.h" NS_ASSUME_NONNULL_BEGIN +using firebase::firestore::local::LevelDbTransaction; using firebase::firestore::model::DocumentKey; using leveldb::DB; -using leveldb::Iterator; -using leveldb::ReadOptions; -using leveldb::Slice; using leveldb::Status; -using leveldb::WriteOptions; @interface FSTLevelDBRemoteDocumentCache () @@ -48,23 +47,11 @@ using leveldb::WriteOptions; @end -/** - * Returns a standard set of read options. - * - * For now this is paranoid, but perhaps disable that in production builds. - */ -static ReadOptions StandardReadOptions() { - ReadOptions options; - options.verify_checksums = true; - return options; -} - @implementation FSTLevelDBRemoteDocumentCache { - // The DB pointer is shared with all cooperating LevelDB-related objects. - std::shared_ptr<DB> _db; + FSTLevelDB *_db; } -- (instancetype)initWithDB:(std::shared_ptr<DB>)db serializer:(FSTLocalSerializer *)serializer { +- (instancetype)initWithDB:(FSTLevelDB *)db serializer:(FSTLocalSerializer *)serializer { if (self = [super init]) { _db = db; _serializer = serializer; @@ -73,7 +60,6 @@ static ReadOptions StandardReadOptions() { } - (void)shutdown { - _db.reset(); } - (void)addEntry:(FSTMaybeDocument *)document group:(FSTWriteGroup *)group { @@ -89,11 +75,11 @@ static ReadOptions StandardReadOptions() { - (nullable FSTMaybeDocument *)entryForKey:(const DocumentKey &)documentKey { std::string key = [FSTLevelDBRemoteDocumentKey keyWithDocumentKey:documentKey]; std::string value; - Status status = _db->Get(StandardReadOptions(), key, &value); + Status status = _db.currentTransaction->Get(key, &value); if (status.IsNotFound()) { return nil; } else if (status.ok()) { - return [self decodedMaybeDocument:value withKey:documentKey]; + return [self decodeMaybeDocument:value withKey:documentKey]; } else { FSTFail(@"Fetch document for key (%s) failed with status: %s", documentKey.ToString().c_str(), status.ToString().c_str()); @@ -106,13 +92,13 @@ static ReadOptions StandardReadOptions() { // Documents are ordered by key, so we can use a prefix scan to narrow down // the documents we need to match the query against. std::string startKey = [FSTLevelDBRemoteDocumentKey keyPrefixWithResourcePath:query.path]; - std::unique_ptr<Iterator> it(_db->NewIterator(StandardReadOptions())); + auto it = _db.currentTransaction->NewIterator(); it->Seek(startKey); FSTLevelDBRemoteDocumentKey *currentKey = [[FSTLevelDBRemoteDocumentKey alloc] init]; for (; it->Valid() && [currentKey decodeKey:it->key()]; it->Next()) { FSTMaybeDocument *maybeDoc = - [self decodedMaybeDocument:it->value() withKey:currentKey.documentKey]; + [self decodeMaybeDocument:it->value() withKey:currentKey.documentKey]; if (!query.path.IsPrefixOf(maybeDoc.key.path())) { break; } else if ([maybeDoc isKindOfClass:[FSTDocument class]]) { @@ -120,12 +106,6 @@ static ReadOptions StandardReadOptions() { } } - Status status = it->status(); - if (!status.ok()) { - FSTFail(@"Find documents matching query (%@) failed with status: %s", query, - status.ToString().c_str()); - } - return results; } @@ -133,9 +113,11 @@ static ReadOptions StandardReadOptions() { return [FSTLevelDBRemoteDocumentKey keyWithDocumentKey:key]; } -- (FSTMaybeDocument *)decodedMaybeDocument:(Slice)slice withKey:(const DocumentKey &)documentKey { - NSData *data = - [[NSData alloc] initWithBytesNoCopy:(void *)slice.data() length:slice.size() freeWhenDone:NO]; +- (FSTMaybeDocument *)decodeMaybeDocument:(absl::string_view)encoded + withKey:(const DocumentKey &)documentKey { + NSData *data = [[NSData alloc] initWithBytesNoCopy:(void *)encoded.data() + length:encoded.size() + freeWhenDone:NO]; NSError *error; FSTPBMaybeDocument *proto = [FSTPBMaybeDocument parseFromData:data error:&error]; |