syncRaftEntry.c 3.5 KB
Newer Older
M
Minghao Li 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/*
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
 *
 * This program is free software: you can use, redistribute, and/or modify
 * it under the terms of the GNU Affero General Public License, version 3
 * or later ("AGPL"), as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

M
Minghao Li 已提交
16
#include "syncRaftEntry.h"
M
Minghao Li 已提交
17
#include "syncUtil.h"
M
Minghao Li 已提交
18

M
Minghao Li 已提交
19 20
SSyncRaftEntry* syncEntryBuild(uint32_t dataLen) {
  uint32_t        bytes = sizeof(SSyncRaftEntry) + dataLen;
M
Minghao Li 已提交
21 22 23 24
  SSyncRaftEntry* pEntry = malloc(bytes);
  assert(pEntry != NULL);
  memset(pEntry, 0, bytes);
  pEntry->bytes = bytes;
M
Minghao Li 已提交
25 26 27 28 29 30 31 32
  pEntry->dataLen = dataLen;
  return pEntry;
}

SSyncRaftEntry* syncEntryBuild2(SyncClientRequest* pMsg, SyncTerm term, SyncIndex index) {
  SSyncRaftEntry* pEntry = syncEntryBuild(pMsg->dataLen);
  assert(pEntry != NULL);

M
Minghao Li 已提交
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
  pEntry->msgType = pMsg->msgType;
  pEntry->originalRpcType = pMsg->originalRpcType;
  pEntry->seqNum = pMsg->seqNum;
  pEntry->isWeak = pMsg->isWeak;
  pEntry->term = term;
  pEntry->index = index;
  pEntry->dataLen = pMsg->dataLen;
  memcpy(pEntry->data, pMsg->data, pMsg->dataLen);

  return pEntry;
}

void syncEntryDestory(SSyncRaftEntry* pEntry) {
  if (pEntry != NULL) {
    free(pEntry);
  }
}

M
Minghao Li 已提交
51 52 53
char* syncEntrySerialize(const SSyncRaftEntry* pEntry, uint32_t* len) {
  char* buf = malloc(pEntry->bytes);
  assert(buf != NULL);
M
Minghao Li 已提交
54
  memcpy(buf, pEntry, pEntry->bytes);
M
Minghao Li 已提交
55 56 57 58
  if (len != NULL) {
    *len = pEntry->bytes;
  }
  return buf;
M
Minghao Li 已提交
59 60
}

M
Minghao Li 已提交
61 62 63 64
SSyncRaftEntry* syncEntryDeserialize(const char* buf, uint32_t len) {
  uint32_t        bytes = *((uint32_t*)buf);
  SSyncRaftEntry* pEntry = malloc(bytes);
  assert(pEntry != NULL);
M
Minghao Li 已提交
65 66
  memcpy(pEntry, buf, len);
  assert(len == pEntry->bytes);
M
Minghao Li 已提交
67
  return pEntry;
M
Minghao Li 已提交
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
}

cJSON* syncEntry2Json(const SSyncRaftEntry* pEntry) {
  char u64buf[128];

  cJSON* pRoot = cJSON_CreateObject();
  cJSON_AddNumberToObject(pRoot, "bytes", pEntry->bytes);
  cJSON_AddNumberToObject(pRoot, "msgType", pEntry->msgType);
  cJSON_AddNumberToObject(pRoot, "originalRpcType", pEntry->originalRpcType);
  snprintf(u64buf, sizeof(u64buf), "%lu", pEntry->seqNum);
  cJSON_AddStringToObject(pRoot, "seqNum", u64buf);
  cJSON_AddNumberToObject(pRoot, "isWeak", pEntry->isWeak);
  snprintf(u64buf, sizeof(u64buf), "%lu", pEntry->term);
  cJSON_AddStringToObject(pRoot, "term", u64buf);
  snprintf(u64buf, sizeof(u64buf), "%lu", pEntry->index);
  cJSON_AddStringToObject(pRoot, "index", u64buf);
  cJSON_AddNumberToObject(pRoot, "dataLen", pEntry->dataLen);

M
Minghao Li 已提交
86 87 88 89 90 91 92 93 94
  char* s;
  s = syncUtilprintBin((char*)(pEntry->data), pEntry->dataLen);
  cJSON_AddStringToObject(pRoot, "data", s);
  free(s);

  s = syncUtilprintBin2((char*)(pEntry->data), pEntry->dataLen);
  cJSON_AddStringToObject(pRoot, "data2", s);
  free(s);

M
Minghao Li 已提交
95 96 97 98 99 100 101 102 103 104
  cJSON* pJson = cJSON_CreateObject();
  cJSON_AddItemToObject(pJson, "SSyncRaftEntry", pRoot);
  return pJson;
}

char* syncEntry2Str(const SSyncRaftEntry* pEntry) {
  cJSON* pJson = syncEntry2Json(pEntry);
  char*  serialized = cJSON_Print(pJson);
  cJSON_Delete(pJson);
  return serialized;
M
Minghao Li 已提交
105 106 107 108 109 110
}

void syncEntryPrint(const SSyncRaftEntry* pEntry) {
  char* s = syncEntry2Str(pEntry);
  sTrace("%s", s);
  free(s);
M
Minghao Li 已提交
111 112 113 114 115 116
}

void syncEntryPrint2(char* s, const SSyncRaftEntry* pEntry) {
  char* ss = syncEntry2Str(pEntry);
  sTrace("%s | %s", s, ss);
  free(ss);
M
Minghao Li 已提交
117
}