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