예제 #1
0
/**
 * @brief Serialize LogRecordHeader
 * @param output
 */
void TupleRecord::SerializeHeader(CopySerializeOutput &output) {
  // Record LogRecordType first
  output.WriteEnumInSingleByte(log_record_type);

  size_t start = output.Position();
  // then reserve 4 bytes for the header size
  output.WriteInt(0);

  output.WriteLong(db_oid);
  output.WriteLong(table_oid);
  output.WriteLong(txn_id);
  output.WriteLong(insert_location.block);
  output.WriteLong(insert_location.offset);
  output.WriteLong(delete_location.block);
  output.WriteLong(delete_location.offset);

  output.WriteIntAt(
      start, static_cast<int32_t>(output.Position() - start - sizeof(int32_t)));
}
예제 #2
0
/**
 * @brief Serialize given data
 * @return true if we serialize data otherwise false
 */
bool TransactionRecord::Serialize(CopySerializeOutput &output) {
  bool status = true;
  output.Reset();

  // First, write out the log record type
  output.WriteEnumInSingleByte(log_record_type);

  // Then reserve 4 bytes for the header size to be written later
  size_t start = output.Position();
  output.WriteInt(0);
  output.WriteLong(cid);

  // Write out the header now
  int32_t header_length =
      static_cast<int32_t>(output.Position() - start - sizeof(int32_t));
  output.WriteIntAt(start, header_length);

  message_length = output.Size();
  message = new char[message_length];
  PL_MEMCPY(message, output.Data(), message_length);

  return status;
}