SWC-DB  v0.5.12 C++ documentations
SWC-DB© (Super Wide Column Database) - High Performance Scalable Database (https://github.com/kashirin-alex/swc-db)
Schema.h
Go to the documentation of this file.
1 /*
2  * SWC-DB© Copyright since 2019 Alex Kashirin <kashirin.alex@gmail.com>
3  * License details at <https://github.com/kashirin-alex/swc-db/#license>
4  */
5 
6 
7 #ifndef swcdb_common_Files_Schema_h
8 #define swcdb_common_Files_Schema_h
9 
10 
11 #include "swcdb/core/Checksum.h"
13 
14 
15 namespace SWC {
16 
18 namespace Common {
19 
20 namespace Files { namespace Schema {
21 
22 
23 const uint8_t HEADER_SIZE = 13;
24 const uint8_t HEADER_OFFSET_CHKSUM = 9;
25 const uint8_t VERSION = 1;
26 static const char schema_file[] = "schema.data";
27 
28 /* file-format:
29  header: i8(version), i32(data-len),
30  i32(data-checksum), i32(header-checksum)
31  data: schema-encoded
32 */
33 
34 std::string filepath(cid_t cid) {
35  std::string path(DB::RangeBase::get_column_path(cid));
36  path.reserve(path.length() + 1 + strlen(schema_file));
37  path.append("/");
38  path.append(schema_file);
39  return path;
40 }
41 
42 // REMOVE
43 
44 void remove(int &err, cid_t cid) {
45  Env::FsInterface::interface()->remove(err, filepath(cid));
46 }
47 
48 // SET
49 
50 void write(SWC::DynamicBuffer &dst_buf, const DB::Schema::Ptr& schema) {
51 
52  size_t sz = schema->encoded_length();
53  dst_buf.ensure(HEADER_SIZE + sz);
54 
56  Serialization::encode_i32(&dst_buf.ptr, sz);
57 
58  uint8_t* checksum_data_ptr = dst_buf.ptr;
59  Serialization::encode_i32(&dst_buf.ptr, 0);
60  uint8_t* checksum_header_ptr = dst_buf.ptr;
61  Serialization::encode_i32(&dst_buf.ptr, 0);
62 
63  const uint8_t* start_data_ptr = dst_buf.ptr;
64  schema->encode(&dst_buf.ptr);
65 
66  Core::checksum_i32(start_data_ptr, dst_buf.ptr, &checksum_data_ptr);
67  Core::checksum_i32(dst_buf.base, start_data_ptr, &checksum_header_ptr);
68 }
69 
70 void save(int &err, const DB::Schema::Ptr& schema, uint8_t replication=0) {
71  DynamicBuffer input;
72  write(input, schema);
73  StaticBuffer send_buf(input);
74 
76  err,
79  replication,
80  send_buf
81  );
82 }
83 
84 
85 // GET
86 
87 void load(int &err, const std::string& filepath, DB::Schema::Ptr& schema) {
88 
89  StaticBuffer read_buf;
90  Env::FsInterface::interface()->read(err, filepath, &read_buf);
91  if(err)
92  return;
93 
94  const uint8_t *ptr = read_buf.base;
95  size_t remain = read_buf.size;
96 
97  Serialization::decode_i8(&ptr, &remain); // int8_t version =
98  size_t sz = Serialization::decode_i32(&ptr, &remain);
99 
100  size_t chksum_data = Serialization::decode_i32(&ptr, &remain);
101 
103  Serialization::decode_i32(&ptr, &remain),
104  read_buf.base, HEADER_SIZE, HEADER_OFFSET_CHKSUM) ||
105  !Core::checksum_i32_chk(chksum_data, ptr, sz)) {
107  } else {
108  schema.reset(new DB::Schema(&ptr, &sz));
109  }
110 }
111 
112 DB::Schema::Ptr load(int &err, cid_t cid,
113  uint8_t replication, bool recover=true) {
114 
115  DB::Schema::Ptr schema = nullptr;
116  try{
117  load(err, filepath(cid), schema);
118  } catch(...) {
119  SWC_LOG_CURRENT_EXCEPTION("schema load");
120  schema = nullptr;
121  }
122 
123  if(!schema && err != Error::SERVER_SHUTTING_DOWN && recover) {
124  SWC_LOGF(LOG_WARN, "Missing Column(cid=" SWC_FMT_LU ") Schema", cid);
125 
126  schema = DB::Schema::make();
127  schema->cid = cid;
128 
130  err = Error::OK;
131  schema->col_name.append("SYS_");
133  schema->col_name.append("STATS");
134  schema->col_type = DB::Types::Column::SERIAL;
135  schema->col_seq = DB::Types::KeySeq::LEXIC;
136  schema->cell_ttl = 2419200; // default 4-weeks
137 
139  schema->col_name.append("DEFINE_LEXIC");
140  schema->col_type = DB::Types::Column::SERIAL;
141  schema->col_seq = DB::Types::KeySeq::LEXIC;
142 
143  } else if(cid == DB::Types::SystemColumn::SYS_RGR_DATA) {
144  schema->col_name.append("RGR_DATA");
145  schema->col_type = DB::Types::Column::PLAIN;
146  schema->col_seq = DB::Types::KeySeq::VOLUME;
147 
148  } else {
149  schema->col_type = DB::Types::Column::SERIAL;
150  schema->col_seq = DB::Types::SystemColumn::get_seq_type(cid);
151  schema->col_name.append(
152  DB::Types::SystemColumn::is_master(cid) ? "MASTER_": "META_");
153  schema->col_name.append(
154  DB::Types::to_string(schema->col_seq));
155  }
156 
157  } else {
158  // schema backups || instant create || throw ?
159  schema->col_name.append("noname_");
160  schema->col_name.append(std::to_string(cid));
161  }
162 
164  schema->print(
165  SWC_LOG_OSTREAM << "Missing Column(cid=" << cid << ") Schema set to ");
166  );
167  save(err, schema, replication);
168  }
169 
170  return schema;
171 }
172 
173 
174 void save_with_validation(int &err, const DB::Schema::Ptr& schema_save,
175  uint8_t replication) {
176  save(err, schema_save, replication); // ?tmp-file
177  if(err != Error::OK)
178  return;
179 
180  DB::Schema::Ptr schema_new = load(err, schema_save->cid, replication, false);
181  if(err != Error::OK)
182  return;
183 
184  if(!schema_new->equal(schema_save)) {
186  return;
187  }
188 }
189 
190 
191 }}}}
192 
193 
194 
195 #endif // swcdb_common_Files_Schema_h
SWC::Common::Files::Schema::VERSION
const uint8_t VERSION
Definition: Schema.h:25
SWC::Core::BufferDyn::ptr
value_type * ptr
Definition: Buffer.h:293
SWC::Common::Files::Schema::schema_file
static const char schema_file[]
Definition: Schema.h:26
SWC_LOG_OSTREAM
#define SWC_LOG_OSTREAM
Definition: Logger.h:44
SWC::Common::Files::Schema::HEADER_OFFSET_CHKSUM
const uint8_t HEADER_OFFSET_CHKSUM
Definition: Schema.h:24
SWC::Error::SERVER_SHUTTING_DOWN
@ SERVER_SHUTTING_DOWN
Definition: Error.h:84
SWC_LOGF
#define SWC_LOGF(priority, fmt,...)
Definition: Logger.h:188
SWC::DB::RangeBase::get_column_path
static const char * get_column_path() noexcept
Definition: RangeBase.h:26
SWC::DB::Schema::Ptr
std::shared_ptr< Schema > Ptr
Definition: Schema.h:185
SWC_LOG_OUT
#define SWC_LOG_OUT(pr, _code_)
Definition: Logger.h:178
SWC::Common::Files::Schema::load
void load(int &err, const std::string &filepath, DB::Schema::Ptr &schema)
Definition: Schema.h:87
SWC::Serialization::encode_i32
SWC_CAN_INLINE void encode_i32(uint8_t **bufp, uint32_t val) noexcept
Definition: Serialization.h:138
SWC::Env::FsInterface::interface
static SWC_CAN_INLINE FS::Interface::Ptr & interface() noexcept
Definition: Interface.h:150
SWC::FS::SmartFd::make_ptr
static SWC_CAN_INLINE Ptr make_ptr(const std::string &filepath, uint32_t flags, int32_t fd=-1, uint64_t pos=0)
Definition: SmartFd.h:40
SWC::DB::Types::to_string
const char *SWC_CONST_FUNC to_string(Column typ) noexcept
Definition: Column.cc:38
SWC::Core::checksum_i32_chk
SWC_CAN_INLINE bool checksum_i32_chk(uint32_t checksum, const uint8_t *base, uint32_t len)
Definition: Checksum.h:94
SWC::DB::Types::SystemColumn::SYS_CID_END
const cid_t SYS_CID_END
Definition: SystemColumn.h:27
SWC::DB::Types::SystemColumn::SYS_CID_DEFINE_LEXIC
const cid_t SYS_CID_DEFINE_LEXIC
Definition: SystemColumn.h:25
SWC::Core::BufferDyn::ensure
SWC_CAN_INLINE void ensure(size_t len)
Definition: Buffer.h:212
SWC::Common::Files::Schema::HEADER_SIZE
const uint8_t HEADER_SIZE
Definition: Schema.h:23
SWC::Serialization::encode_i8
constexpr SWC_CAN_INLINE void encode_i8(uint8_t **bufp, uint8_t val) noexcept
Definition: Serialization.h:85
SWC::DB::Types::SystemColumn::is_master
constexpr SWC_CAN_INLINE bool is_master(cid_t cid) noexcept
Definition: SystemColumn.h:31
SWC::Error::COLUMN_SCHEMA_BAD_SAVE
@ COLUMN_SCHEMA_BAD_SAVE
Definition: Error.h:106
SWC::DB::Schema
Definition: Schema.h:182
SWC::Error::OK
@ OK
Definition: Error.h:45
SWC::Core::Buffer::base
value_type * base
Definition: Buffer.h:131
SWC
The SWC-DB C++ namespace 'SWC'.
Definition: main.cc:12
SWC::FS::OPEN_FLAG_OVERWRITE
@ OPEN_FLAG_OVERWRITE
Definition: FileSystem.h:35
SWC::DB::Schema::make
static SWC_CAN_INLINE Ptr make()
Definition: Schema.h:189
SWC::Common::Files::Schema::remove
void remove(int &err, cid_t cid)
Definition: Schema.h:44
SWC::Core::BufferDyn< StaticBuffer >
SWC::Core::Buffer
Definition: Buffer.h:18
SWC::Core::Buffer::size
size_t size
Definition: Buffer.h:130
SWC::DB::Types::SystemColumn::SYS_RGR_DATA
const cid_t SYS_RGR_DATA
Definition: SystemColumn.h:22
SWC_FMT_LU
#define SWC_FMT_LU
Definition: Compat.h:98
SWC::DB::Types::SystemColumn::get_seq_type
KeySeq SWC_CONST_FUNC get_seq_type(cid_t cid) noexcept
Definition: SystemColumn.cc:15
SWC::cid_t
uint64_t cid_t
Definition: Identifiers.h:16
Checksum.h
SWC::Common::Files::Schema::save
void save(int &err, const DB::Schema::Ptr &schema, uint8_t replication=0)
Definition: Schema.h:70
SWC::Common::Files::Schema::save_with_validation
void save_with_validation(int &err, const DB::Schema::Ptr &schema_save, uint8_t replication)
Definition: Schema.h:174
SWC::Error::CHECKSUM_MISMATCH
@ CHECKSUM_MISMATCH
Definition: Error.h:62
SWC::Common::Files::Schema::write
void write(SWC::DynamicBuffer &dst_buf, const DB::Schema::Ptr &schema)
Definition: Schema.h:50
SWC::Core::checksum_i32
SWC_CAN_INLINE void checksum_i32(const uint8_t *start, size_t len, uint8_t **ptr) noexcept
Definition: Checksum.h:62
SWC::Common::Files::Schema::filepath
std::string filepath(cid_t cid)
Definition: Schema.h:34
SWC::LOG_WARN
@ LOG_WARN
Definition: Logger.h:33
SWC::DB::Types::Column::SERIAL
@ SERIAL
SWC::Core::to_string
SWC_CAN_INLINE std::string to_string(const BitFieldInt< T, SZ > &v)
Definition: BitFieldInt.h:263
SWC::Serialization::decode_i8
constexpr SWC_CAN_INLINE uint8_t decode_i8(const uint8_t **bufp, size_t *remainp)
Definition: Serialization.h:91
SWC_LOG_CURRENT_EXCEPTION
#define SWC_LOG_CURRENT_EXCEPTION(_s_)
Definition: Exception.h:144
SWC::Serialization::decode_i32
SWC_CAN_INLINE uint32_t decode_i32(const uint8_t **bufp, size_t *remainp)
Definition: Serialization.h:143
SystemColumn.h
SWC::DB::Types::SystemColumn::SYS_CID_STATS
const cid_t SYS_CID_STATS
Definition: SystemColumn.h:24