1 /*
2  * Copyright (c) 2021 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 
16 #ifndef ABILITY_SYNC_H
17 #define ABILITY_SYNC_H
18 
19 #include <cstdint>
20 #include <string>
21 
22 #include "db_ability.h"
23 #include "icommunicator.h"
24 #include "ikvdb_sync_interface.h"
25 #include "isync_task_context.h"
26 #include "parcel.h"
27 #ifdef RELATIONAL_STORE
28 #include "ischema.h"
29 #endif
30 #include "schema_negotiate.h"
31 
32 namespace DistributedDB {
33 class AbilitySyncRequestPacket {
34 public:
35     AbilitySyncRequestPacket();
36     ~AbilitySyncRequestPacket();
37 
38     void SetProtocolVersion(uint32_t protocolVersion);
39     uint32_t GetProtocolVersion() const;
40 
41     void SetSendCode(int32_t sendCode);
42     int32_t GetSendCode() const;
43 
44     void SetSoftwareVersion(uint32_t swVersion);
45     uint32_t GetSoftwareVersion() const;
46 
47     void SetSchema(const std::string &schema);
48     std::string GetSchema() const;
49 
50     void SetSchemaType(uint32_t schemaType);
51     uint32_t GetSchemaType() const;
52 
53     void SetSecLabel(int32_t secLabel);
54     int32_t GetSecLabel() const;
55 
56     void SetSecFlag(int32_t secFlag);
57     int32_t GetSecFlag() const;
58 
59     void SetDbCreateTime(uint64_t dbCreateTime);
60     uint64_t GetDbCreateTime() const;
61 
62     uint32_t CalculateLen() const;
63 
64     DbAbility GetDbAbility() const;
65 
66     void SetDbAbility(const DbAbility &dbAbility);
67 
68     void SetSchemaVersion(uint64_t schemaVersion);
69 
70     uint64_t GetSchemaVersion() const;
71 
72 private:
73     uint32_t protocolVersion_;
74     int32_t sendCode_;
75     uint32_t softwareVersion_;
76     std::string schema_;
77     int32_t secLabel_;
78     int32_t secFlag_;
79     uint32_t schemaType_;
80     uint64_t dbCreateTime_;
81     DbAbility dbAbility_;
82     uint64_t schemaVersion_;
83 };
84 
85 class AbilitySyncAckPacket {
86 public:
87     AbilitySyncAckPacket();
88     ~AbilitySyncAckPacket();
89 
90     void SetProtocolVersion(uint32_t protocolVersion);
91     uint32_t GetProtocolVersion() const;
92 
93     void SetSoftwareVersion(uint32_t swVersion);
94     uint32_t GetSoftwareVersion() const;
95 
96     void SetAckCode(int32_t ackCode);
97     int32_t GetAckCode() const;
98 
99     void SetSchema(const std::string &schema);
100     std::string GetSchema() const;
101 
102     void SetSchemaType(uint32_t schemaType);
103     uint32_t GetSchemaType() const;
104 
105     void SetSecLabel(int32_t secLabel);
106     int32_t GetSecLabel() const;
107 
108     void SetSecFlag(int32_t secFlag);
109     int32_t GetSecFlag() const;
110 
111     void SetPermitSync(uint32_t permitSync);
112     uint32_t GetPermitSync() const;
113 
114     void SetRequirePeerConvert(uint32_t requirePeerConvert);
115     uint32_t GetRequirePeerConvert() const;
116 
117     void SetDbCreateTime(uint64_t dbCreateTime);
118     uint64_t GetDbCreateTime() const;
119 
120     uint32_t CalculateLen() const;
121 
122     DbAbility GetDbAbility() const;
123 
124     void SetDbAbility(const DbAbility &dbAbility);
125 
126     void SetSchemaVersion(uint64_t schemaVersion);
127 
128     uint64_t GetSchemaVersion() const;
129 
130     void SetRelationalSyncOpinion(const RelationalSyncOpinion &relationalSyncOpinion);
131 
132     RelationalSyncOpinion GetRelationalSyncOpinion() const;
133 
134 private:
135     uint32_t protocolVersion_;
136     uint32_t softwareVersion_;
137     int32_t ackCode_;
138     std::string schema_;
139     int32_t secLabel_;
140     int32_t secFlag_;
141     uint32_t schemaType_;
142     uint32_t permitSync_;
143     uint32_t requirePeerConvert_;
144     uint64_t dbCreateTime_;
145     uint64_t schemaVersion_;
146     DbAbility dbAbility_;
147     RelationalSyncOpinion relationalSyncOpinion_;
148 };
149 
150 class AbilitySync {
151 public:
152     static const int CHECK_SUCCESS = 0;
153     static const int LAST_NOTIFY = 0xfe;
154     AbilitySync();
155     ~AbilitySync();
156 
157     // Start Ability Sync
158     int SyncStart(uint32_t sessionId, uint32_t sequenceId, uint16_t remoteCommunicatorVersion,
159         const CommErrHandler &handler = nullptr, const ISyncTaskContext *context = nullptr);
160 
161     int Initialize(ICommunicator *inCommunicator, ISyncInterface *inStorage,
162         const std::shared_ptr<Metadata> &inMetadata, const std::string &deviceId);
163 
164     int AckRecv(const Message *message, ISyncTaskContext *context);
165 
166     int RequestRecv(const Message *message, ISyncTaskContext *context);
167 
168     int AckNotifyRecv(const Message *message, ISyncTaskContext *context);
169 
170     bool GetAbilitySyncFinishedStatus() const;
171 
172     void SetAbilitySyncFinishedStatus(bool syncFinished, ISyncTaskContext &context);
173 
174     void InitAbilitySyncFinishStatus(ISyncTaskContext &context);
175 
176     static int RegisterTransformFunc();
177 
178     static uint32_t CalculateLen(const Message *inMsg);
179 
180     static int Serialization(uint8_t *buffer, uint32_t length, const Message *inMsg); // register to communicator
181 
182     static int DeSerialization(const uint8_t *buffer, uint32_t length, Message *inMsg); // register to communicator
183 
184 private:
185     static int RequestPacketSerialization(uint8_t *buffer, uint32_t length, const Message *inMsg);
186 
187     static int AckPacketSerialization(uint8_t *buffer, uint32_t length, const Message *inMsg);
188 
189     static int RequestPacketDeSerialization(const uint8_t *buffer, uint32_t length, Message *inMsg);
190 
191     static int AckPacketDeSerialization(const uint8_t *buffer, uint32_t length, Message *inMsg);
192 
193     static int RequestPacketCalculateLen(const Message *inMsg, uint32_t &len);
194 
195     static int AckPacketCalculateLen(const Message *inMsg, uint32_t &len);
196 
197     static int RequestPacketDeSerializationTailPart(Parcel &parcel, AbilitySyncRequestPacket *packet,
198         uint32_t version);
199 
200     static int AckPacketDeSerializationTailPart(Parcel &parcel, AbilitySyncAckPacket *packet, uint32_t version);
201 
202     bool SecLabelCheck(const AbilitySyncRequestPacket *packet) const;
203 
204     static void HandleVersionV3RequestParam(const AbilitySyncRequestPacket *packet, ISyncTaskContext *context);
205 
206     static void HandleVersionV3AckSecOptionParam(const AbilitySyncAckPacket *packet,
207         ISyncTaskContext *context);
208 
209     int HandleVersionV3AckSchemaParam(const AbilitySyncAckPacket *recvPacket,
210         AbilitySyncAckPacket &sendPacket,  ISyncTaskContext *context, bool sendOpinion,
211         std::pair<bool, bool> &schemaSyncStatus);
212 
213     int HandleKvAckSchemaParam(const AbilitySyncAckPacket *recvPacket,
214         ISyncTaskContext *context, AbilitySyncAckPacket &sendPacket, std::pair<bool, bool> &schemaSyncStatus);
215 
216     int HandleRelationAckSchemaParam(const AbilitySyncAckPacket *recvPacket,
217         AbilitySyncAckPacket &sendPacket, ISyncTaskContext *context, bool sendOpinion,
218         std::pair<bool, bool> &schemaSyncStatus);
219 
220     void GetPacketSecOption(const ISyncTaskContext *context, SecurityOption &option) const;
221 
222     int SetAbilityRequestBodyInfo(uint16_t remoteCommunicatorVersion, const ISyncTaskContext *context,
223         AbilitySyncRequestPacket &packet) const;
224 
225     int SetAbilityAckBodyInfo(const ISyncTaskContext *context, int ackCode, bool isAckNotify,
226         AbilitySyncAckPacket &ackPacket) const;
227 
228     static void SetAbilityAckSchemaInfo(AbilitySyncAckPacket &ackPacket, const ISchema &schemaObj);
229 
230     static void SetAbilityAckSyncOpinionInfo(AbilitySyncAckPacket &ackPacket, SyncOpinion localOpinion);
231 
232     static int GetDbAbilityInfo(DbAbility &dbAbility);
233 
234     int AckMsgCheck(const Message *message, ISyncTaskContext *context) const;
235 
236     bool IsSingleKvVer() const;
237 
238     bool IsSingleRelationalVer() const;
239 
240     int SendAck(const ISyncTaskContext *context, const Message *message, int ackCode, bool isAckNotify,
241         AbilitySyncAckPacket &ackPacket);
242 
243     int SendAckWithEmptySchema(const ISyncTaskContext *context, const Message *message, int ackCode, bool isAckNotify);
244 
245     int SendAck(const Message *inMsg, const AbilitySyncAckPacket &ackPacket, bool isAckNotify);
246 
247     int HandleRequestRecv(const Message *message, ISyncTaskContext *context, bool isCompatible);
248 
249     SyncOpinion MakeKvSyncOpinion(const AbilitySyncRequestPacket *packet, const std::string &remoteSchema,
250         ISyncTaskContext *context);
251 
252     RelationalSyncOpinion MakeRelationSyncOpinion(const AbilitySyncRequestPacket *packet,
253         const std::string &remoteSchema) const;
254 
255     int AckRecvWithHighVersion(const Message *message, ISyncTaskContext *context, const AbilitySyncAckPacket *packet);
256 
257     void InitRemoteDBAbility(ISyncTaskContext &context);
258 
259     void RecordAbilitySyncFinish(uint64_t remoteSchemaVersion, ISyncTaskContext &context);
260 
261     static int32_t TransformSecLabelIfNeed(int32_t originLabel, int targetLabel);
262 
263     static bool IsBothKvAndOptAbilitySync(uint32_t remoteVersion, SchemaType localType, uint8_t remoteType);
264 
265     ICommunicator *communicator_;
266     ISyncInterface *storageInterface_;
267     std::shared_ptr<Metadata> metadata_;
268     std::string deviceId_;
269     bool syncFinished_;
270 };
271 } // namespace DistributedDB
272 #endif // ABILITY_SYNC_H
273