aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--Firestore/Source/API/FIRFirestore.mm4
-rw-r--r--Firestore/Source/API/FSTUserDataConverter.mm19
-rw-r--r--Firestore/Source/Core/FSTQuery.mm3
-rw-r--r--Firestore/Source/Local/FSTLevelDB.mm6
-rw-r--r--Firestore/Source/Model/FSTFieldValue.mm7
-rw-r--r--Firestore/core/src/firebase/firestore/util/comparison.cc6
-rw-r--r--Firestore/core/src/firebase/firestore/util/comparison.h5
-rw-r--r--Firestore/core/src/firebase/firestore/util/hard_assert_apple.mm4
8 files changed, 34 insertions, 20 deletions
diff --git a/Firestore/Source/API/FIRFirestore.mm b/Firestore/Source/API/FIRFirestore.mm
index 3671b51..fb4a1ec 100644
--- a/Firestore/Source/API/FIRFirestore.mm
+++ b/Firestore/Source/API/FIRFirestore.mm
@@ -128,11 +128,11 @@ extern "C" NSString *const FIRFirestoreErrorDomain = @"FIRFirestoreErrorDomain";
@"Failed to get FirebaseApp instance. Please call FirebaseApp.configure() "
@"before using Firestore");
}
- return [self firestoreForApp:app database:util::WrapNSStringNoCopy(DatabaseId::kDefault)];
+ return [self firestoreForApp:app database:util::WrapNSString(DatabaseId::kDefault)];
}
+ (instancetype)firestoreForApp:(FIRApp *)app {
- return [self firestoreForApp:app database:util::WrapNSStringNoCopy(DatabaseId::kDefault)];
+ return [self firestoreForApp:app database:util::WrapNSString(DatabaseId::kDefault)];
}
// TODO(b/62410906): make this public
diff --git a/Firestore/Source/API/FSTUserDataConverter.mm b/Firestore/Source/API/FSTUserDataConverter.mm
index 44e46da..d73a870 100644
--- a/Firestore/Source/API/FSTUserDataConverter.mm
+++ b/Firestore/Source/API/FSTUserDataConverter.mm
@@ -17,6 +17,7 @@
#import "Firestore/Source/API/FSTUserDataConverter.h"
#include <memory>
+#include <string>
#include <utility>
#include <vector>
@@ -41,6 +42,7 @@
#include "Firestore/core/src/firebase/firestore/util/hard_assert.h"
#include "Firestore/core/src/firebase/firestore/util/string_apple.h"
#include "absl/memory/memory.h"
+#include "absl/strings/match.h"
namespace util = firebase::firestore::util;
using firebase::firestore::model::ArrayTransform;
@@ -55,7 +57,7 @@ using firebase::firestore::model::TransformOperation;
NS_ASSUME_NONNULL_BEGIN
-static NSString *const RESERVED_FIELD_DESIGNATOR = @"__";
+static const char *RESERVED_FIELD_DESIGNATOR = "__";
#pragma mark - FSTParsedSetData
@@ -277,7 +279,7 @@ typedef NS_ENUM(NSInteger, FSTUserDataSource) {
arrayElement:NO
fieldTransforms:_fieldTransforms
fieldMask:_fieldMask];
- [context validatePathSegment:fieldName];
+ [context validatePathSegment:util::MakeStringView(fieldName)];
return context;
}
@@ -334,15 +336,16 @@ typedef NS_ENUM(NSInteger, FSTUserDataSource) {
if (_path == nullptr) {
return;
}
- for (const auto &segment : *_path) {
- [self validatePathSegment:util::WrapNSStringNoCopy(segment)];
+ for (const std::string &segment : *_path) {
+ [self validatePathSegment:segment];
}
}
-- (void)validatePathSegment:(NSString *)segment {
- if ([self isWrite] && [segment hasPrefix:RESERVED_FIELD_DESIGNATOR] &&
- [segment hasSuffix:RESERVED_FIELD_DESIGNATOR]) {
- FSTThrowInvalidArgument(@"Document fields cannot begin and end with %@%@",
+- (void)validatePathSegment:(absl::string_view)segment {
+ absl::string_view designator{RESERVED_FIELD_DESIGNATOR};
+ if ([self isWrite] && absl::StartsWith(segment, designator) &&
+ absl::EndsWith(segment, designator)) {
+ FSTThrowInvalidArgument(@"Document fields cannot begin and end with %s%@",
RESERVED_FIELD_DESIGNATOR, [self fieldDescription]);
}
}
diff --git a/Firestore/Source/Core/FSTQuery.mm b/Firestore/Source/Core/FSTQuery.mm
index eb6d087..abec474 100644
--- a/Firestore/Source/Core/FSTQuery.mm
+++ b/Firestore/Source/Core/FSTQuery.mm
@@ -753,7 +753,8 @@ NSString *FSTStringFromQueryRelationOperator(FSTRelationFilterOperator filterOpe
return _canonicalID;
}
- NSMutableString *canonicalID = [util::WrapNSStringNoCopy(_path.CanonicalString()) mutableCopy];
+ NSMutableString *canonicalID = [NSMutableString string];
+ [canonicalID appendFormat:@"%s", _path.CanonicalString().c_str()];
// Add filters.
[canonicalID appendString:@"|f:"];
diff --git a/Firestore/Source/Local/FSTLevelDB.mm b/Firestore/Source/Local/FSTLevelDB.mm
index 321d47a..9f75a3e 100644
--- a/Firestore/Source/Local/FSTLevelDB.mm
+++ b/Firestore/Source/Local/FSTLevelDB.mm
@@ -114,10 +114,10 @@ using leveldb::WriteOptions;
// projectIDs are DNS-compatible names and cannot contain dots so there's
// no danger of collisions.
NSString *directory = documentsDirectory;
- directory = [directory
- stringByAppendingPathComponent:util::WrapNSStringNoCopy(databaseInfo.persistence_key())];
+ directory =
+ [directory stringByAppendingPathComponent:util::WrapNSString(databaseInfo.persistence_key())];
- NSString *segment = util::WrapNSStringNoCopy(databaseInfo.database_id().project_id());
+ NSString *segment = util::WrapNSString(databaseInfo.database_id().project_id());
if (!databaseInfo.database_id().IsDefaultDatabase()) {
segment = [NSString
stringWithFormat:@"%@.%s", segment, databaseInfo.database_id().database_id().c_str()];
diff --git a/Firestore/Source/Model/FSTFieldValue.mm b/Firestore/Source/Model/FSTFieldValue.mm
index 6a13511..4acae7d 100644
--- a/Firestore/Source/Model/FSTFieldValue.mm
+++ b/Firestore/Source/Model/FSTFieldValue.mm
@@ -690,13 +690,12 @@ static NSComparisonResult CompareBytes(NSData *left, NSData *right) {
- (NSComparisonResult)compare:(FSTFieldValue *)other {
if ([other isKindOfClass:[FSTReferenceValue class]]) {
FSTReferenceValue *ref = (FSTReferenceValue *)other;
- NSComparisonResult cmp = [util::WrapNSStringNoCopy(self.databaseID->project_id())
- compare:util::WrapNSStringNoCopy(ref.databaseID->project_id())];
+ NSComparisonResult cmp =
+ WrapCompare(self.databaseID->project_id(), ref.databaseID->project_id());
if (cmp != NSOrderedSame) {
return cmp;
}
- cmp = [util::WrapNSStringNoCopy(self.databaseID->database_id())
- compare:util::WrapNSStringNoCopy(ref.databaseID->database_id())];
+ cmp = WrapCompare(self.databaseID->database_id(), ref.databaseID->database_id());
return cmp != NSOrderedSame ? cmp : [self.key compare:ref.key];
} else {
return [self defaultCompare:other];
diff --git a/Firestore/core/src/firebase/firestore/util/comparison.cc b/Firestore/core/src/firebase/firestore/util/comparison.cc
index 5ac4c27..d1cdbfa 100644
--- a/Firestore/core/src/firebase/firestore/util/comparison.cc
+++ b/Firestore/core/src/firebase/firestore/util/comparison.cc
@@ -31,6 +31,12 @@ bool Comparator<absl::string_view>::operator()(
return left < right;
}
+bool Comparator<std::string>::operator()(const std::string& left,
+ const std::string& right) const {
+ // TODO(wilhuff): truncation aware comparison
+ return left < right;
+}
+
bool Comparator<double>::operator()(double left, double right) const {
// NaN sorts equal to itself and before any other number.
if (left < right) {
diff --git a/Firestore/core/src/firebase/firestore/util/comparison.h b/Firestore/core/src/firebase/firestore/util/comparison.h
index d7f4dfd..a7d7944 100644
--- a/Firestore/core/src/firebase/firestore/util/comparison.h
+++ b/Firestore/core/src/firebase/firestore/util/comparison.h
@@ -86,6 +86,11 @@ struct Comparator<absl::string_view> {
const absl::string_view& right) const;
};
+template <>
+struct Comparator<std::string> {
+ bool operator()(const std::string& left, const std::string& right) const;
+};
+
/** Compares two bools: false < true. */
template <>
struct Comparator<bool> : public std::less<bool> {};
diff --git a/Firestore/core/src/firebase/firestore/util/hard_assert_apple.mm b/Firestore/core/src/firebase/firestore/util/hard_assert_apple.mm
index 3324fe8..6abd324 100644
--- a/Firestore/core/src/firebase/firestore/util/hard_assert_apple.mm
+++ b/Firestore/core/src/firebase/firestore/util/hard_assert_apple.mm
@@ -32,8 +32,8 @@ void Fail(const char* file,
const int line,
const std::string& message) {
[[NSAssertionHandler currentHandler]
- handleFailureInFunction:WrapNSStringNoCopy(func)
- file:WrapNSStringNoCopy(file)
+ handleFailureInFunction:WrapNSString(func)
+ file:WrapNSString(file)
lineNumber:line
description:@"FIRESTORE INTERNAL ASSERTION FAILED: %s",
message.c_str()];