· 7 years ago · Nov 22, 2018, 07:32 PM
1#include <bits/stdc++.h>
2using namespace std;
3
4struct node
5{
6 int data;
7 string val = "";
8 int type;
9};
10
11struct cols
12{
13 string name;
14 int size;
15 int type = 0;
16 bool notNull = false;
17 bool pk = false;
18 bool unique = false;
19 string def_s = "";
20 int def_i;
21};
22
23vector<vector<vector<node *>>> db;
24vector<vector<cols *>> col;
25vector<string> table;
26node *newNode(int n)
27{
28 node *temp = new node;
29 temp->data = n;
30 temp->type = 0;
31 return temp;
32}
33
34node *newNode(string s)
35{
36 node *temp = new node;
37 temp->val = s;
38 temp->type = 1;
39 return temp;
40}
41
42int find_tab_id(string s)
43{
44 for (int i = 0; i < table.size(); i++)
45 {
46 if (table[i] == s)
47 return i;
48 }
49 return -1;
50}
51
52vector<int> where(vector<string> tokens, int table)
53{
54 vector<int> result;
55 vector<cols *> ptable = col[table];
56 vector<vector<node *>> rt = db[table];
57 for (int i = 0; i < tokens.size(); i++)
58 {
59 string s = tokens[i];
60
61 if (s == "or")
62 {
63 i++;
64 for (int j = 0; j < ptable.size(); j++)
65 {
66 if (ptable[j]->name == s)
67 {
68 i++;
69 i++;
70 if (tokens[i][0] == '\"' || tokens[i][0] == '\'')
71 tokens[i] = tokens[i].substr(1, tokens[i].length() - 2);
72 for (int k = 0; k < rt.size(); k++)
73 {
74
75 if (rt[k][j]->val == tokens[i])
76 result.push_back(k); //same values will insert 2 times
77 }
78 break;
79 }
80 }
81 }
82 else if (s == "and")
83 {
84 i++;
85 for (int j = 0; j < ptable.size(); j++)
86 {
87 if (ptable[j]->name == s)
88 {
89 i++;
90 i++;
91 if (tokens[i][0] == '\"' || tokens[i][0] == '\'')
92 tokens[i] = tokens[i].substr(1, tokens[i].length() - 2);
93 for (int k = 0; k < result.size(); k++)
94 {
95 if (rt[result[k]][j]->val != tokens[i])
96 {
97 result.erase(result.begin() + k);
98 k--;
99 }
100 }
101 break;
102 }
103 }
104 }
105 else if (s == ",")
106 {
107 continue;
108 }
109 else
110 {
111 for (int j = 0; j < ptable.size(); j++)
112 {
113 if (ptable[j]->name == s)
114 {
115 i++;
116 i++;
117 if (tokens[i][0] == '\"' || tokens[i][0] == '\'')
118 tokens[i] = tokens[i].substr(1, tokens[i].length() - 2);
119 for (int k = 0; k < rt.size(); k++)
120 {
121 if (rt[k][j]->val == tokens[i])
122 result.push_back(k);
123 }
124 break;
125 }
126 }
127 }
128 }
129 return result;
130}
131/*class Dbn
132{
133 vector<tab> v;
134 public:
135 void drop(tab);
136 vector<cols *> create(vector<string>);
137 void showtables();
138};*/
139
140void print(int tb_id, vector<int> rcid)
141{
142 if (tb_id == -1)
143 {
144 printf("ERROR: Table doesn't exist in the database");
145 }
146 int i;
147 for (i = 0; i < rcid.size(); i++)
148 {
149 if (rcid[i] == -1)
150 break;
151 }
152 for (int p = 0; p < rcid.size() - (i + 1); p++)
153 cout << "---------------------";
154 cout << endl;
155 for (int k = i + 1; k < rcid.size(); k++)
156 {
157 printf("| %-19s", col[tb_id][rcid[k]]->name.c_str());
158 }
159 cout << "|" << endl;
160 for (int p = 0; p < rcid.size() - (i + 1); p++)
161 cout << "---------------------";
162 cout << endl;
163 for (int j = 0; j < i; j++)
164 {
165 for (int k = i + 1; k < rcid.size(); k++)
166 {
167 if (db[tb_id][rcid[j]][rcid[k]]->val != "")
168 printf("| %-19s", db[tb_id][rcid[j]][rcid[k]]->val.c_str());
169 else
170 printf("| %-19d", db[tb_id][rcid[j]][rcid[k]]->data);
171 }
172 cout << "|" << endl;
173 }
174 for (int p = 0; p < rcid.size() - (i + 1); p++)
175 cout << "---------------------";
176 cout << endl;
177}
178
179void create(vector<string> tokens)
180{
181 if (find_tab_id(tokens[2]) != -1)
182 {
183 cout << "ERROR:Table " << tokens[2] << " already exists in database.\n";
184 return;
185 }
186 table.push_back(tokens[2]);
187 int j;
188 vector<cols *> tmp;
189 for (int i = 4; i < tokens.size() - 1; i++)
190 {
191 cols *temp = new cols();
192 for (j = i; tokens[j] != "," && j < tokens.size() - 1; j++)
193 {
194 if (tokens[j] == "not" && tokens[j + 1] == "null")
195 {
196 temp->notNull = true;
197 j++;
198 }
199 else if (tokens[j] == "unique")
200 temp->unique = true;
201 else if (tokens[j] == "primary" && tokens[j + 1] == "key")
202 {
203 temp->pk = true;
204 j++;
205 }
206 else if (tokens[j] == "default")
207 {
208 if (tokens[j + 2][0] == '0')
209 temp->def_i = stoi(tokens[j + 2]);
210 else
211 temp->def_s = tokens[j + 2];
212 j += 2;
213 }
214 else if (tokens[j] == "varchar")
215 {
216 temp->type = 1;
217 }
218 else if (tokens[j] == "int")
219 {
220 temp->type = 0;
221 }
222 else if (tokens[j] == "(")
223 {
224 temp->size = stoi(tokens[j + 1]);
225 j += 2;
226 }
227 else
228 {
229 temp->name = tokens[j];
230 }
231 }
232 i = j;
233 tmp.push_back(temp);
234 }
235 col.push_back(tmp);
236}
237
238int get_col_id(int tab_id, string s)
239{
240 for (int i = 0; i < col[tab_id].size(); i++)
241 {
242 if (col[tab_id][i]->name == s)
243 return i;
244 }
245 return -1;
246}
247
248vector<int> select(vector<string> tokens)
249{
250 int i;
251 vector<int> result;
252 for (i = 0; i < tokens.size(); i++)
253 {
254 if (tokens[i] == "from")
255 break;
256 }
257 if (i == tokens.size())
258 cout << " INVALID SYNTAX\n";
259 int tab_id = find_tab_id(tokens[i + 1]);
260 if (tab_id == -1)
261 {
262 cout << "ERROR:Table doesn't exist in database\n";
263 }
264 else
265 {
266 if (i + 2 != tokens.size())
267 {
268 vector<int> rowids = where(tokens, tab_id);
269 for (int j = 0; j < rowids.size(); j++)
270 result.push_back(rowids[j]);
271 result.push_back(-1);
272 }
273 else
274 {
275 for (int j = 0; j < db[tab_id].size(); j++)
276 result.push_back(j);
277 result.push_back(-1);
278 }
279 if (tokens[1] == "*")
280 {
281 for (int j = 0; j < db[tab_id][0].size(); j++)
282 {
283 result.push_back(j);
284 }
285 }
286 else
287 {
288 for (int j = 1; j < i; j = j + 2)
289 {
290 int r = get_col_id(tab_id, tokens[j]);
291 result.push_back(r);
292 }
293 }
294 }
295 return result;
296}
297void insert(vector<string> tokens)
298{
299 int tab_id = find_tab_id(tokens[2]);
300 if (tab_id == -1)
301 {
302 cout << "ERROR:Table doesn't exist in database\n";
303 }
304 else
305 {
306 vector<vector<node *>> curr;
307 vector<node *> tmp;
308 for (int i = 5; i < tokens.size() - 1; i += 2)
309 {
310 string curr_tok = tokens[i];
311 if (curr_tok[0] >= '0' && curr_tok[0] <= '9')
312 {
313 node *temp = newNode(stoi(curr_tok));
314 tmp.push_back(temp);
315 }
316 else
317 {
318 node *temp = newNode(curr_tok.substr(1, curr_tok.length() - 2));
319 tmp.push_back(temp);
320 }
321 }
322 if (table.size() == db.size())
323 db[tab_id].push_back(tmp);
324 else
325 {
326 curr.push_back(tmp);
327 db.push_back(curr);
328 }
329 }
330}
331
332vector<cols *> del(vector<string> tokens) {}
333
334int main()
335{
336 string s;
337
338 table.push_back("students");
339 cols *col1 = new cols();
340 col1->name = "rollno";
341 cols *col2 = new cols();
342 col2->name = "name";
343 vector<cols *> temp;
344 temp.push_back(col1);
345 temp.push_back(col2);
346 col.push_back(temp);
347 node *s1name = new node();
348 s1name->val = "Pranav";
349 node *s1roll = new node();
350 s1roll->data = 1;
351 node *s2name = new node();
352 s2name->val = "Ayush";
353 node *s2roll = new node();
354 s2roll->data = 2;
355 vector<node *> student1;
356 student1.push_back(s1roll);
357 student1.push_back(s1name);
358
359 vector<node *> student2;
360 student2.push_back(s2roll);
361 student2.push_back(s2name);
362
363 vector<vector<node *>> students;
364 students.push_back(student1);
365 students.push_back(student2);
366
367 db.push_back(students);
368
369 vector<int> rcid;
370 rcid.push_back(0);
371 rcid.push_back(1);
372 rcid.push_back(-1);
373 rcid.push_back(0);
374 rcid.push_back(1);
375
376 printf(">> ");
377 getline(cin, s, ';');
378 while (s != "exit")
379 {
380 stringstream check1(s);
381 string intermediate;
382 vector<string> tokens;
383 while (getline(check1, intermediate, ' '))
384 tokens.push_back(intermediate);
385 if (tokens[0] == "create")
386 create(tokens);
387 if (tokens[0] == "select")
388 {
389 vector<int> result = select(tokens);
390 print(0, result);
391 }
392 if (tokens[0] == "insert")
393 insert(tokens);
394 if (tokens[0] == "delete")
395 del(tokens);
396
397 getline(cin, s);
398 printf(">> ");
399 getline(cin, s, ';');
400 }
401 return 0;
402}