aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortomsmeding <hallo@tomsmeding.nl>2015-05-23 20:08:08 +0200
committertomsmeding <hallo@tomsmeding.nl>2015-05-23 20:08:08 +0200
commit0dee65740a538a2cf722d1362042aa81252b6ba5 (patch)
tree10348babd6d3303e1769e9d60d68163bbe7bb618
parentf1d3ad1f73bd82e98de2a3f4709e33ae0acdf46e (diff)
Improve errors msgs, generalise find and add delete query
-rw-r--r--query.cpp116
-rw-r--r--query.h8
2 files changed, 39 insertions, 85 deletions
diff --git a/query.cpp b/query.cpp
index a753472..8dee06f 100644
--- a/query.cpp
+++ b/query.cpp
@@ -26,10 +26,10 @@ void CreateQuery::setHeader(const ColHeader *hd){
}
QueryResult CreateQuery::execute(map<string,Table> &tables){
- if(nc==0)return QueryResult(0,"zero nc");
- if(header==NULL)return QueryResult(0,"null header");
+ if(nc==0)return QueryResult(0,"zero nc (CQ:ex)");
+ if(header==NULL)return QueryResult(0,"null header (CQ:ex)");
const map<string,Table>::const_iterator tit=tables.find(tablename);
- if(tit!=tables.cend())return QueryResult(0,"existing table");
+ if(tit!=tables.cend())return QueryResult(0,"existing table (CQ:ex)");
tables.emplace(piecewise_construct,
forward_as_tuple(tablename),
forward_as_tuple(tablename,nc,header));
@@ -40,11 +40,14 @@ QueryResult CreateQuery::execute(map<string,Table> &tables){
FindQuery::FindQuery(void):limit(-1){};
pair<vector<map<string,Row>::const_iterator>,string> FindQuery::executeIterators(map<string,Table> &tables){
- if(limit==0)return {{},"zero limit"};
- int i,j;
const map<string,Table>::const_iterator tit=tables.find(tablename);
- if(tit==tables.cend())return {{},"non-existent table"};
- const Table &table=tit->second;
+ if(tit==tables.cend())return {{},"non-existent table (FQ:eI)"};
+ return executeIterators(tit->second);
+}
+
+pair<vector<map<string,Row>::const_iterator>,string> FindQuery::executeIterators(const Table &table){
+ if(limit==0)return {{},"zero limit (FQ:eI)"};
+ int i,j;
for(i=0;i<(int)where.size();i++){
if(where[i].col==0)break;
@@ -82,46 +85,14 @@ pair<vector<map<string,Row>::const_iterator>,string> FindQuery::executeIterators
}
QueryResult FindQuery::execute(map<string,Table> &tables){
- if(limit==0)return QueryResult(0,"zero limit");
- int i,j;
- const map<string,Table>::const_iterator tit=tables.find(tablename);
- if(tit==tables.cend())return QueryResult(0,"non-existent table");
- const Table &table=tit->second;
-
- for(i=0;i<(int)where.size();i++){
- if(where[i].col==0)break;
+ pair<vector<map<string,Row>::const_iterator>,string> ret=executeIterators(tables);
+ QueryResult qres;
+ qres.res=ret.first.size();
+ for(int i=0;i<qres.res;i++){
+ qres.rows.push_back(ret.first[i]->second);
}
- if(i!=(int)where.size()){
- const map<string,Row>::const_iterator rit=table.rows.find(serialise(table.header[0],where[i].value));
- if(rit==table.rows.cend())return QueryResult(0);
- const Row &row=rit->second;
- for(j=0;j<(int)where.size();j++){
- if(j==i)continue;
- const int col=where[j].col;
- if(riCompare(table.header[col],row.items[col],where[j].value)!=0)break;
- }
- if(j!=(int)where.size())return QueryResult(0);
- else return QueryResult(1,{row});
- }
-
- typedef map<string,Row>::const_iterator cit_t;
-
- cit_t end=table.rows.cend();
- QueryResult ret;
- for(cit_t it=table.rows.cbegin();it!=end;it++){
- //if(serialise(it->second.table->header[0],it->second.items[0])==key)
- // ret.emplace_back(it->second);
- for(i=0;i<(int)where.size();i++){
- const int col=where[i].col;
- if(riCompare(table.header[col],it->second.items[col],where[i].value)!=0)break;
- }
- if(i==(int)where.size()){
- ret.res++;
- ret.rows.emplace_back(it->second);
- if(ret.res==limit)return ret;
- }
- }
- return ret;
+ qres.msg=ret.second;
+ return qres;
}
@@ -130,13 +101,13 @@ InsertQuery::InsertQuery(Row &&_r):row(move(_r)){}
QueryResult InsertQuery::execute(map <string,Table> &tables){
map<string,Table>::iterator tit=tables.find(tablename);
- if(tit==tables.end())return QueryResult(0,"non-existent table");
+ if(tit==tables.end())return QueryResult(0,"non-existent table (IQ:ex)");
Table &table=tit->second;
- if(table.nc!=row.nc)return QueryResult(0,"non-conformant row width");
+ if(table.nc!=row.nc)return QueryResult(0,"non-conformant row width (IQ:ex)");
const string primkey=serialise(table.header[0],row.items[0]);
const map<string,Row>::const_iterator rit=table.rows.find(primkey);
- if(rit!=table.rows.cend())return QueryResult(0,"existing primary key");
+ if(rit!=table.rows.cend())return QueryResult(0,"existing primary key (IQ:ex)");
table.rows.insert(make_pair(primkey,row));
return QueryResult(1);
}
@@ -145,43 +116,18 @@ QueryResult InsertQuery::execute(map <string,Table> &tables){
DeleteQuery::DeleteQuery(void){};
QueryResult DeleteQuery::execute(map<string,Table> &tables){
- int i,j;
- map<string,Table>::iterator tit=tables.find(tablename);
- if(tit==tables.end())return QueryResult(0,"non-existent table");
+ const map<string,Table>::iterator tit=tables.find(tablename);
+ if(tit==tables.cend())return {{},"non-existent table (DQ:ex)"};
Table &table=tit->second;
- for(i=0;i<(int)where.size();i++){
- if(where[i].col==0)break;
- }
- if(i!=(int)where.size()){
- const map<string,Row>::const_iterator rit=table.rows.find(serialise(table.header[0],where[i].value));
- if(rit==table.rows.cend())return QueryResult(0);
- const Row &row=rit->second;
- for(j=0;j<(int)where.size();j++){
- if(j==i)continue;
- const int col=where[j].col;
- if(riCompare(table.header[col],row.items[col],where[j].value)!=0)break;
- }
- if(j!=(int)where.size())return QueryResult(0);
- table.rows.erase(rit);
- return QueryResult(1);
- }
-
- typedef map<string,Row>::const_iterator cit_t;
-
- cit_t end=table.rows.cend();
- QueryResult ret;
- for(cit_t it=table.rows.cbegin();it!=end;it++){
- //if(serialise(it->second.table->header[0],it->second.items[0])==key)
- // ret.emplace_back(it->second);
- for(i=0;i<(int)where.size();i++){
- const int col=where[i].col;
- if(riCompare(table.header[col],it->second.items[col],where[i].value)!=0)break;
- }
- if(i==(int)where.size()){
- ret.res++;
- ret.rows.emplace_back(it->second);
- }
+ FindQuery fqu;
+ fqu.tablename=tablename;
+ fqu.where=where;
+ pair<vector<map<string,Row>::const_iterator>,string> ret=fqu.executeIterators(table);
+ if(ret.second.size()!=0)return QueryResult(0,ret.second);
+ map<string,Row>::const_iterator it;
+ for(int i=0;i<ret.first.size();i++){
+ table.rows.erase(ret.first[i]);
}
- return ret;
+ return QueryResult(ret.first.size());
}
diff --git a/query.h b/query.h
index 2b4d17d..1e06264 100644
--- a/query.h
+++ b/query.h
@@ -11,6 +11,7 @@ using namespace std;
struct WhereClause{
int col;
RowItem value;
+
WhereClause(void);
WhereClause(const int _c,const RowItem &_v);
};
@@ -20,6 +21,7 @@ struct QueryResult{
int res;
vector<Row> rows;
string msg; //empty message indicates success
+
QueryResult(void);
QueryResult(int);
QueryResult(int,const vector<Row>&);
@@ -30,12 +32,14 @@ struct QueryResult{
struct Query{
string tablename;
+
virtual QueryResult execute(map<string,Table>&);
};
struct CreateQuery : public Query{
int nc;
ColHeader *header;
+
CreateQuery(void);
void setHeader(const ColHeader *hd);
QueryResult execute(map<string,Table> &tables);
@@ -44,13 +48,16 @@ struct CreateQuery : public Query{
struct FindQuery : public Query{
unsigned int limit; //-1=unlimited
vector<WhereClause> where;
+
FindQuery(void);
pair<vector<map<string,Row>::const_iterator>,string> executeIterators(map<string,Table> &tables);
+ pair<vector<map<string,Row>::const_iterator>,string> executeIterators(const Table &table);
QueryResult execute(map<string,Table> &tables);
};
struct InsertQuery : public Query{
Row row;
+
InsertQuery(const Row &_r);
InsertQuery(Row &&_r);
QueryResult execute(map<string,Table> &tables);
@@ -58,6 +65,7 @@ struct InsertQuery : public Query{
struct DeleteQuery : public Query{
vector<WhereClause> where;
+
DeleteQuery(void);
QueryResult execute(map<string,Table> &tables);
};