From a441190635d494f128cf02e07566ae2003af4e08 Mon Sep 17 00:00:00 2001 From: zxu Date: Tue, 6 Feb 2018 13:51:11 -0500 Subject: Implement Firestore DatabaseInfo and port both Database{Id,Info} C++ to the iOS code (#738) * implement Firestore DatabaseInfo in C++ * temporary stash changes; blocking on the massive renaming of .m to .mm * add database_info_test to project * finish port DatabaseId and fix style, modular fixing DatabaseInfo * port DatabaseInfo * remove FSTDatabase{ID,Info} and their tests from project * fix unit test * use namespace alias * use namespace alias, leftover * address more changes * refactoring to use raw pointer instead of value for property * address changes * remove self-> * fix style * remove the name suffix Alloc * fix a bug --- .../src/firebase/firestore/core/CMakeLists.txt | 5 ++ .../src/firebase/firestore/core/database_info.cc | 36 ++++++++++ .../src/firebase/firestore/core/database_info.h | 79 ++++++++++++++++++++++ .../src/firebase/firestore/model/database_id.cc | 4 -- .../src/firebase/firestore/model/database_id.h | 25 ++++++- .../src/firebase/firestore/util/string_apple.h | 5 ++ .../test/firebase/firestore/core/CMakeLists.txt | 1 + .../firebase/firestore/core/database_info_test.cc | 48 +++++++++++++ .../firebase/firestore/model/database_id_test.cc | 2 +- 9 files changed, 197 insertions(+), 8 deletions(-) create mode 100644 Firestore/core/src/firebase/firestore/core/database_info.cc create mode 100644 Firestore/core/src/firebase/firestore/core/database_info.h create mode 100644 Firestore/core/test/firebase/firestore/core/database_info_test.cc (limited to 'Firestore/core') diff --git a/Firestore/core/src/firebase/firestore/core/CMakeLists.txt b/Firestore/core/src/firebase/firestore/core/CMakeLists.txt index a62985c..cf3cafe 100644 --- a/Firestore/core/src/firebase/firestore/core/CMakeLists.txt +++ b/Firestore/core/src/firebase/firestore/core/CMakeLists.txt @@ -15,6 +15,11 @@ cc_library( firebase_firestore_core SOURCES + database_info.cc + database_info.h target_id_generator.cc target_id_generator.h + DEPENDS + absl_strings + firebase_firestore_model ) diff --git a/Firestore/core/src/firebase/firestore/core/database_info.cc b/Firestore/core/src/firebase/firestore/core/database_info.cc new file mode 100644 index 0000000..b83da37 --- /dev/null +++ b/Firestore/core/src/firebase/firestore/core/database_info.cc @@ -0,0 +1,36 @@ +/* + * Copyright 2018 Google + * + * 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. + */ + +#include "Firestore/core/src/firebase/firestore/core/database_info.h" + +namespace firebase { +namespace firestore { +namespace core { + +DatabaseInfo::DatabaseInfo( + const firebase::firestore::model::DatabaseId& database_id, + const absl::string_view persistence_key, + const absl::string_view host, + bool ssl_enabled) + : database_id_(database_id), + persistence_key_(persistence_key), + host_(host), + ssl_enabled_(ssl_enabled) { +} + +} // namespace core +} // namespace firestore +} // namespace firebase diff --git a/Firestore/core/src/firebase/firestore/core/database_info.h b/Firestore/core/src/firebase/firestore/core/database_info.h new file mode 100644 index 0000000..2e1303e --- /dev/null +++ b/Firestore/core/src/firebase/firestore/core/database_info.h @@ -0,0 +1,79 @@ +/* + * Copyright 2018 Google + * + * 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. + */ + +#ifndef FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_CORE_DATABASE_INFO_H_ +#define FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_CORE_DATABASE_INFO_H_ + +#include + +#include "Firestore/core/src/firebase/firestore/model/database_id.h" +#include "absl/strings/string_view.h" + +namespace firebase { +namespace firestore { +namespace core { + +/** DatabaseInfo contains data about the database. */ +class DatabaseInfo { + public: +#if defined(__OBJC__) + // For objective-c++ initialization; to be removed after migration. + // Do NOT use in C++ code. + DatabaseInfo() = default; +#endif // defined(__OBJC__) + + /** + * Creates a new DatabaseInfo. + * + * @param database_id The project/database to use. + * @param persistence_key A unique identifier for this Firestore's local + * storage. Usually derived from -[FIRApp appName]. + * @param host The hostname of the datastore backend. + * @param ssl_enabled Whether to use SSL when connecting. + */ + DatabaseInfo(const firebase::firestore::model::DatabaseId& database_id, + const absl::string_view persistence_key, + const absl::string_view host, + bool ssl_enabled); + + const firebase::firestore::model::DatabaseId& database_id() const { + return database_id_; + } + + const std::string& persistence_key() const { + return persistence_key_; + } + + const std::string& host() const { + return host_; + } + + bool ssl_enabled() const { + return ssl_enabled_; + } + + private: + firebase::firestore::model::DatabaseId database_id_; + std::string persistence_key_; + std::string host_; + bool ssl_enabled_; +}; + +} // namespace core +} // namespace firestore +} // namespace firebase + +#endif // FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_CORE_DATABASE_INFO_H_ diff --git a/Firestore/core/src/firebase/firestore/model/database_id.cc b/Firestore/core/src/firebase/firestore/model/database_id.cc index af12d30..d7e8a85 100644 --- a/Firestore/core/src/firebase/firestore/model/database_id.cc +++ b/Firestore/core/src/firebase/firestore/model/database_id.cc @@ -31,10 +31,6 @@ DatabaseId::DatabaseId(const absl::string_view project_id, FIREBASE_ASSERT(!database_id.empty()); } -bool DatabaseId::IsDefaultDatabase() { - return database_id_ == kDefaultDatabaseId; -} - } // namespace model } // namespace firestore } // namespace firebase diff --git a/Firestore/core/src/firebase/firestore/model/database_id.h b/Firestore/core/src/firebase/firestore/model/database_id.h index 48c547c..648f982 100644 --- a/Firestore/core/src/firebase/firestore/model/database_id.h +++ b/Firestore/core/src/firebase/firestore/model/database_id.h @@ -17,6 +17,8 @@ #ifndef FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_MODEL_DATABASE_ID_H_ #define FIRESTORE_CORE_SRC_FIREBASE_FIRESTORE_MODEL_DATABASE_ID_H_ +#include + #include #include "absl/strings/string_view.h" @@ -31,6 +33,12 @@ class DatabaseId { /** The default name for "unset" database ID in resource names. */ static constexpr const char* kDefaultDatabaseId = "(default)"; +#if defined(__OBJC__) + // For objective-c++ initialization; to be removed after migration. + // Do NOT use in C++ code. + DatabaseId() = default; +#endif // defined(__OBJC__) + /** * Creates and returns a new DatabaseId. * @@ -49,13 +57,24 @@ class DatabaseId { } /** Whether this is the default database of the project. */ - bool IsDefaultDatabase(); + bool IsDefaultDatabase() const { + return database_id_ == kDefaultDatabaseId; + } + +#if defined(__OBJC__) + // For objective-c++ hash; to be removed after migration. + // Do NOT use in C++ code. + uint64_t Hash() const { + std::hash hash_fn; + return hash_fn(project_id_) * 31u + hash_fn(database_id_); + } +#endif // defined(__OBJC__) friend bool operator<(const DatabaseId& lhs, const DatabaseId& rhs); private: - const std::string project_id_; - const std::string database_id_; + std::string project_id_; + std::string database_id_; }; /** Compares against another DatabaseId. */ diff --git a/Firestore/core/src/firebase/firestore/util/string_apple.h b/Firestore/core/src/firebase/firestore/util/string_apple.h index 108ade7..fe2a487 100644 --- a/Firestore/core/src/firebase/firestore/util/string_apple.h +++ b/Firestore/core/src/firebase/firestore/util/string_apple.h @@ -37,6 +37,11 @@ inline NSString* WrapNSStringNoCopy(const char* c_str) { freeWhenDone:NO]; } +// Translates a string_view to the equivalent NSString without making a copy. +inline NSString* WrapNSStringNoCopy(const absl::string_view str) { + return WrapNSStringNoCopy(str.data()); +} + // Creates an absl::string_view wrapper for the contents of the given NSString. inline absl::string_view MakeStringView(NSString* str) { return absl::string_view( diff --git a/Firestore/core/test/firebase/firestore/core/CMakeLists.txt b/Firestore/core/test/firebase/firestore/core/CMakeLists.txt index 34993aa..5b4c55a 100644 --- a/Firestore/core/test/firebase/firestore/core/CMakeLists.txt +++ b/Firestore/core/test/firebase/firestore/core/CMakeLists.txt @@ -15,6 +15,7 @@ cc_test( firebase_firestore_core_test SOURCES + database_info_test.cc target_id_generator_test.cc DEPENDS firebase_firestore_core diff --git a/Firestore/core/test/firebase/firestore/core/database_info_test.cc b/Firestore/core/test/firebase/firestore/core/database_info_test.cc new file mode 100644 index 0000000..d865105 --- /dev/null +++ b/Firestore/core/test/firebase/firestore/core/database_info_test.cc @@ -0,0 +1,48 @@ +/* + * Copyright 2018 Google + * + * 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. + */ + +#include "Firestore/core/src/firebase/firestore/core/database_info.h" + +#include "gtest/gtest.h" + +namespace firebase { +namespace firestore { +namespace core { + +using firebase::firestore::model::DatabaseId; + +TEST(DatabaseInfo, Getter) { + DatabaseInfo info(DatabaseId("project id", "database id"), "key", + "http://host", true); + EXPECT_EQ(DatabaseId("project id", "database id"), info.database_id()); + EXPECT_EQ("key", info.persistence_key()); + EXPECT_EQ("http://host", info.host()); + EXPECT_TRUE(info.ssl_enabled()); +} + +TEST(DatabaseInfo, DefaultDatabase) { + DatabaseInfo info(DatabaseId("project id", DatabaseId::kDefaultDatabaseId), + "key", "http://host", false); + EXPECT_EQ("project id", info.database_id().project_id()); + EXPECT_EQ("(default)", info.database_id().database_id()); + EXPECT_EQ("key", info.persistence_key()); + EXPECT_EQ("http://host", info.host()); + EXPECT_FALSE(info.ssl_enabled()); +} + +} // namespace core +} // namespace firestore +} // namespace firebase diff --git a/Firestore/core/test/firebase/firestore/model/database_id_test.cc b/Firestore/core/test/firebase/firestore/model/database_id_test.cc index e9c9439..16b0e6b 100644 --- a/Firestore/core/test/firebase/firestore/model/database_id_test.cc +++ b/Firestore/core/test/firebase/firestore/model/database_id_test.cc @@ -32,7 +32,7 @@ TEST(DatabaseId, Constructor) { TEST(DatabaseId, DefaultDb) { DatabaseId id("p", DatabaseId::kDefaultDatabaseId); EXPECT_EQ("p", id.project_id()); - EXPECT_EQ(DatabaseId::kDefaultDatabaseId, id.database_id()); + EXPECT_EQ("(default)", id.database_id()); EXPECT_TRUE(id.IsDefaultDatabase()); } -- cgit v1.2.3