From 0dee65740a538a2cf722d1362042aa81252b6ba5 Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Sat, 23 May 2015 20:08:08 +0200 Subject: Improve errors msgs, generalise find and add delete query --- query.cpp | 116 +++++++++++++++++--------------------------------------------- query.h | 8 +++++ 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 &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::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 &tables){ FindQuery::FindQuery(void):limit(-1){}; pair::const_iterator>,string> FindQuery::executeIterators(map &tables){ - if(limit==0)return {{},"zero limit"}; - int i,j; const map::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::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::const_iterator>,string> FindQuery::executeIterators } QueryResult FindQuery::execute(map &tables){ - if(limit==0)return QueryResult(0,"zero limit"); - int i,j; - const map::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::const_iterator>,string> ret=executeIterators(tables); + QueryResult qres; + qres.res=ret.first.size(); + for(int i=0;isecond); } - if(i!=(int)where.size()){ - const map::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::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 &tables){ map::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::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 &tables){ DeleteQuery::DeleteQuery(void){}; QueryResult DeleteQuery::execute(map &tables){ - int i,j; - map::iterator tit=tables.find(tablename); - if(tit==tables.end())return QueryResult(0,"non-existent table"); + const map::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::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::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::const_iterator>,string> ret=fqu.executeIterators(table); + if(ret.second.size()!=0)return QueryResult(0,ret.second); + map::const_iterator it; + for(int i=0;i rows; string msg; //empty message indicates success + QueryResult(void); QueryResult(int); QueryResult(int,const vector&); @@ -30,12 +32,14 @@ struct QueryResult{ struct Query{ string tablename; + virtual QueryResult execute(map&); }; struct CreateQuery : public Query{ int nc; ColHeader *header; + CreateQuery(void); void setHeader(const ColHeader *hd); QueryResult execute(map &tables); @@ -44,13 +48,16 @@ struct CreateQuery : public Query{ struct FindQuery : public Query{ unsigned int limit; //-1=unlimited vector where; + FindQuery(void); pair::const_iterator>,string> executeIterators(map &tables); + pair::const_iterator>,string> executeIterators(const Table &table); QueryResult execute(map &tables); }; struct InsertQuery : public Query{ Row row; + InsertQuery(const Row &_r); InsertQuery(Row &&_r); QueryResult execute(map &tables); @@ -58,6 +65,7 @@ struct InsertQuery : public Query{ struct DeleteQuery : public Query{ vector where; + DeleteQuery(void); QueryResult execute(map &tables); }; -- cgit v1.2.3-54-g00ecf