代码拉取完成,页面将自动刷新
diff --git a/frameworks/libs/distributeddb/interfaces/src/relational/relational_sync_able_storage.h b/frameworks/libs/distributeddb/interfaces/src/relational/relational_sync_able_storage.h
index 012ba84c7..777caa77e 100644
--- a/frameworks/libs/distributeddb/interfaces/src/relational/relational_sync_able_storage.h
+++ b/frameworks/libs/distributeddb/interfaces/src/relational/relational_sync_able_storage.h
@@ -62,6 +62,8 @@ public:
// Get meta data associated with the given key.
int GetMetaData(const Key &key, Value &value) const override;
+ int GetMetaDataByPrefixKey(const Key &keyPrefix, std::map<Key, Value> &data) const override;
+
// Put meta data as a key-value entry.
int PutMetaData(const Key &key, const Value &value) override;
diff --git a/frameworks/libs/distributeddb/storage/include/isync_interface.h b/frameworks/libs/distributeddb/storage/include/isync_interface.h
index 4cabb6b10..6a74a50c2 100644
--- a/frameworks/libs/distributeddb/storage/include/isync_interface.h
+++ b/frameworks/libs/distributeddb/storage/include/isync_interface.h
@@ -54,6 +54,8 @@ public:
// Get meta data associated with the given key.
virtual int GetMetaData(const Key &key, Value &value) const = 0;
+ virtual int GetMetaDataByPrefixKey(const Key &keyPrefix, std::map<Key, Value> &data) const = 0;
+
// Put meta data as a key-value entry.
virtual int PutMetaData(const Key &key, const Value &value, bool isInTransaction) = 0;
diff --git a/frameworks/libs/distributeddb/storage/src/gaussdb_rd/rd_single_ver_natural_store.cpp b/frameworks/libs/distributeddb/storage/src/gaussdb_rd/rd_single_ver_natural_store.cpp
index 63dea2b08..be4d48aeb 100644
--- a/frameworks/libs/distributeddb/storage/src/gaussdb_rd/rd_single_ver_natural_store.cpp
+++ b/frameworks/libs/distributeddb/storage/src/gaussdb_rd/rd_single_ver_natural_store.cpp
@@ -198,6 +198,11 @@ int RdSingleVerNaturalStore::GetMetaData(const Key &key, Value &value) const
return -E_NOT_SUPPORT;
}
+int RdSingleVerNaturalStore::GetMetaDataByPrefixKey(const Key &keyPrefix, std::map<Key, Value> &data) const
+{
+ return -E_NOT_SUPPORT;
+}
+
int RdSingleVerNaturalStore::PutMetaData(const Key &key, const Value &value, bool isInTransaction)
{
return -E_NOT_SUPPORT;
diff --git a/frameworks/libs/distributeddb/storage/src/gaussdb_rd/rd_single_ver_natural_store.h b/frameworks/libs/distributeddb/storage/src/gaussdb_rd/rd_single_ver_natural_store.h
index 0fbfe8968..8bca78c89 100644
--- a/frameworks/libs/distributeddb/storage/src/gaussdb_rd/rd_single_ver_natural_store.h
+++ b/frameworks/libs/distributeddb/storage/src/gaussdb_rd/rd_single_ver_natural_store.h
@@ -60,6 +60,8 @@ public:
int GetMetaData(const Key &key, Value &value) const override;
+ int GetMetaDataByPrefixKey(const Key &keyPrefix, std::map<Key, Value> &data) const override;
+
int PutMetaData(const Key &key, const Value &value, bool isInTransaction) override;
// Delete multiple meta data records in a transaction.
diff --git a/frameworks/libs/distributeddb/storage/src/relational/relational_sync_able_storage.cpp b/frameworks/libs/distributeddb/storage/src/relational/relational_sync_able_storage.cpp
index 57335c959..b7da21ae8 100644
--- a/frameworks/libs/distributeddb/storage/src/relational/relational_sync_able_storage.cpp
+++ b/frameworks/libs/distributeddb/storage/src/relational/relational_sync_able_storage.cpp
@@ -105,7 +105,6 @@ void RelationalSyncAbleStorage::GetMaxTimestamp(Timestamp ×tamp) const
TriggerCloseAutoLaunchConn(storageEngine_->GetProperties());
}
ReleaseHandle(handle);
- return;
}
int RelationalSyncAbleStorage::GetMaxTimestamp(const std::string &tableName, Timestamp ×tamp) const
@@ -179,9 +178,6 @@ void RelationalSyncAbleStorage::ReleaseHandle(SQLiteSingleVerRelationalStorageEx
// Get meta data associated with the given key.
int RelationalSyncAbleStorage::GetMetaData(const Key &key, Value &value) const
{
- if (storageEngine_ == nullptr) {
- return -E_INVALID_DB;
- }
if (key.size() > DBConstant::MAX_KEY_SIZE) {
return -E_INVALID_ARGS;
}
@@ -198,12 +194,27 @@ int RelationalSyncAbleStorage::GetMetaData(const Key &key, Value &value) const
return errCode;
}
+int RelationalSyncAbleStorage::GetMetaDataByPrefixKey(const Key &keyPrefix, std::map<Key, Value> &data) const
+{
+ if (keyPrefix.size() > DBConstant::MAX_KEY_SIZE) {
+ return -E_INVALID_ARGS;
+ }
+ int errCode = E_OK;
+ auto handle = GetHandle(false, errCode, OperatePerm::NORMAL_PERM);
+ if (handle == nullptr) {
+ return errCode;
+ }
+ errCode = handle->GetKvDataByPrefixKey(keyPrefix, data);
+ if (errCode != E_OK && errCode != -E_NOT_FOUND) {
+ TriggerCloseAutoLaunchConn(storageEngine_->GetProperties());
+ }
+ ReleaseHandle(handle);
+ return errCode;
+}
+
// Put meta data as a key-value entry.
int RelationalSyncAbleStorage::PutMetaData(const Key &key, const Value &value)
{
- if (storageEngine_ == nullptr) {
- return -E_INVALID_DB;
- }
int errCode = E_OK;
auto *handle = GetHandle(true, errCode, OperatePerm::NORMAL_PERM);
if (handle == nullptr) {
@@ -260,9 +271,6 @@ int RelationalSyncAbleStorage::PutMetaData(const Key &key, const Value &value, b
// Delete multiple meta data records in a transaction.
int RelationalSyncAbleStorage::DeleteMetaData(const std::vector<Key> &keys)
{
- if (storageEngine_ == nullptr) {
- return -E_INVALID_DB;
- }
for (const auto &key : keys) {
if (key.empty() || key.size() > DBConstant::MAX_KEY_SIZE) {
return -E_INVALID_ARGS;
@@ -290,9 +298,6 @@ int RelationalSyncAbleStorage::DeleteMetaData(const std::vector<Key> &keys)
// Delete multiple meta data records with key prefix in a transaction.
int RelationalSyncAbleStorage::DeleteMetaDataByPrefixKey(const Key &keyPrefix) const
{
- if (storageEngine_ == nullptr) {
- return -E_INVALID_DB;
- }
if (keyPrefix.empty() || keyPrefix.size() > DBConstant::MAX_KEY_SIZE) {
return -E_INVALID_ARGS;
}
@@ -315,9 +320,6 @@ int RelationalSyncAbleStorage::DeleteMetaDataByPrefixKey(const Key &keyPrefix) c
// Get all meta data keys.
int RelationalSyncAbleStorage::GetAllMetaKeys(std::vector<Key> &keys) const
{
- if (storageEngine_ == nullptr) {
- return -E_INVALID_DB;
- }
int errCode = E_OK;
auto *handle = GetHandle(true, errCode, OperatePerm::NORMAL_PERM);
if (handle == nullptr) {
diff --git a/frameworks/libs/distributeddb/storage/src/sqlite/relational/sqlite_single_ver_relational_storage_executor.cpp b/frameworks/libs/distributeddb/storage/src/sqlite/relational/sqlite_single_ver_relational_storage_executor.cpp
index 739036bb6..8879e9ff9 100644
--- a/frameworks/libs/distributeddb/storage/src/sqlite/relational/sqlite_single_ver_relational_storage_executor.cpp
+++ b/frameworks/libs/distributeddb/storage/src/sqlite/relational/sqlite_single_ver_relational_storage_executor.cpp
@@ -703,6 +703,13 @@ int SQLiteSingleVerRelationalStorageExecutor::GetKvData(const Key &key, Value &v
return SQLiteRelationalUtils::GetKvData(dbHandle_, isMemDb_, key, value);
}
+int SQLiteSingleVerRelationalStorageExecutor::GetKvDataByPrefixKey(const Key &keyPrefix,
+ std::map<Key, Value> &data) const
+{
+ std::string metaTableName = std::string(DBConstant::RELATIONAL_PREFIX) + "metadata";
+ return SqliteMetaExecutor::GetMetaDataByPrefixKey(dbHandle_, isMemDb_, metaTableName, keyPrefix, data);
+}
+
int SQLiteSingleVerRelationalStorageExecutor::PutKvData(const Key &key, const Value &value) const
{
return SQLiteRelationalUtils::PutKvData(dbHandle_, isMemDb_, key, value);
diff --git a/frameworks/libs/distributeddb/storage/src/sqlite/relational/sqlite_single_ver_relational_storage_executor.h b/frameworks/libs/distributeddb/storage/src/sqlite/relational/sqlite_single_ver_relational_storage_executor.h
index dab7b6474..8256f75d4 100644
--- a/frameworks/libs/distributeddb/storage/src/sqlite/relational/sqlite_single_ver_relational_storage_executor.h
+++ b/frameworks/libs/distributeddb/storage/src/sqlite/relational/sqlite_single_ver_relational_storage_executor.h
@@ -80,6 +80,7 @@ public:
// operation of meta data
int GetKvData(const Key &key, Value &value) const;
+ int GetKvDataByPrefixKey(const Key &keyPrefix, std::map<Key, Value> &data) const;
int PutKvData(const Key &key, const Value &value) const;
int DeleteMetaData(const std::vector<Key> &keys) const;
int DeleteMetaDataByPrefixKey(const Key &keyPrefix) const;
diff --git a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_meta_executor.cpp b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_meta_executor.cpp
index e9f2e26b3..9cf71499d 100644
--- a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_meta_executor.cpp
+++ b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_meta_executor.cpp
@@ -111,4 +111,45 @@ int SqliteMetaExecutor::GetExistsDevicesFromMeta(sqlite3 *dbHandle, MetaMode met
}
return errCode;
}
+
+int SqliteMetaExecutor::GetMetaDataByPrefixKey(sqlite3 *dbHandle, bool isMemDb, const std::string &metaTableName,
+ const Key &keyPrefix, std::map<Key, Value> &data)
+{
+ std::string sql = "SELECT key,value FROM " + metaTableName + " WHERE key >= ? AND key <= ?;";
+ sqlite3_stmt *statement = nullptr;
+ int errCode = SQLiteUtils::GetStatement(dbHandle, sql, statement);
+ if (errCode != E_OK) {
+ LOGE("[SqliteMetaExecutor][GetMetaDataByPrefixKey] Get statement failed:%d", errCode);
+ return errCode;
+ }
+
+ errCode = SQLiteUtils::BindPrefixKey(statement, 1, keyPrefix); // 1 is first arg.
+ if (errCode != E_OK) {
+ LOGE("[SqliteMetaExecutor][GetMetaDataByPrefixKey] Bind prefix key failed:%d", errCode);
+ return SQLiteUtils::ProcessStatementErrCode(statement, true, errCode);
+ }
+ do {
+ errCode = SQLiteUtils::StepWithRetry(statement, isMemDb);
+ if (errCode != SQLiteUtils::MapSQLiteErrno(SQLITE_ROW)) {
+ break;
+ }
+ Key key;
+ errCode = SQLiteUtils::GetColumnBlobValue(statement, 0, key); // 0 is key.
+ if (errCode != E_OK) {
+ LOGE("[SqliteMetaExecutor][GetMetaDataByPrefixKey] Get key failed:%d", errCode);
+ return SQLiteUtils::ProcessStatementErrCode(statement, true, errCode);
+ }
+ Value value;
+ errCode = SQLiteUtils::GetColumnBlobValue(statement, 1, value); // 1 is value.
+ if (errCode != E_OK) {
+ LOGE("[SqliteMetaExecutor][GetMetaDataByPrefixKey] Get value failed:%d", errCode);
+ return SQLiteUtils::ProcessStatementErrCode(statement, true, errCode);
+ }
+ data[key] = value;
+ } while (true);
+ if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) {
+ errCode = E_OK;
+ }
+ return SQLiteUtils::ProcessStatementErrCode(statement, true, errCode);
+}
}
\ No newline at end of file
diff --git a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_meta_executor.h b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_meta_executor.h
index f2890e7b4..0fcd3f350 100644
--- a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_meta_executor.h
+++ b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_meta_executor.h
@@ -33,6 +33,9 @@ public:
static int GetExistsDevicesFromMeta(sqlite3 *dbHandle, MetaMode metaMode,
bool isMemDb, std::set<std::string> &devices);
+
+ static int GetMetaDataByPrefixKey(sqlite3 *dbHandle, bool isMemDb, const std::string &metaTableName,
+ const Key &keyPrefix, std::map<Key, Value> &data);
private:
static constexpr const char *SELECT_ATTACH_META_KEYS_BY_PREFIX =
"SELECT key FROM meta.meta_data where key like ?;";
diff --git a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_natural_store.cpp b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_natural_store.cpp
index 7476c7911..b45cd961d 100644
--- a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_natural_store.cpp
+++ b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_natural_store.cpp
@@ -549,6 +549,31 @@ int SQLiteSingleVerNaturalStore::GetMetaData(const Key &key, Value &value) const
return errCode;
}
+int SQLiteSingleVerNaturalStore::GetMetaDataByPrefixKey(const Key &keyPrefix, std::map<Key, Value> &data) const
+{
+ if (storageEngine_ == nullptr) {
+ return -E_INVALID_DB;
+ }
+ if (keyPrefix.size() > DBConstant::MAX_KEY_SIZE) {
+ return -E_INVALID_ARGS;
+ }
+
+ int errCode = E_OK;
+ SecurityOption option;
+ (void)GetSecurityOption(option);
+ bool isWrite = (option.securityLabel >= S3) && (option.securityFlag == SECE);
+ // meta in S3 SECE open meta.db, should use write handle
+ auto handle = GetHandle(isWrite, errCode);
+ if (handle == nullptr) {
+ return errCode;
+ }
+
+ errCode = handle->GetMetaDataByPrefixKey(keyPrefix, data);
+ ReleaseHandle(handle);
+ HeartBeatForLifeCycle();
+ return errCode;
+}
+
int SQLiteSingleVerNaturalStore::PutMetaData(const Key &key, const Value &value, bool isInTransaction)
{
(void)isInTransaction;
diff --git a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_natural_store.h b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_natural_store.h
index 82bb7045c..dd0bffdcb 100644
--- a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_natural_store.h
+++ b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_natural_store.h
@@ -65,6 +65,8 @@ public:
int GetMetaData(const Key &key, Value &value) const override;
+ int GetMetaDataByPrefixKey(const Key &keyPrefix, std::map<Key, Value> &data) const override;
+
int PutMetaData(const Key &key, const Value &value, bool isInTransaction) override;
// Delete multiple meta data records in a transaction.
diff --git a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_storage_executor.cpp b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_storage_executor.cpp
index a99a3c625..3cc5c82bd 100644
--- a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_storage_executor.cpp
+++ b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_storage_executor.cpp
@@ -17,7 +17,6 @@
#include <algorithm>
-#include "cloud/cloud_store_types.h"
#include "db_constant.h"
#include "db_common.h"
#include "db_errno.h"
@@ -238,7 +237,6 @@ int SQLiteSingleVerStorageExecutor::GetKvDataByHashKey(const Key &hashKey, Singl
result.origDevice = std::string(origDevVect.begin(), origDevVect.end());
} else if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) {
errCode = -E_NOT_FOUND;
- goto END;
}
END:
diff --git a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_storage_executor.h b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_storage_executor.h
index 1192a2e62..16c1022c1 100644
--- a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_storage_executor.h
+++ b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_storage_executor.h
@@ -54,6 +54,8 @@ public:
// Get all the meta keys.
int GetAllMetaKeys(std::vector<Key> &keys) const;
+ int GetMetaDataByPrefixKey(const Key &keyPrefix, std::map<Key, Value> &data) const;
+
int GetAllSyncedEntries(const std::string &hashDev, std::vector<Entry> &entries) const;
int SaveSyncDataItem(DataItem &dataItem, const DeviceInfo &deviceInfo,
diff --git a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_storage_executor_extend.cpp b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_storage_executor_extend.cpp
index ba67ca710..d50dbb408 100644
--- a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_storage_executor_extend.cpp
+++ b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_storage_executor_extend.cpp
@@ -487,4 +487,11 @@ int SQLiteSingleVerStorageExecutor::ClearCloudWatermark()
{
return CloudExcuteRemoveOrUpdate(REMOVE_CLOUD_ALL_HWM_DATA_SQL, "", "", true);
}
+
+int SQLiteSingleVerStorageExecutor::GetMetaDataByPrefixKey(const Key &keyPrefix, std::map<Key, Value> &data) const
+{
+
+ std::string metaTableName = "meta_data";
+ return SqliteMetaExecutor::GetMetaDataByPrefixKey(dbHandle_, isMemDb_, metaTableName, keyPrefix, data);
+}
} // namespace DistributedDB
diff --git a/frameworks/libs/distributeddb/syncer/src/device/meta_data.cpp b/frameworks/libs/distributeddb/syncer/src/device/meta_data.cpp
index 0d6586f9d..e6e6d68fb 100644
--- a/frameworks/libs/distributeddb/syncer/src/device/meta_data.cpp
+++ b/frameworks/libs/distributeddb/syncer/src/device/meta_data.cpp
@@ -117,12 +117,38 @@ void Metadata::GetPeerWaterMark(const DeviceID &deviceId, const DeviceID &userId
int Metadata::SavePeerWaterMark(const DeviceID &deviceId, const DeviceID &userId, uint64_t inValue, bool isNeedHash)
{
- MetaDataValue metadata;
+ std::map<Key, MetaDataValue> metadata;
std::lock_guard<std::mutex> lockGuard(metadataLock_);
- GetMetaDataValue(deviceId, userId, metadata, isNeedHash);
- metadata.peerWaterMark = inValue;
- LOGD("Metadata::SavePeerWaterMark = %" PRIu64, inValue);
- return SaveMetaDataValue(deviceId, userId, metadata, isNeedHash);
+ int errCode = E_OK;
+ if (!userId.empty()) {
+ MetaDataValue oneMetadata;
+ GetMetaDataValue(deviceId, userId, oneMetadata, isNeedHash);
+ DeviceID hashId;
+ Key key;
+ GetHashDeviceId(deviceId, userId, hashId, isNeedHash);
+ DBCommon::StringToVector(hashId, key);
+ metadata[key] = oneMetadata;
+ } else {
+ errCode = GetMetaDataFromDBByPrefixKey(deviceId, isNeedHash, metadata);
+ if (errCode != E_OK) {
+ return errCode;
+ }
+ }
+
+ for (auto &oneMetadata : metadata) {
+ oneMetadata.second.peerWaterMark = inValue;
+ LOGD("Metadata::SavePeerWaterMark = %" PRIu64, inValue);
+ Value metadataValue;
+ errCode = SerializeMetaData(oneMetadata.second, metadataValue);
+ if (errCode != E_OK) {
+ return errCode;
+ }
+ errCode = SetMetadataToDb(oneMetadata.first, metadataValue);
+ if (errCode != E_OK) {
+ return errCode;
+ }
+ }
+ return E_OK;
}
int Metadata::SaveLocalTimeOffset(TimeOffset timeOffset, bool saveIntoDb)
@@ -260,6 +286,14 @@ int Metadata::GetMetadataFromDb(const std::vector<uint8_t> &key, std::vector<uin
return naturalStoragePtr_->GetMetaData(key, outValue);
}
+int Metadata::GetMetadataFromDbByPrefixKey(const Key &keyPrefix, std::map<Key, Value> &data) const
+{
+ if (naturalStoragePtr_ == nullptr) {
+ return -E_INVALID_DB;
+ }
+ return naturalStoragePtr_->GetMetaDataByPrefixKey(keyPrefix, data);
+}
+
int Metadata::SetMetadataToDb(const std::vector<uint8_t> &key, const std::vector<uint8_t> &inValue)
{
if (naturalStoragePtr_ == nullptr) {
@@ -972,6 +1006,37 @@ int Metadata::GetMetaDataValueFromDB(const Key &key, MetaDataValue &metaDataValu
return DeSerializeMetaData(value, metaDataValue);
}
+int Metadata::GetMetaDataFromDBByPrefixKey(const std::string &deviceId, bool isNeedHash,
+ std::map<Key, MetaDataValue> &metaData)
+{
+ DeviceID hashId;
+ Key keyPrefix;
+ GetHashDeviceId(deviceId, "", hashId, isNeedHash);
+ DBCommon::StringToVector(hashId, keyPrefix);
+
+ std::map<Key, Value> data;
+ int errCode = GetMetadataFromDbByPrefixKey(keyPrefix, data);
+ if (errCode != E_OK) {
+ if (errCode == -E_NOT_FOUND) {
+ MetaDataValue oneMetaData;
+ metaData[keyPrefix] = oneMetaData;
+ return E_OK;
+ }
+ LOGE("[Metadata] Get metadata from db by prefix key failed %d", errCode);
+ return errCode;
+ }
+ for (const auto &oneData : data) {
+ MetaDataValue metaDataValue;
+ errCode = DeSerializeMetaData(oneData.second, metaDataValue);
+ if (errCode != E_OK) {
+ LOGE("[Metadata] DeSerialize meta data failed %d", errCode);
+ return errCode;
+ }
+ metaData[oneData.first] = metaDataValue;
+ }
+ return E_OK;
+}
+
uint64_t Metadata::GetRemoteSoftwareVersion(const std::string &deviceId, const std::string &userId)
{
MetaDataValue metadata;
diff --git a/frameworks/libs/distributeddb/syncer/src/device/meta_data.h b/frameworks/libs/distributeddb/syncer/src/device/meta_data.h
index d152339bc..038747e68 100644
--- a/frameworks/libs/distributeddb/syncer/src/device/meta_data.h
+++ b/frameworks/libs/distributeddb/syncer/src/device/meta_data.h
@@ -196,6 +196,8 @@ private:
int GetMetadataFromDb(const std::vector<uint8_t> &key, std::vector<uint8_t> &outValue) const;
+ int GetMetadataFromDbByPrefixKey(const Key &keyPrefix, std::map<Key, Value> &data) const;
+
int SetMetadataToDb(const std::vector<uint8_t> &key, const std::vector<uint8_t> &inValue);
int64_t StringToLong(const std::vector<uint8_t> &value) const;
@@ -243,6 +245,8 @@ private:
MetaDataValue &metaDataValue);
int GetMetaDataValueFromDB(const Key &key, MetaDataValue &metaDataValue);
+ int GetMetaDataFromDBByPrefixKey(const std::string &deviceId, bool isNeedHash,
+ std::map<Key, MetaDataValue> &metaData);
// store localTimeOffset in ram; if change, should add a lock first, change here and metadata,
// then release lock
diff --git a/frameworks/libs/distributeddb/syncer/src/device/query_sync_water_mark_helper.cpp b/frameworks/libs/distributeddb/syncer/src/device/query_sync_water_mark_helper.cpp
index f740c1b9f..61b961abb 100644
--- a/frameworks/libs/distributeddb/syncer/src/device/query_sync_water_mark_helper.cpp
+++ b/frameworks/libs/distributeddb/syncer/src/device/query_sync_water_mark_helper.cpp
@@ -50,6 +50,14 @@ int QuerySyncWaterMarkHelper::GetMetadataFromDb(const std::vector<uint8_t> &key,
return storage_->GetMetaData(key, outValue);
}
+int QuerySyncWaterMarkHelper::GetMetadataByPrefixKeyFromDb(const Key &prefixKey, std::map<Key, Value> &data)
+{
+ if (storage_ == nullptr) {
+ return -E_INVALID_DB;
+ }
+ return storage_->GetMetaDataByPrefixKey(prefixKey, data);
+}
+
int QuerySyncWaterMarkHelper::SetMetadataToDb(const std::vector<uint8_t> &key, const std::vector<uint8_t> &inValue)
{
if (storage_ == nullptr) {
@@ -273,8 +281,8 @@ DeviceID QuerySyncWaterMarkHelper::GetHashQuerySyncDeviceId(const DeviceID &devi
DeviceSyncTarget deviceInfo(deviceId, userId);
if (deviceIdToHashQuerySyncIdMap_[deviceInfo].count(queryId) == 0) {
// do not modify this
- hashQuerySyncId = DBConstant::QUERY_SYNC_PREFIX_KEY + DBCommon::TransferHashString(deviceId) +
- DBConstant::USERID_PREFIX_KEY + userId + queryId;
+ hashQuerySyncId = DBConstant::QUERY_SYNC_PREFIX_KEY + DBCommon::TransferHashString(deviceId) + queryId +
+ DBConstant::USERID_PREFIX_KEY + userId;
deviceIdToHashQuerySyncIdMap_[deviceInfo][queryId] = hashQuerySyncId;
} else {
hashQuerySyncId = deviceIdToHashQuerySyncIdMap_[deviceInfo][queryId];
@@ -310,15 +318,31 @@ int QuerySyncWaterMarkHelper::SetRecvDeleteSyncWaterMark(const DeviceID &deviceI
const WaterMark &waterMark, bool isNeedHash)
{
std::string hashId = GetHashDeleteSyncDeviceId(deviceId, userId, isNeedHash);
- DeleteWaterMark deleteWaterMark;
// lock prevent different thread visit deleteSyncCache_
std::lock_guard<std::mutex> autoLock(deleteSyncLock_);
- int errCode = GetDeleteWaterMarkFromCache(hashId, deleteWaterMark);
+ int errCode = E_OK;
+ std::map<Key, DeleteWaterMark> deleteWaterMarks;
+ if (!userId.empty()) {
+ DeleteWaterMark deleteWaterMark;
+ Key dbKey;
+ DBCommon::StringToVector(hashId, dbKey);
+ errCode = GetDeleteWaterMarkFromCache(hashId, deleteWaterMark);
+ deleteWaterMark.recvWaterMark = waterMark;
+ deleteWaterMarks[dbKey] = deleteWaterMark;
+ } else {
+ errCode = GetDeleteWatersMarkFromDB(hashId, deleteWaterMarks);
+ }
if (errCode != E_OK) {
return errCode;
}
- deleteWaterMark.recvWaterMark = waterMark;
- return UpdateDeleteSyncCacheAndSave(hashId, deleteWaterMark);
+ for (auto &deleteWaterMark : deleteWaterMarks) {
+ deleteWaterMark.second.recvWaterMark = waterMark;
+ errCode = UpdateDeleteSyncCacheAndSave(hashId, deleteWaterMark.second);
+ if (errCode != E_OK) {
+ return errCode;
+ }
+ }
+ return E_OK;
}
int QuerySyncWaterMarkHelper::UpdateDeleteSyncCacheAndSave(const std::string &dbKey,
@@ -359,6 +383,34 @@ int QuerySyncWaterMarkHelper::GetDeleteWaterMarkFromDB(const DeviceID &hashDevic
return DeSerializeDeleteWaterMark(dbValue, deleteWaterMark);
}
+int QuerySyncWaterMarkHelper::GetDeleteWatersMarkFromDB(const DeviceID &hashId,
+ std::map<Key, DeleteWaterMark> &deleteWaterMarks)
+{
+ Key dbKeyPrefix;
+ DBCommon::StringToVector(hashId, dbKeyPrefix);
+ // search in db
+ std::map<Key, Value> dbData;
+ int errCode = GetMetadataByPrefixKeyFromDb(dbKeyPrefix, dbData);
+ if (errCode == -E_NOT_FOUND) {
+ DeleteWaterMark deleteWaterMark;
+ deleteWaterMarks[dbKeyPrefix] = deleteWaterMark;
+ return E_OK;
+ }
+ if (errCode != E_OK) {
+ return errCode;
+ }
+ // serialize value
+ for (const auto &oneDbData : dbData) {
+ DeleteWaterMark deleteWaterMark;
+ errCode = DeSerializeDeleteWaterMark(oneDbData.second, deleteWaterMark);
+ if (errCode != E_OK) {
+ return errCode;
+ }
+ deleteWaterMarks[oneDbData.first] = deleteWaterMark;
+ }
+ return E_OK;
+}
+
int QuerySyncWaterMarkHelper::SaveDeleteWaterMarkToDB(const DeviceID &hashDeviceId,
const DeleteWaterMark &deleteWaterMark)
{
@@ -497,12 +549,15 @@ int QuerySyncWaterMarkHelper::ResetRecvQueryWaterMark(const DeviceID &deviceId,
// lock prevent other thread modify queryWaterMark at this moment
std::lock_guard<std::mutex> autoLock(queryWaterMarkLock_);
std::string prefixKeyStr = DBConstant::QUERY_SYNC_PREFIX_KEY +
- (isNeedHash ? DBCommon::TransferHashString(deviceId) : deviceId) + DBConstant::USERID_PREFIX_KEY + userId;
+ (isNeedHash ? DBCommon::TransferHashString(deviceId) : deviceId);
if (!tableName.empty()) {
std::string hashTableName = DBCommon::TransferHashString(tableName);
std::string hexTableName = DBCommon::TransferStringToHex(hashTableName);
prefixKeyStr += hexTableName;
}
+ if (!userId.empty()) {
+ prefixKeyStr += DBConstant::USERID_PREFIX_KEY + userId;
+ }
// remove in db
Key prefixKey;
diff --git a/frameworks/libs/distributeddb/syncer/src/device/query_sync_water_mark_helper.h b/frameworks/libs/distributeddb/syncer/src/device/query_sync_water_mark_helper.h
index 76030463e..1e96e746f 100644
--- a/frameworks/libs/distributeddb/syncer/src/device/query_sync_water_mark_helper.h
+++ b/frameworks/libs/distributeddb/syncer/src/device/query_sync_water_mark_helper.h
@@ -89,6 +89,8 @@ private:
int GetMetadataFromDb(const std::vector<uint8_t> &key, std::vector<uint8_t> &outValue);
+ int GetMetadataByPrefixKeyFromDb(const Key &prefixKey, std::map<Key, Value> &data);
+
int SetMetadataToDb(const std::vector<uint8_t> &key, const std::vector<uint8_t> &inValue);
int DeleteMetaDataFromDB(const std::vector<Key> &keys) const;
@@ -127,6 +129,8 @@ private:
int GetDeleteWaterMarkFromDB(const DeviceID &hashDeviceId, DeleteWaterMark &deleteWaterMark);
+ int GetDeleteWatersMarkFromDB(const DeviceID &hashId, std::map<Key, DeleteWaterMark> &deleteWaterMarks);
+
// put queryWaterMark to lru cache_ and then save to db
int UpdateDeleteSyncCacheAndSave(const std::string &dbKey, const DeleteWaterMark &deleteWaterMark);
diff --git a/frameworks/libs/distributeddb/test/unittest/common/storage/cloud/distributeddb_cloud_meta_data_test.cpp b/frameworks/libs/distributeddb/test/unittest/common/storage/cloud/distributeddb_cloud_meta_data_test.cpp
index c96cb2f11..c5f5d0565 100644
--- a/frameworks/libs/distributeddb/test/unittest/common/storage/cloud/distributeddb_cloud_meta_data_test.cpp
+++ b/frameworks/libs/distributeddb/test/unittest/common/storage/cloud/distributeddb_cloud_meta_data_test.cpp
@@ -337,7 +337,7 @@ namespace {
std::vector<Key> keys;
EXPECT_EQ(obj.DeleteMetaData(keys), -E_INVALID_DB);
EXPECT_EQ(obj.GetAllMetaKeys(keys), -E_INVALID_DB);
- Key key;
+ Key key = {'k'};
Value value;
EXPECT_EQ(obj.GetMetaData(key, value), -E_INVALID_DB);
EXPECT_EQ(obj.PutMetaData(key, value), -E_INVALID_DB);
diff --git a/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_relational_ver_sync_db_interface.cpp b/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_relational_ver_sync_db_interface.cpp
index d2fea14c3..8c5d8f1e6 100644
--- a/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_relational_ver_sync_db_interface.cpp
+++ b/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_relational_ver_sync_db_interface.cpp
@@ -225,6 +225,19 @@ int VirtualRelationalVerSyncDBInterface::GetMetaData(const Key &key, Value &valu
return -E_NOT_FOUND;
}
+int VirtualRelationalVerSyncDBInterface::GetMetaDataByPrefixKey(const Key &keyPrefix, std::map<Key, Value> &data) const
+{
+ for (const auto &metadata : metadata_) {
+ if (metadata.first.size() < keyPrefix.size()) {
+ continue;
+ }
+ if (std::equal(keyPrefix.begin(), keyPrefix.end(), metadata.first.begin())) {
+ data[metadata.first] = metadata.second;
+ }
+ }
+ return data.empty() ? -E_NOT_FOUND : E_OK;
+}
+
int VirtualRelationalVerSyncDBInterface::PutMetaData(const Key &key, const Value &value, bool isInTransaction)
{
(void)isInTransaction;
diff --git a/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_relational_ver_sync_db_interface.h b/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_relational_ver_sync_db_interface.h
index d1ea9561b..6eab384b6 100644
--- a/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_relational_ver_sync_db_interface.h
+++ b/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_relational_ver_sync_db_interface.h
@@ -73,6 +73,8 @@ public:
int GetMetaData(const Key &key, Value &value) const override;
+ int GetMetaDataByPrefixKey(const Key &keyPrefix, std::map<Key, Value> &data) const override;
+
int PutMetaData(const Key &key, const Value &value, bool isInTransaction) override;
int DeleteMetaData(const std::vector<Key> &keys) override;
diff --git a/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_single_ver_sync_db_Interface.cpp b/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_single_ver_sync_db_Interface.cpp
index 8ca7d89a1..0266fecec 100644
--- a/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_single_ver_sync_db_Interface.cpp
+++ b/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_single_ver_sync_db_Interface.cpp
@@ -102,6 +102,22 @@ int VirtualSingleVerSyncDBInterface::GetMetaData(const Key &key, Value &value) c
return -E_NOT_FOUND;
}
+int VirtualSingleVerSyncDBInterface::GetMetaDataByPrefixKey(const Key &keyPrefix, std::map<Key, Value> &data) const
+{
+ if (readBusy_) {
+ return -E_BUSY;
+ }
+ for (const auto &metadata : metadata_) {
+ if (metadata.first.size() < keyPrefix.size()) {
+ continue;
+ }
+ if (std::equal(keyPrefix.begin(), keyPrefix.end(), metadata.first.begin())) {
+ data[metadata.first] = metadata.second;
+ }
+ }
+ return data.empty() ? -E_NOT_FOUND : E_OK;
+}
+
int VirtualSingleVerSyncDBInterface::PutMetaData(const Key &key, const Value &value, bool isInTransaction)
{
(void)isInTransaction;
diff --git a/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_single_ver_sync_db_Interface.h b/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_single_ver_sync_db_Interface.h
index 20927700b..0efa86284 100644
--- a/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_single_ver_sync_db_Interface.h
+++ b/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_single_ver_sync_db_Interface.h
@@ -54,6 +54,8 @@ public:
int GetMetaData(const Key& key, Value& value) const override;
+ int GetMetaDataByPrefixKey(const Key &keyPrefix, std::map<Key, Value> &data) const override;
+
int PutMetaData(const Key& key, const Value& value, bool isInTransaction) override;
int DeleteMetaData(const std::vector<Key> &keys) override;
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。