commit
f3a378672d
12 changed files with 1414 additions and 659 deletions
|
@ -7,6 +7,7 @@ Attribute::Attribute(){
|
||||||
type = "";
|
type = "";
|
||||||
key = 0;
|
key = 0;
|
||||||
size = 0;
|
size = 0;
|
||||||
|
limit = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Attribute::Attribute(string n, string t, bool k){
|
Attribute::Attribute(string n, string t, bool k){
|
||||||
|
@ -14,13 +15,15 @@ Attribute::Attribute(string n, string t, bool k){
|
||||||
type = t;
|
type = t;
|
||||||
key = k;
|
key = k;
|
||||||
size = 0;
|
size = 0;
|
||||||
|
limit = 20;
|
||||||
}
|
}
|
||||||
|
|
||||||
Attribute::Attribute(string n, string t, bool k, int s){
|
Attribute::Attribute(string n, string t, bool k, int s){
|
||||||
name = n;
|
name = n;
|
||||||
type = t;
|
type = t;
|
||||||
key = k;
|
key = k;
|
||||||
size = s;
|
size = 0;
|
||||||
|
limit = s;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Attribute::addCell(string v){
|
void Attribute::addCell(string v){
|
||||||
|
@ -66,7 +69,7 @@ void Attribute::display(){
|
||||||
cout << name << "\n" << type;
|
cout << name << "\n" << type;
|
||||||
if(type == "VARCHAR")
|
if(type == "VARCHAR")
|
||||||
{
|
{
|
||||||
cout << "(" << size << ")";
|
cout << "(" << limit << ")";
|
||||||
}
|
}
|
||||||
cout << "\n\n";
|
cout << "\n\n";
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,7 @@ class Attribute{
|
||||||
string type;
|
string type;
|
||||||
bool key;
|
bool key;
|
||||||
int size;
|
int size;
|
||||||
|
int limit;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Attribute();
|
Attribute();
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#include <sstream> // std::stringstream
|
#include <sstream> // std::stringstream
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include "Parserv3.h"
|
#include "Parser.h"
|
||||||
#include "DBEngine.h"
|
#include "DBEngine.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
159
DBEngine.cpp
159
DBEngine.cpp
|
@ -25,7 +25,7 @@ void DBEngine::createTable(Relation r){
|
||||||
size++;
|
size++;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DBEngine::insertValues(string r, vector <string> v)
|
void DBEngine::insertValues(string r, vector<string> v)
|
||||||
{
|
{
|
||||||
for(int i = 0; i < tables.size(); i++)
|
for(int i = 0; i < tables.size(); i++)
|
||||||
{
|
{
|
||||||
|
@ -52,11 +52,69 @@ void DBEngine::save(){
|
||||||
file.close();
|
file.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DBEngine::deleteRelation(string n)
|
||||||
|
{
|
||||||
|
// to conserve memory after closing a file.
|
||||||
|
for(int i = 0; i < tables.size(); i++)
|
||||||
|
{
|
||||||
|
if (tables[i].getTableName() == n)
|
||||||
|
{
|
||||||
|
tables.erase(tables.begin() + i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DBEngine::save(string n){
|
||||||
|
|
||||||
|
ofstream file;
|
||||||
|
string name = n + ".txt";
|
||||||
|
file.open(name);
|
||||||
|
|
||||||
|
for(int i = 0; i < commands.size() - 1; ++i)
|
||||||
|
{
|
||||||
|
if(commands[i].substr(0, 4) == "SAVE")
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(commands[i].substr(0, 4) == "SHOW")
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(commands[i].substr(0, 4) == "OPEN")
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(commands[i].substr(0, 5) == "CLOSE")
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
file << commands[i] << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//file.close();
|
||||||
|
}
|
||||||
|
|
||||||
vector<Relation> DBEngine::getRelations(){
|
vector<Relation> DBEngine::getRelations(){
|
||||||
return tables;
|
return tables;
|
||||||
}
|
}
|
||||||
|
|
||||||
Relation& DBEngine::getTableFromName(string n){
|
bool DBEngine::isRelation(string n)
|
||||||
|
{
|
||||||
|
for(int i = 0; i < tables.size(); i++)
|
||||||
|
{
|
||||||
|
if (tables[i].getTableName() == n)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Relation& DBEngine::getTableFromName(string n)
|
||||||
|
{
|
||||||
for(int i = 0; i < tables.size(); i++){
|
for(int i = 0; i < tables.size(); i++){
|
||||||
if (tables[i].getTableName() == n){
|
if (tables[i].getTableName() == n){
|
||||||
return tables[i];
|
return tables[i];
|
||||||
|
@ -68,7 +126,7 @@ Relation& DBEngine::getTableFromName(string n){
|
||||||
}
|
}
|
||||||
|
|
||||||
Relation DBEngine::selection(string attName, string s, Relation r){
|
Relation DBEngine::selection(string attName, string s, Relation r){
|
||||||
equality(attName, s, r);
|
return equality(attName, s, r);
|
||||||
}
|
}
|
||||||
|
|
||||||
//assumes that all attribute titles are unique
|
//assumes that all attribute titles are unique
|
||||||
|
@ -77,25 +135,39 @@ Relation DBEngine::projection(vector<string> input, Relation r){
|
||||||
vector<Attribute> v;
|
vector<Attribute> v;
|
||||||
string new_name = r.getTableName() + " Projection";
|
string new_name = r.getTableName() + " Projection";
|
||||||
|
|
||||||
for(int i = 0; i < input.size(); ++i) {
|
for(int i = 0; i < input.size(); ++i)
|
||||||
|
{
|
||||||
for(int j = 0; j < r.getSize(); ++j) {
|
for(int j = 0; j < r.getSize(); ++j)
|
||||||
|
{
|
||||||
if((r.getAttributes())[j].getName() == input[i])
|
if((r.getAttributes())[j].getName() == input[i])
|
||||||
|
{
|
||||||
v.push_back((r.getAttributes())[j]);
|
v.push_back((r.getAttributes())[j]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Relation temp(new_name, v);
|
Relation temp(new_name, v);
|
||||||
return temp;
|
return temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
//test error matching
|
//test error matching
|
||||||
void DBEngine::rename(Relation& r, vector<string> oldnames, vector<string> newnames){
|
Relation DBEngine::rename(vector<string> newnames, Relation &r)
|
||||||
if (oldnames.size() != newnames.size()) {
|
{
|
||||||
|
vector<string> temp;
|
||||||
|
if (r.getSize() != newnames.size()) {
|
||||||
cout << "FAILURE TO RENAME: number of attributes do not match.\n";
|
cout << "FAILURE TO RENAME: number of attributes do not match.\n";
|
||||||
return;
|
exit(1);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
temp = r.getAttributeNames();
|
||||||
|
for(int i = 0; i < temp.size(); ++i)
|
||||||
|
{
|
||||||
|
r.renameAttribute(temp[i], newnames[i]);
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
/*
|
||||||
else if (oldnames != r.getAttributeNames()) {
|
else if (oldnames != r.getAttributeNames()) {
|
||||||
cout << "FAILURE TO RENAME: the attributes to be renamed do not exist in the relation.\n";
|
cout << "FAILURE TO RENAME: the attributes to be renamed do not exist in the relation.\n";
|
||||||
return;
|
return;
|
||||||
|
@ -106,6 +178,8 @@ void DBEngine::rename(Relation& r, vector<string> oldnames, vector<string> newna
|
||||||
r.renameAttribute(oldnames[i], newnames[i]);
|
r.renameAttribute(oldnames[i], newnames[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Relation DBEngine::setUnion(Relation r1, Relation r2){
|
Relation DBEngine::setUnion(Relation r1, Relation r2){
|
||||||
|
@ -153,31 +227,67 @@ Relation DBEngine::setDiff(Relation r1, Relation r2){
|
||||||
Relation new_r = r1;
|
Relation new_r = r1;
|
||||||
new_r.setTableName("TEMP");
|
new_r.setTableName("TEMP");
|
||||||
vector<string> temp;
|
vector<string> temp;
|
||||||
bool duplicate = false;
|
//bool duplicate = false;
|
||||||
|
|
||||||
for (int i = 0; i < r1.getAttributes()[0].getSize(); ++i){
|
/*
|
||||||
new_r.removeTuple(i);
|
for (int i = 0; i < r1.getAttributes()[0].getSize(); ++i)
|
||||||
|
{
|
||||||
|
new_r.removeTuple(0);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
int size = 0;
|
||||||
|
|
||||||
for (int i = 0; i < r1.getAttributes()[0].getSize(); ++i) {
|
//cout << "test1" << endl;
|
||||||
temp = r1.getTuple(i);
|
|
||||||
|
|
||||||
for (int j = 0; j < r2.getAttributes()[0].getSize(); ++j){
|
for(int x = 0; x < r2.getAttributes().size(); ++x)
|
||||||
if (temp == r2.getTuple(j)){
|
{
|
||||||
duplicate = true;
|
|
||||||
break;
|
//cout << "test2" << endl;
|
||||||
|
for (int i = 0; i < r2.getAttributes()[x].getSize(); ++i)
|
||||||
|
{
|
||||||
|
|
||||||
|
//cout << "test3" << endl;
|
||||||
|
temp = r2.getTuple(i);
|
||||||
|
|
||||||
|
for(int y = 0; y < new_r.getAttributes().size(); ++y)
|
||||||
|
{
|
||||||
|
size = new_r.getAttributes()[y].getSize();
|
||||||
|
//cout << "test4" << endl;
|
||||||
|
new_r.getAttributes()[y].getSize();
|
||||||
|
for (int j = 0; j < size; ++j)
|
||||||
|
{
|
||||||
|
//cout << "test5" << endl;
|
||||||
|
for(int a = 0; a < temp.size(); ++a)
|
||||||
|
{
|
||||||
|
//cout << "test6" << endl;
|
||||||
|
for(int b = 0; b < new_r.getTuple(j).size(); ++b)
|
||||||
|
{
|
||||||
|
//cout << "test7" << endl;
|
||||||
|
//cout << temp[a] << " " << new_r.getTuple(j)[b] << " " << b << endl;
|
||||||
|
if (temp[a] == new_r.getTuple(j)[b])
|
||||||
|
{
|
||||||
|
new_r.removeFromTuple(b, j);
|
||||||
|
//cout << "test" << endl;
|
||||||
|
//duplicate = true;
|
||||||
|
//break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (!duplicate){
|
size = new_r.getAttributes()[y].getSize();
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
if (!duplicate)
|
||||||
|
{
|
||||||
new_r.insertTuple(temp);
|
new_r.insertTuple(temp);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
duplicate = false;
|
//duplicate = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//make this one for loop later!
|
//make this one for loop later!
|
||||||
|
/*
|
||||||
for (int i = 0; i < r2.getAttributes()[0].getSize(); ++i) {
|
for (int i = 0; i < r2.getAttributes()[0].getSize(); ++i) {
|
||||||
temp = r2.getTuple(i);
|
temp = r2.getTuple(i);
|
||||||
|
|
||||||
|
@ -194,6 +304,7 @@ Relation DBEngine::setDiff(Relation r1, Relation r2){
|
||||||
|
|
||||||
duplicate = false;
|
duplicate = false;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
return new_r;
|
return new_r;
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,14 +17,18 @@ public:
|
||||||
void createTable(Relation r);
|
void createTable(Relation r);
|
||||||
void insertValues(string r, vector <string> v);
|
void insertValues(string r, vector <string> v);
|
||||||
vector<Relation> getRelations();
|
vector<Relation> getRelations();
|
||||||
|
bool isRelation(string n);
|
||||||
//void showTable(Relation r);
|
//void showTable(Relation r);
|
||||||
Relation& getTableFromName(string n);
|
Relation& getTableFromName(string n);
|
||||||
void saveToFile(vector<string> cmds);
|
void saveToFile(vector<string> cmds);
|
||||||
Relation selection(string attName, string s, Relation r);
|
Relation selection(string attName, string s, Relation r);
|
||||||
Relation projection(vector<string> input, Relation r);
|
Relation projection(vector<string> input, Relation r);
|
||||||
|
Relation product(string s1, Relation r1, Relation r2);
|
||||||
|
void deleteRelation(string n);
|
||||||
void save();
|
void save();
|
||||||
|
void save(string n);
|
||||||
void storeCommands(string s);
|
void storeCommands(string s);
|
||||||
void rename(Relation& r, vector<string> oldnames, vector<string> newnames);
|
Relation rename(vector<string> newnames, Relation &r);
|
||||||
Relation setUnion(Relation r1, Relation r2);
|
Relation setUnion(Relation r1, Relation r2);
|
||||||
Relation setDiff(Relation r1, Relation r2);
|
Relation setDiff(Relation r1, Relation r2);
|
||||||
Relation crossProduct(Relation r1, Relation r2);
|
Relation crossProduct(Relation r1, Relation r2);
|
||||||
|
|
1217
Parser.cpp
Normal file
1217
Parser.cpp
Normal file
File diff suppressed because it is too large
Load diff
619
Parserv4.cpp
619
Parserv4.cpp
|
@ -1,619 +0,0 @@
|
||||||
#include <string> // std::string
|
|
||||||
#include <iostream> // std::cout
|
|
||||||
#include <fstream> // std::ofstream
|
|
||||||
#include <sstream> // std::stringstream
|
|
||||||
#include <vector>
|
|
||||||
#include <string>
|
|
||||||
#include "Parserv3.h"
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
vector<string> tokenize(string ss)
|
|
||||||
{
|
|
||||||
string tempString;
|
|
||||||
stringstream lineStream(ss);
|
|
||||||
vector<string> output;
|
|
||||||
|
|
||||||
while (lineStream >> tempString)
|
|
||||||
{
|
|
||||||
output.push_back(tempString);
|
|
||||||
}
|
|
||||||
|
|
||||||
//testing---------------
|
|
||||||
cout<<"TokenList: ";
|
|
||||||
|
|
||||||
for (int i = 0; i <output.size(); ++i)
|
|
||||||
{
|
|
||||||
cout<<output[i]<<" ";
|
|
||||||
}
|
|
||||||
cout << endl;
|
|
||||||
//----------------------
|
|
||||||
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
void displayTokenList(vector<string> input)
|
|
||||||
{
|
|
||||||
cout<<"TokenList: "<<endl;
|
|
||||||
for (int i = 0; i < input.size(); ++i)
|
|
||||||
{
|
|
||||||
cout<<input[i]<<endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
vector<string> showCMD(vector<string> input, DBEngine &engine)
|
|
||||||
{
|
|
||||||
if (input.size() > 3)
|
|
||||||
{
|
|
||||||
cout<<"Syntax error!"<<endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
PRelation r(input[0]);
|
|
||||||
|
|
||||||
// send show command to DBEngine
|
|
||||||
engine.getTableFromName(r.getName()).display();
|
|
||||||
|
|
||||||
return input;
|
|
||||||
}
|
|
||||||
|
|
||||||
vector<string> saveCMD(vector<string> input, DBEngine &engine)
|
|
||||||
{
|
|
||||||
if (input.size() > 2)
|
|
||||||
{
|
|
||||||
cout<<"Syntax error!"<<endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
//PRelation pr(input[0]);
|
|
||||||
|
|
||||||
// send save command to DBEngine
|
|
||||||
//engine.save();
|
|
||||||
|
|
||||||
Relation r = engine.getTableFromName(input[0]);
|
|
||||||
ofstream output;
|
|
||||||
string name = r.getTableName() + ".txt";
|
|
||||||
output.open(name);
|
|
||||||
|
|
||||||
output << "--------------------------\n";
|
|
||||||
output << r.getTableName() << "\n\n";
|
|
||||||
vector <Attribute> att = r.getAttributes();
|
|
||||||
for (int i = 0; i < att.size(); ++i)
|
|
||||||
{
|
|
||||||
output << "-------------\n";
|
|
||||||
output << att[i].getName() << "\n" << att[i].getType();
|
|
||||||
if(att[i].getType() == "VARCHAR")
|
|
||||||
{
|
|
||||||
output << "(" << att[i].getSize() << ")";
|
|
||||||
}
|
|
||||||
output << "\n\n";
|
|
||||||
|
|
||||||
vector<string> values = att[i].getValues();
|
|
||||||
vector<string>::iterator it = values.begin();
|
|
||||||
while (it != values.end())
|
|
||||||
{
|
|
||||||
output << *it << "\n";
|
|
||||||
it++;
|
|
||||||
}
|
|
||||||
output << "-------------\n";
|
|
||||||
}
|
|
||||||
output << "\n--------------------------";
|
|
||||||
|
|
||||||
input.erase(input.begin());
|
|
||||||
|
|
||||||
return input;
|
|
||||||
}
|
|
||||||
|
|
||||||
vector<string> closeCMD(vector<string> input, DBEngine &engine)
|
|
||||||
{
|
|
||||||
if (input.size() > 3)
|
|
||||||
{
|
|
||||||
cout<<"Syntax error!"<<endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
PRelation r(input[0]);
|
|
||||||
|
|
||||||
// send close command to DBEngine
|
|
||||||
|
|
||||||
return input;
|
|
||||||
}
|
|
||||||
|
|
||||||
vector<string> openCMD(vector<string> input, DBEngine &engine)
|
|
||||||
{
|
|
||||||
if (input.size() > 2)
|
|
||||||
{
|
|
||||||
cout<<"Syntax error!"<<endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
PRelation r(input[0]);
|
|
||||||
|
|
||||||
// send open command to DBEngine
|
|
||||||
|
|
||||||
return input;
|
|
||||||
}
|
|
||||||
|
|
||||||
vector<string> exitCMD(vector<string> input, DBEngine &engine)
|
|
||||||
{
|
|
||||||
|
|
||||||
exit(0);
|
|
||||||
|
|
||||||
return input;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
vector<string> createCMD(vector<string> input, DBEngine &engine)
|
|
||||||
{
|
|
||||||
//relation name will be the first element of the vector of data returned by this function
|
|
||||||
|
|
||||||
if (input[0] == "TABLE")
|
|
||||||
{
|
|
||||||
input.erase(input.begin());
|
|
||||||
|
|
||||||
PRelation r;
|
|
||||||
r.setPRelation(input[0]);
|
|
||||||
|
|
||||||
input.erase(input.begin());
|
|
||||||
|
|
||||||
if(input[0] == "(")
|
|
||||||
{
|
|
||||||
input.erase(input.begin());
|
|
||||||
|
|
||||||
//vector <PExpression> e1;
|
|
||||||
|
|
||||||
vector <PAttribute> a;
|
|
||||||
|
|
||||||
while(input[0] != ")") //inserting all values to relation
|
|
||||||
{
|
|
||||||
PAttribute temp;
|
|
||||||
|
|
||||||
if (input[0] == ",")
|
|
||||||
{
|
|
||||||
input.erase(input.begin());
|
|
||||||
}
|
|
||||||
|
|
||||||
temp.setPAttributeName(input[0]);
|
|
||||||
|
|
||||||
input.erase(input.begin());
|
|
||||||
|
|
||||||
if(input[0] == "INTEGER")
|
|
||||||
{
|
|
||||||
temp.setPAttributeType(input[0]);
|
|
||||||
input.erase(input.begin());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
temp.setPAttributeType(input[0].substr(0,input[0].find("(")));
|
|
||||||
temp.setPAttributeSize(stoi(input[0].substr(input[0].find("(") + 1, input[0].find(")"))));
|
|
||||||
input.erase(input.begin());
|
|
||||||
}
|
|
||||||
|
|
||||||
a.push_back(temp);
|
|
||||||
}
|
|
||||||
|
|
||||||
//vector <PAttribute> apk; //save primary keys temp storage
|
|
||||||
|
|
||||||
if(input[0] == "PRIMARY" && input[1] == "KEY")
|
|
||||||
{
|
|
||||||
input.erase(input.begin());
|
|
||||||
input.erase(input.begin());
|
|
||||||
|
|
||||||
if(input[0] == "(")
|
|
||||||
{
|
|
||||||
|
|
||||||
while(input[0] != ")") //inserting all values to relation
|
|
||||||
{
|
|
||||||
//PAttribute temp;
|
|
||||||
|
|
||||||
if (input[0] == ",")
|
|
||||||
{
|
|
||||||
input.erase(input.begin());
|
|
||||||
}
|
|
||||||
|
|
||||||
//temp.setPAttributeName(input[0]);
|
|
||||||
|
|
||||||
//apk.push_back(temp);
|
|
||||||
|
|
||||||
for(int i = 0; i < a.size(); ++i)
|
|
||||||
{
|
|
||||||
if(input[0] == a[i].getPAttribute())
|
|
||||||
{
|
|
||||||
a[i].setPAttributeKey();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
input.erase(input.begin());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
vector <Attribute> dba;
|
|
||||||
|
|
||||||
for(int x = 0; x < a.size(); ++x)
|
|
||||||
{
|
|
||||||
Attribute temp(a[x].getPAttribute(), a[x].getPAttributeType(), a[x].getPAttributeKey(), a[x].getPAttributeSize());
|
|
||||||
dba.push_back(temp);
|
|
||||||
}
|
|
||||||
|
|
||||||
engine.createTable(r.getName(), dba);
|
|
||||||
|
|
||||||
return input;
|
|
||||||
}
|
|
||||||
|
|
||||||
else cout<<"Syntax error! 2"<<endl;
|
|
||||||
}
|
|
||||||
else cout<<"Syntax error! 1"<<endl;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
vector<string> insertCMD(vector<string> input, DBEngine &engine)
|
|
||||||
{
|
|
||||||
//relation name will be the first element of the vector of data returned by this function
|
|
||||||
|
|
||||||
if (input[0] == "INTO")
|
|
||||||
{
|
|
||||||
input.erase(input.begin());
|
|
||||||
|
|
||||||
PRelation pr(input[0]);
|
|
||||||
Relation r = engine.getTableFromName(input[0]);
|
|
||||||
|
|
||||||
input.erase(input.begin());
|
|
||||||
|
|
||||||
vector <string> s;
|
|
||||||
|
|
||||||
if (input[0] == "VALUES" && input[1] == "FROM")
|
|
||||||
{
|
|
||||||
input.erase(input.begin());
|
|
||||||
input.erase(input.begin());
|
|
||||||
|
|
||||||
|
|
||||||
vector <Attribute> a = r.getAttributes();
|
|
||||||
|
|
||||||
if(input[0] == "(")
|
|
||||||
{
|
|
||||||
input.erase(input.begin());
|
|
||||||
|
|
||||||
for(int i = 0; i < a.size(); ++i)
|
|
||||||
{
|
|
||||||
if(a[i].getType() == "INTEGER")
|
|
||||||
{
|
|
||||||
if(input[0].at(0) == '\"')
|
|
||||||
{
|
|
||||||
cout << "Incorrect type matching. Tried to insert string." << endl;
|
|
||||||
cout << "The values should be: ";
|
|
||||||
for(int x = 0; x < a.size(); ++i)
|
|
||||||
{
|
|
||||||
cout << a[x].getType();
|
|
||||||
if(a[x].getType() == "VARCHAR")
|
|
||||||
{
|
|
||||||
cout << "(" << a[x].getSize() << ")";
|
|
||||||
}
|
|
||||||
cout << endl;
|
|
||||||
}
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
s.push_back(input[0]);
|
|
||||||
input.erase(input.begin());
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(input[0].at(0) == '\"')
|
|
||||||
{
|
|
||||||
s.push_back(input[0].substr(1,input[0].find_last_of("\"") - 1 ));
|
|
||||||
//engine.getTableFromName(pr.getName()).getAttributes()[i].display();
|
|
||||||
input.erase(input.begin());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cout << "Incorrect type matching. Tried to insert integer." << endl;
|
|
||||||
cout << "The values should be: ";
|
|
||||||
for(int x = 0; x < a.size(); ++x)
|
|
||||||
{
|
|
||||||
cout << a[x].getType();
|
|
||||||
if(a[x].getType() == "VARCHAR")
|
|
||||||
{
|
|
||||||
cout << "(" << a[x].getSize() << ")";
|
|
||||||
}
|
|
||||||
cout << endl;
|
|
||||||
}
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (input[0] == ",")
|
|
||||||
{
|
|
||||||
input.erase(input.begin());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(input[0] != ")")
|
|
||||||
{
|
|
||||||
cout << "Too many values trying to be inserted. Only insert " << a.size() << " values.";
|
|
||||||
cout << "The values should be: ";
|
|
||||||
for(int x = 0; x < a.size(); ++x)
|
|
||||||
{
|
|
||||||
cout << a[x].getType();
|
|
||||||
if(a[x].getType() == "VARCHAR")
|
|
||||||
{
|
|
||||||
cout << "(" << a[x].getSize() << ")";
|
|
||||||
}
|
|
||||||
cout << endl;
|
|
||||||
}
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
engine.insertValues(r.getTableName(), s);
|
|
||||||
input.erase(input.begin());
|
|
||||||
return input;
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (input[0] == "RELATION")
|
|
||||||
{
|
|
||||||
input.erase(input.begin());
|
|
||||||
|
|
||||||
//PExpression e;
|
|
||||||
|
|
||||||
// while(input[0] != ";")
|
|
||||||
// {
|
|
||||||
// e.setPExpression(e.getPExpression() + input[0]);
|
|
||||||
// }
|
|
||||||
|
|
||||||
//cout << "Inserting: " << e.getPExpression() << " into " << r.getName() << ".\n";
|
|
||||||
|
|
||||||
cout << "Not yet implemented." << endl;
|
|
||||||
|
|
||||||
return input;
|
|
||||||
}
|
|
||||||
|
|
||||||
else cout<<"Syntax error! 3"<<endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
cout<<"Syntax error! 2"<<endl;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
else cout<<"Syntax error! 1"<<endl;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
vector<string> updateCMD(vector<string> input, DBEngine &engine)
|
|
||||||
{
|
|
||||||
PRelation r(input[0]);
|
|
||||||
|
|
||||||
input.erase(input.begin());
|
|
||||||
|
|
||||||
if(input[0] == "SET")
|
|
||||||
{
|
|
||||||
input.erase(input.begin());
|
|
||||||
|
|
||||||
//parse out ( and send everything until ) into an Expression vector
|
|
||||||
if(input[0] == "(")
|
|
||||||
{
|
|
||||||
|
|
||||||
vector <PAttribute> a;
|
|
||||||
PAttribute temp;
|
|
||||||
|
|
||||||
vector <string> s;
|
|
||||||
|
|
||||||
//vector <PExpression> e;
|
|
||||||
|
|
||||||
input.erase(input.begin());
|
|
||||||
|
|
||||||
while(input[0] != ")")
|
|
||||||
{
|
|
||||||
temp.setPAttributeName(input[0]);
|
|
||||||
a.push_back(temp);
|
|
||||||
temp.setPAttributeName("~");
|
|
||||||
|
|
||||||
input.erase(input.begin());
|
|
||||||
|
|
||||||
if(input[0] == "=")
|
|
||||||
{
|
|
||||||
input.erase(input.begin());
|
|
||||||
|
|
||||||
s.push_back(input[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cout<<"Syntax error! 2"<<endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(input[0] == ",")
|
|
||||||
{
|
|
||||||
input.erase(input.begin());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(input[0] == "WHERE")
|
|
||||||
{
|
|
||||||
if(input[0] == "(")
|
|
||||||
{
|
|
||||||
//PCondition c;
|
|
||||||
|
|
||||||
PComparison c;
|
|
||||||
POperand oops1;
|
|
||||||
POperand oops2;
|
|
||||||
POp op;
|
|
||||||
|
|
||||||
while(input[0] != ")")
|
|
||||||
{
|
|
||||||
oops1.setPOperand(input[0]);
|
|
||||||
input.erase(input.begin());
|
|
||||||
|
|
||||||
oops2.setPOperand(input[0]);
|
|
||||||
input.erase(input.begin());
|
|
||||||
|
|
||||||
op.setPOp(input[0]);
|
|
||||||
input.erase(input.begin());
|
|
||||||
|
|
||||||
c.setPComparison(oops1.getPOperand(), op.getPOp(), oops2.getPOperand());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// send update command to DBEngine
|
|
||||||
}
|
|
||||||
|
|
||||||
else cout<<"Syntax error! 1"<<endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
vector<string> deleteCMD(vector<string> input, DBEngine &engine)
|
|
||||||
{
|
|
||||||
if (input[0] == "DELETE" && input[1] == "FROM")
|
|
||||||
{
|
|
||||||
input.erase(input.begin());
|
|
||||||
input.erase(input.begin());
|
|
||||||
|
|
||||||
PRelation r(input[0]);
|
|
||||||
|
|
||||||
if(input[0] == "WHERE")
|
|
||||||
{
|
|
||||||
if(input[0] == "(")
|
|
||||||
{
|
|
||||||
//PCondition c;
|
|
||||||
|
|
||||||
PComparison c;
|
|
||||||
POperand oops1;
|
|
||||||
POperand oops2;
|
|
||||||
POp op;
|
|
||||||
|
|
||||||
while(input[0] != ")")
|
|
||||||
{
|
|
||||||
oops1.setPOperand(input[0]);
|
|
||||||
input.erase(input.begin());
|
|
||||||
|
|
||||||
oops2.setPOperand(input[0]);
|
|
||||||
input.erase(input.begin());
|
|
||||||
|
|
||||||
op.setPOp(input[0]);
|
|
||||||
input.erase(input.begin());
|
|
||||||
|
|
||||||
c.setPComparison(oops1.getPOperand(), op.getPOp(), oops2.getPOperand());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// send delete command to DBEngine
|
|
||||||
}
|
|
||||||
else cout<<"Syntax error!"<<endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
void par_line(vector<string> input, DBEngine &engine) //calls par_command() or par_query() depending on first item from token list
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
• Match the first item in the token list and determine weather this is a command or a query.
|
|
||||||
• Call functions par_command() or par_query();
|
|
||||||
• After either par_command() or par_query() returns, make sure the line ends properly with “;” token
|
|
||||||
*/
|
|
||||||
string tempChar = input.back();
|
|
||||||
|
|
||||||
if (tempChar != ";")
|
|
||||||
{
|
|
||||||
cout<<"ERROR! missing semicolon "<<endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if ( input[0] == "INSERT")
|
|
||||||
{
|
|
||||||
cout<<"\nPassing the following arguments to dbEngine: \nCommand: "<<input[0]<<endl;
|
|
||||||
input.erase(input.begin());
|
|
||||||
vector<string> insertInput = insertCMD(input, engine);
|
|
||||||
cout<<"arguments: "<<endl;
|
|
||||||
displayTokenList(insertInput);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( input[0] == "CREATE")
|
|
||||||
{
|
|
||||||
cout<<"\nPassing the following arguments to dbEngine: \nCommand: "<<input[0]<<endl;
|
|
||||||
input.erase(input.begin());
|
|
||||||
|
|
||||||
vector<string> insertInput = createCMD(input, engine);
|
|
||||||
cout<<"arguments: "<<endl;
|
|
||||||
displayTokenList(insertInput);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( input[0] == "DELETE")
|
|
||||||
{
|
|
||||||
cout<<"\nPassing the following arguments to dbEngine: \nCommand: "<<input[0]<<endl;
|
|
||||||
input.erase(input.begin());
|
|
||||||
|
|
||||||
vector<string> insertInput = deleteCMD(input, engine);
|
|
||||||
cout<<"arguments: "<<endl;
|
|
||||||
displayTokenList(insertInput);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( input[0] == "UPDATE")
|
|
||||||
{
|
|
||||||
cout<<"\nPassing the following arguments to dbEngine: \nCommand: "<<input[0]<<endl;
|
|
||||||
input.erase(input.begin());
|
|
||||||
|
|
||||||
vector<string> insertInput = updateCMD(input, engine);
|
|
||||||
cout<<"arguments: "<<endl;
|
|
||||||
displayTokenList(insertInput);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( input[0] == "SHOW")
|
|
||||||
{
|
|
||||||
cout<<"\nPassing the following arguments to dbEngine: \nCommand: "<<input[0]<<endl;
|
|
||||||
input.erase(input.begin());
|
|
||||||
showCMD(input, engine);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( input[0] == "EXIT")
|
|
||||||
{
|
|
||||||
cout<<"\nPassing the following arguments to dbEngine: \nCommand: "<<input[0]<<endl;
|
|
||||||
input.erase(input.begin());
|
|
||||||
exitCMD(input, engine);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( input[0] == "OPEN")
|
|
||||||
{
|
|
||||||
cout<<"\nPassing the following arguments to dbEngine: \nCommand: "<<input[0]<<endl;
|
|
||||||
input.erase(input.begin());
|
|
||||||
openCMD(input, engine);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( input[0] == "SAVE")
|
|
||||||
{
|
|
||||||
cout<<"\nPassing the following arguments to dbEngine: \nCommand: "<<input[0]<<endl;
|
|
||||||
input.erase(input.begin());
|
|
||||||
saveCMD(input, engine);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( input[0] == "CLOSE")
|
|
||||||
{
|
|
||||||
cout<<"\nPassing the following arguments to dbEngine: \nCommand: "<<input[0]<<endl;
|
|
||||||
input.erase(input.begin());
|
|
||||||
closeCMD(input, engine);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void parse(string input, DBEngine &engine)
|
|
||||||
{
|
|
||||||
engine.storeCommands(input);
|
|
||||||
vector<string> listOfTokens = tokenize(input);
|
|
||||||
par_line(listOfTokens, engine);
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
int main () {
|
|
||||||
|
|
||||||
|
|
||||||
string ss = "INSERT INTO animals VALUES FROM ( Joe , cat , 4 ) ;";
|
|
||||||
string ss2 = "SHOW Dogs ;";
|
|
||||||
string ss3 = "EXIT ; ";
|
|
||||||
|
|
||||||
vector<string> listOfTokens = tokenize(ss);
|
|
||||||
vector<string> listOfTokens2 = tokenize(ss2);
|
|
||||||
vector<string> listOfTokens3 = tokenize(ss3);
|
|
||||||
|
|
||||||
par_line(listOfTokens);
|
|
||||||
par_line(listOfTokens2);
|
|
||||||
par_line(listOfTokens3);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
*/
|
|
36
Relation.cpp
36
Relation.cpp
|
@ -63,6 +63,16 @@ Attribute& Relation::getAttributeByName(string s) {
|
||||||
cout << "Failure to return: the requested attribute does not exist.";
|
cout << "Failure to return: the requested attribute does not exist.";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Relation::isAttribute(string s) {
|
||||||
|
for(int i = 0; i < size; ++i){
|
||||||
|
if (att[i].getName() == s) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
//cout << "Failure to return: the requested attribute does not exist.";
|
||||||
|
}
|
||||||
|
|
||||||
void Relation::renameAttribute(string oldstr, string newstr){
|
void Relation::renameAttribute(string oldstr, string newstr){
|
||||||
this->getAttributeByName(oldstr).setName(newstr);
|
this->getAttributeByName(oldstr).setName(newstr);
|
||||||
}
|
}
|
||||||
|
@ -82,6 +92,8 @@ void Relation::display(){
|
||||||
}
|
}
|
||||||
|
|
||||||
void Relation::insertTuple(vector<string> tuple){
|
void Relation::insertTuple(vector<string> tuple){
|
||||||
|
cout << name << " " << size << endl;
|
||||||
|
cout << tuple.size() << endl;
|
||||||
if (tuple.size() != this->size) {
|
if (tuple.size() != this->size) {
|
||||||
cout << "Failure to insert: the sizes do not match.";
|
cout << "Failure to insert: the sizes do not match.";
|
||||||
}
|
}
|
||||||
|
@ -116,13 +128,29 @@ void Relation::insertFromRelation(Relation r){
|
||||||
}
|
}
|
||||||
|
|
||||||
void Relation::removeTuple(int index){
|
void Relation::removeTuple(int index){
|
||||||
if (index >= this->size) {
|
if (index >= this->size)
|
||||||
cout << "Failure to delete: the requested index is out of bounds.";
|
{
|
||||||
|
cout << "Failure to delete: the requested index is out of bounds." << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
else {
|
else
|
||||||
for (int i = 0; i < att.size(); ++i) {
|
{
|
||||||
|
for (int i = 0; i < att.size(); ++i)
|
||||||
|
{
|
||||||
att[i].removeCell(index);
|
att[i].removeCell(index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Relation::removeFromTuple(int rindex, int aindex)
|
||||||
|
{
|
||||||
|
if (rindex >= this->size)
|
||||||
|
{
|
||||||
|
cout << "Failure to delete: the requested index is out of bounds." << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
att[rindex].removeCell(aindex);
|
||||||
|
}
|
||||||
|
}
|
|
@ -19,10 +19,12 @@ public:
|
||||||
vector<Attribute> getAttributes();
|
vector<Attribute> getAttributes();
|
||||||
vector<string> getAttributeNames();
|
vector<string> getAttributeNames();
|
||||||
Attribute& getAttributeByName(string s);
|
Attribute& getAttributeByName(string s);
|
||||||
|
bool isAttribute(string s);
|
||||||
void renameAttribute(string oldstr, string newstr);
|
void renameAttribute(string oldstr, string newstr);
|
||||||
int getSize();
|
int getSize();
|
||||||
void display();
|
void display();
|
||||||
void insertTuple(vector<string> tuple); //assuming they are in order
|
void insertTuple(vector<string> tuple); //assuming they are in order
|
||||||
void insertFromRelation(Relation r);
|
void insertFromRelation(Relation r);
|
||||||
void removeTuple(int index);
|
void removeTuple(int index);
|
||||||
|
void removeFromTuple(int rindex, int aindex);
|
||||||
};
|
};
|
BIN
test
Executable file
BIN
test
Executable file
Binary file not shown.
10
test.cpp
10
test.cpp
|
@ -1,6 +1,6 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "Parserv3.h"
|
#include "Parser.h"
|
||||||
//#include "Condition.h"
|
//#include "Condition.h"
|
||||||
#include "DBEngine.h"
|
#include "DBEngine.h"
|
||||||
|
|
||||||
|
@ -48,4 +48,12 @@ int main () {
|
||||||
//engine.getTableFromName("MoarFood").display();
|
//engine.getTableFromName("MoarFood").display();
|
||||||
|
|
||||||
engine.crossProduct(engine.getTableFromName("Food"), engine.getTableFromName("MoarFood")).display();
|
engine.crossProduct(engine.getTableFromName("Food"), engine.getTableFromName("MoarFood")).display();
|
||||||
|
string x;
|
||||||
|
cout << "Enter DBMS Commands: ";
|
||||||
|
while(getline(cin, x))
|
||||||
|
{
|
||||||
|
//cout << x << endl;
|
||||||
|
parse(x, engine);
|
||||||
|
cout << "Enter DBMS Commands: ";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue