void selectFromTable(bool dis, string attributes, string tabs, string whereCondition, string orderBy) { int disk0 = disk.getDiskIOs(); vector<string> tableNames = split(tabs, ','); vector<string> attributeNames = split(attributes, ','); string tableName; if(validate(tableNames)) return; if(tableNames.size()==1) { Relation *relation = schemaManager.getRelation(tableNames[0]); string pName = projection(attributeNames, tableNames[0], whereCondition); string d; relation = schemaManager.getRelation(pName); if(dis) { d = distinct(pName); relation = schemaManager.getRelation(d); } cout<<*relation<<endl; if(!(attributeNames.size()==1 && attributeNames[0]=="*" && whereCondition.empty())) schemaManager.deleteRelation(pName); if(dis) schemaManager.deleteRelation(d); } else { vector<string>::iterator it; vector<string> projections; if(tableNames.size()==2) { string ptemp = crossJoin(attributeNames, tableNames[0], tableNames[1], whereCondition, false); string d; Relation *relation = schemaManager.getRelation(ptemp); if(dis) { d = distinct(ptemp); relation = schemaManager.getRelation(d); } cout<<*relation<<endl; schemaManager.deleteRelation(ptemp); if(dis) schemaManager.deleteRelation(d); } else { bool flag =true; vector<string> blah; string str = crossJoin(blah, tableNames[0],tableNames[1], whereCondition, false); for(int i=2;i<tableNames.size();i++) { str = crossJoin(blah, str, tableNames[i], whereCondition, true); } Relation *relation = schemaManager.getRelation(str); cout<<*relation<<endl; schemaManager.deleteRelation(str); } } cout<<"No. of disk IO's used for this opertaion are "<<disk.getDiskIOs()-disk0<<endl; }
void insertIntoTable(string tableName, vector<string> fieldNames, vector<string> fieldValues) { if(!schemaManager.relationExists(tableName)) { cout<<"Illegal Tablename"<<endl; return; } Relation *relation = schemaManager.getRelation(tableName); Tuple tuple = relation->createTuple(); Schema schema = relation->getSchema(); vector<string>::iterator it,it1; for(it = fieldNames.begin(),it1 = fieldValues.begin();it!=fieldNames.end();it++, it1++) { string str=*it,str1=*it1; str = removeSpaces(str); int type = schema.getFieldType(str); if(!type) { str1 = removeSpaces(str1); if(isNumber(str1)) { tuple.setField(str,stoi(str1)); } else { cout<<"Data type is not supported\n"; return; } } else { regex exp("\\ *\"(.*)\""); cmatch match; if(regex_match(str1.c_str(),match,exp)) { str1 = match[1]; if(str1.length()>20) { cout<<"Data type is not supported\n"; return; } else tuple.setField(str,str1); } else { cout<<"Data type is not supported\n"; return; } } } insertTuple(tableName, tuple); cout<<disk.getDiskIOs()<<endl; }
int main(int argc, char ** argv){ // Initialize the memory, disk and the schema manager MainMemory mem; Disk disk; //cout << "The memory contains " << mem.getMemorySize() << " blocks" << endl; SchemaManager schema_manager(&mem,&disk); disk.resetDiskIOs(); disk.resetDiskTimer(); resetFreeBlocks(); clock_t start_time; start_time=clock(); //=======================Read Input========================= ifstream input; bool interactive_mode = false; assert(argv && argc >= 1); cout<<endl; cout<<" "; cout<<"============================================="<<endl<<endl; cout<<" "; cout<<"Welcome to TinySQL Database Management System"<<endl<<endl; cout<<" "; cout<<"Develped by Jimmy Jin & Tony Wang, 12/6/2016"<<endl<<endl; cout<<" "; cout<<"============================================="<<endl<<endl; if (argc == 1){ cout<<endl<<"Entering Interactive Mode: Type query and ENTER to execute; Type EXIT to exit the program."<<endl<<endl; interactive_mode = true; } else if (argc == 2){ string filename = argv[1]; input.open(filename.c_str()); if (!input.is_open()){ cout<<"Cannot Open file: "<<filename<<endl; return 0; } } else{ cout<<"To use TinySQL to read input file, type: "; cout<<"./Tiny <filename>"<<endl; cout<<"To use TinySQL in Interactive Mode, type: "; cout<<"./Tiny"<<endl; return 0; } unsigned long int ios = 0; double time = 0; string line; vector<string> words; // for each command line while(1){ if (interactive_mode){ cout<<">>"; char console_input[1000]; cin.getline(console_input, sizeof(console_input)); line = string(console_input); if (line == "EXIT") break; cout<<endl; } else{ if (!getline(input, line)) break; cout<<line<<endl; } if(line[0] == '#') continue; if(line.size() == 0) continue; // extract each word into vector words words = splitBy(line," "); // prepare memory resetFreeBlocks(); if (words[0] == "CREATE"){ Create(words, schema_manager, mem); } else if (words[0] == "DROP"){ string relation_name = words[2]; schema_manager.deleteRelation(relation_name); } else if (words[0] == "INSERT"){ Insert(words, line, schema_manager, mem); // cout<< *(schema_manager.getRelation(relation_name))<<endl; } else if (words[0] == "DELETE"){ Delete(words, schema_manager, mem); } else if (words[0] == "SELECT"){ Select(words, schema_manager, mem); } else{ cout<<"Not a valid Tiny-SQL command!"<<endl<<endl; continue; //abort(); } words.clear(); cout << "Elapse time = " << disk.getDiskTimer() - time<< " ms" << endl; cout << "Disk I/Os = " << disk.getDiskIOs() - ios<< endl<<endl; time = disk.getDiskTimer(); ios = disk.getDiskIOs(); } if (!interactive_mode) input.close(); cout << "==== End of inputs ==== "<<endl; cout << "Total elapse time = " << ((double)(clock()-start_time)/CLOCKS_PER_SEC*1000) << " ms" << endl; cout << "Total Disk elapse time = " << disk.getDiskTimer() << " ms" << endl; cout << "Total Disk I/Os = " << disk.getDiskIOs() << endl; return 0; }