1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #ifndef CLOUD_SYNC_UTILS_H
16 #define CLOUD_SYNC_UTILS_H
17 
18 #include <cstdint>
19 #include <string>
20 #include "cloud/cloud_store_types.h"
21 #include "cloud_syncer.h"
22 #include "icloud_sync_storage_interface.h"
23 
24 namespace DistributedDB {
25 class CloudSyncUtils {
26 public:
27     static constexpr const int GID_INDEX = 0;
28     static constexpr const int PREFIX_INDEX = 1;
29     static constexpr const int STRATEGY_INDEX = 2;
30     static constexpr const int ASSETS_INDEX = 3;
31     static constexpr const int HASH_KEY_INDEX = 4;
32     static constexpr const int PRIMARY_KEY_INDEX = 5;
33     static constexpr const int TIMESTAMP_INDEX = 6;
34 
35     static int GetCloudPkVals(const VBucket &datum, const std::vector<std::string> &pkColNames, int64_t dataKey,
36         std::vector<Type> &cloudPkVals);
37 
38     static ChangeType OpTypeToChangeType(OpType strategy);
39 
40     static bool IsSinglePrimaryKey(const std::vector<std::string> &pKColNames);
41 
42     static void RemoveDataExceptExtendInfo(VBucket &datum, const std::vector<std::string> &pkColNames);
43 
44     static AssetOpType StatusToFlag(AssetStatus status);
45 
46     static void StatusToFlagForAsset(Asset &asset);
47 
48     static void StatusToFlagForAssets(Assets &assets);
49 
50     static void StatusToFlagForAssetsInRecord(const std::vector<Field> &fields, VBucket &record);
51 
52     static bool IsChangeDataEmpty(const ChangedData &changedData);
53 
54     static bool EqualInMsLevel(const Timestamp cmp, const Timestamp beCmp);
55 
56     static bool NeedSaveData(const LogInfo &localLogInfo, const LogInfo &cloudLogInfo);
57 
58     static int CheckParamValid(const std::vector<DeviceID> &devices, SyncMode mode);
59 
60     static LogInfo GetCloudLogInfo(VBucket &datum);
61 
62     static int SaveChangedDataByType(const VBucket &datum, ChangedData &changedData, const DataInfoWithLog &localInfo,
63         ChangeType type);
64 
65     static int CheckCloudSyncDataValid(const CloudSyncData &uploadData, const std::string &tableName, int64_t count);
66 
67     static void ClearCloudSyncData(CloudSyncData &uploadData);
68 
69     static int GetWaterMarkAndUpdateTime(std::vector<VBucket>& extend, Timestamp &waterMark);
70 
71     static bool CheckCloudSyncDataEmpty(const CloudSyncData &uploadData);
72 
73     static void ModifyCloudDataTime(VBucket &data);
74 
75     static int UpdateExtendTime(CloudSyncData &uploadData, const int64_t &count, uint64_t taskId,
76         Timestamp &waterMark);
77 
78     static void UpdateLocalCache(OpType opType, const LogInfo &cloudInfo,
79         const LogInfo &localInfo, std::map<std::string, LogInfo> &localLogInfoCache);
80 
81     static int SaveChangedData(ICloudSyncer::SyncParam &param, size_t dataIndex, const ICloudSyncer::DataInfo &dataInfo,
82         std::vector<std::pair<Key, size_t>> &deletedList);
83 
84     static void ClearWithoutData(ICloudSyncer::SyncParam &param);
85 
86     static bool IsSkipAssetsMissingRecord(const std::vector<VBucket> &extend);
87 
88     static int FillAssetIdToAssets(CloudSyncBatch &data, int errorCode, const CloudWaterType &type);
89 
90     static int FillAssetIdToAssetData(const Type &extend, Type &assetData);
91 
92     static void FillAssetIdToAssetsData(const Assets &extend, Assets &assets);
93 
94     static bool CheckIfContainsInsertAssets(const Type &assetData);
95 
96     static void UpdateAssetsFlag(CloudSyncData &uploadData);
97 
98     static OpType CalOpType(ICloudSyncer::SyncParam &param, size_t dataIndex);
99 
100     static CloudSyncer::CloudTaskInfo InitCompensatedSyncTaskInfo();
101 
102     static CloudSyncer::CloudTaskInfo InitCompensatedSyncTaskInfo(const CloudSyncOption &option,
103         const SyncProcessCallback &onProcess);
104 
105     static CloudSyncer::CloudTaskInfo InitCompensatedSyncTaskInfo(const CloudSyncer::CloudTaskInfo &oriTaskInfo);
106 private:
107     static void InsertOrReplaceChangedDataByType(ChangeType type, std::vector<Type> &pkVal,
108         ChangedData &changedData);
109 };
110 }
111 #endif // CLOUD_SYNC_UTILS_H
112