tinySQL  0.1
A self-contained database management system
data_t.h
1 #ifndef DATA_T_H
2 #define DATA_T_H
3 
4 #include <string>
5 #include <map>
6 #include <vector>
7 #include <cstring>
8 #include <cassert>
9 
10 #include "share/err_type.h"
11 #include "share/config.h"
12 #include "hsql/SQLParser.h"
13 
14 enum struct Operator {
15  GT,GE,LT,LE,EQ,NE
16 };
17 
18 const std::map<hsql::OperatorType, Operator> op_map
19  {{hsql::OperatorType::kOpGreater, Operator::GT},
20  {hsql::OperatorType::kOpGreaterEq, Operator::GE},
21  {hsql::OperatorType::kOpLess, Operator::LT},
22  {hsql::OperatorType::kOpLessEq, Operator::LE},
23  {hsql::OperatorType::kOpEquals, Operator::EQ},
24  {hsql::OperatorType::kOpNotEquals, Operator::NE}};
25 
26 enum struct BASE_SQL_ValType
27 {INT,
28  FLOAT,
29  STRING};
30 
31 const std::map<hsql::DataType, BASE_SQL_ValType> type_map
32  {{hsql::DataType::INT, BASE_SQL_ValType::INT},
33  {hsql::DataType::FLOAT, BASE_SQL_ValType::FLOAT},
34  {hsql::DataType::CHAR, BASE_SQL_ValType::STRING},
35  {hsql::DataType::DOUBLE, BASE_SQL_ValType::FLOAT},
36  {hsql::DataType::VARCHAR, BASE_SQL_ValType::STRING},
37  {hsql::DataType::DECIMAL, BASE_SQL_ValType::FLOAT}};
38 
44 struct Data{
45  BASE_SQL_ValType type;
46  union {
47  int i_data;
48  float f_data;
49  char s_data[20];
50  } data_meta{};
51 
52  Data(){};
53 
54  explicit Data(hsql::Expr* expr){
55  switch (expr->type) {
56  case hsql::kExprLiteralInt :{
57  type = BASE_SQL_ValType::INT;
58  data_meta.i_data = expr->ival;
59  break;
60  }
61  case hsql::kExprLiteralFloat :{
62  type = BASE_SQL_ValType::FLOAT;
63  data_meta.f_data = expr->fval;
64  break;
65  }
66  case hsql::kExprLiteralString :{
67  type = BASE_SQL_ValType::STRING;
68  strcpy(data_meta.s_data, expr->name);
69  break;
70  }
71  default:{
72  throw DB_FAILED;
73  }
74  }
75  }
76 
77  friend bool operator<(const Data& d_l, const Data& d_r){
78  if (d_l.type != d_r.type) throw DB_OPERANDS_MISMATCH;
79 
80  switch (d_l.type) {
81  case BASE_SQL_ValType::STRING:{
82  if(strcmp(d_l.data_meta.s_data, d_r.data_meta.s_data) < 0){
83  return true;
84  }
85  else {
86  return false;
87  }
88  }
89  case BASE_SQL_ValType::INT:{
90  return d_l.data_meta.i_data < d_r.data_meta.i_data;
91  }
92  case BASE_SQL_ValType::FLOAT:{
93  return d_l.data_meta.f_data < d_r.data_meta.f_data;
94  }
95  default:{
96  throw DB_TYPE_ERR;
97  }
98  }
99  }
100 
101  friend bool operator==(const Data& d_l, const Data& d_r){
102  if (d_l.type != d_r.type){
103  throw DB_OPERANDS_MISMATCH;
104  }
105  switch (d_l.type) {
106  case BASE_SQL_ValType::STRING:{
107  if(strcmp(d_l.data_meta.s_data, d_r.data_meta.s_data) == 0){
108  return true;
109  }
110  else {
111  return false;
112  }
113  }
114  case BASE_SQL_ValType::INT:{
115  return d_l.data_meta.i_data == d_r.data_meta.i_data;
116  }
117  case BASE_SQL_ValType::FLOAT:{
118  return d_l.data_meta.f_data == d_r.data_meta.f_data;
119  }
120  default:{
121  throw DB_TYPE_ERR;
122  }
123  }
124  }
125 
126  friend bool operator<=(const Data& d_l, const Data& d_r){
127  return (d_l < d_r || d_l == d_r);
128  }
129 
130  friend bool operator>=(const Data& d_l, const Data& d_r){
131  return !(d_l < d_r);
132  }
133 
134  friend bool operator>(const Data& d_l, const Data& d_r){
135  return !(d_l <= d_r);
136  }
137 
138  friend bool operator!=(const Data& d_l, const Data& d_r){
139  return !(d_l == d_r);
140  }
141 
142  friend std::ostream& operator<<(std::ostream& os, const Data& data){
143  switch(data.type){
144  case BASE_SQL_ValType::INT:{
145  os << data.data_meta.i_data << " | ";
146  break;
147  }
148  case BASE_SQL_ValType::FLOAT:{
149  os << data.data_meta.f_data << " | ";
150  break;
151  }
152  case BASE_SQL_ValType::STRING:{
153  os << data.data_meta.s_data << " | ";
154  break;
155  }
156  }
157  return os;
158  }
159 };
160 
161 struct Where{
162  Data data;
163  Operator relation_operator;
164  std::string attr_name;
165 };
166 //used to confirm the attribute, max32
172 struct Attribute{
173  int num;
174  BASE_SQL_ValType type[32];
175  std::string name[32];
176  bool is_unique[32] = {false};
177  bool has_index[32] = {false};
179 };
180 
185 struct Index{
186  int number;
187  int location[10];
188  std::string index_name[10];
189 };
190 
191 typedef std::vector<Data> MemoryTuple;
192 
193 //struct MemoryTuple {
194 // std::vector<Data> dat;
195 //
196 // size_t size(){
197 // return dat.size()
198 // }
199 //};
200 
206 struct DiskTuple{
207  db_size_t _total_len;
208 // db_size_t _current_len;
209  bool isDeleted_;
210  Data cell[];
211 
212  DiskTuple()= delete;
213  DiskTuple(DiskTuple&) = delete;
214  DiskTuple(DiskTuple&&) = delete;
215 
216  void serializeFromMemory(const MemoryTuple& in_tuple);
217  MemoryTuple deserializeToMemory(const std::vector<int>& pos = {});
218  [[nodiscard]] std::vector<Data> getData() const; //返回数据
219  [[nodiscard]] db_size_t getSize() const{
220  return _total_len;
221  } //返回元组的数据数量
222  [[nodiscard]] db_size_t getBytes() const{
223  return sizeof(DiskTuple) + sizeof(Data) * _total_len;
224  }
225 // DiskTuple<len>& operator=(DiskTuple t);
226  bool isDeleted();
227  void setDeleted();
228 };
229 
230 //
231 //class TupleFactory{
232 //public:
233 // static DiskTuple* makeTuple(db_size_t tuple_len);
234 // static DiskTuple* makeTuple(DiskTuple *t);
235 // static DiskTuple* makeTuple(std::vector<Data> &dat_vec);
236 //};
237 
238 
239 #endif
Attribute::name
std::string name[32]
property name
Definition: data_t.h:175
Where
Definition: data_t.h:161
Index::location
int location[10]
where it is in Attribute
Definition: data_t.h:187
Where::attr_name
std::string attr_name
The attribute to perform select on.
Definition: data_t.h:164
Index::index_name
std::string index_name[10]
has_index name
Definition: data_t.h:188
Attribute::is_unique
bool is_unique[32]
uniqure or not
Definition: data_t.h:176
Attribute::primary_Key
int primary_Key
-1 not exist, 1-32 exist and the place where the primary key are
Definition: data_t.h:178
DiskTuple
One row in a table.
Definition: data_t.h:206
Attribute::num
int num
number of property
Definition: data_t.h:173
Index::number
int number
number of indexes
Definition: data_t.h:186
Attribute::has_index
bool has_index[32]
index exist or not
Definition: data_t.h:177
Attribute
The attributes for a schema.
Definition: data_t.h:172
Data
Basic cell element in a tuples.
Definition: data_t.h:44
Index
Index desciption for a table.
Definition: data_t.h:185