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