From f1d3ad1f73bd82e98de2a3f4709e33ae0acdf46e Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Sat, 23 May 2015 18:50:21 +0200 Subject: Start delete query and generalise iterator find --- query.cpp | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- query.h | 7 ++++- 2 files changed, 94 insertions(+), 2 deletions(-) diff --git a/query.cpp b/query.cpp index 2e1606f..a753472 100644 --- a/query.cpp +++ b/query.cpp @@ -37,7 +37,49 @@ QueryResult CreateQuery::execute(map &tables){ } -FindQuery::FindQuery(void):limit(-1),sort(0){}; +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; + + 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.end())return {{},""}; + 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 {{},""}; + vector::const_iterator> v; + v.push_back(rit); + return {v,""}; + } + + typedef map::const_iterator cit_t; + + cit_t end=table.rows.end(); + pair::const_iterator>,string> ret; + for(cit_t it=table.rows.begin();it!=end;it++){ + 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.first.push_back(it); + if(ret.first.size()==limit)return ret; + } + } + return ret; +} QueryResult FindQuery::execute(map &tables){ if(limit==0)return QueryResult(0,"zero limit"); @@ -98,3 +140,48 @@ QueryResult InsertQuery::execute(map &tables){ table.rows.insert(make_pair(primkey,row)); return QueryResult(1); } + + +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"); + 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); + } + } + return ret; +} diff --git a/query.h b/query.h index 5018f9d..2b4d17d 100644 --- a/query.h +++ b/query.h @@ -43,9 +43,9 @@ struct CreateQuery : public Query{ struct FindQuery : public Query{ unsigned int limit; //-1=unlimited - int sort; //0=no sort, 1=sort, -1=reverse sort vector where; FindQuery(void); + pair::const_iterator>,string> executeIterators(map &tables); QueryResult execute(map &tables); }; @@ -56,3 +56,8 @@ struct InsertQuery : public Query{ QueryResult execute(map &tables); }; +struct DeleteQuery : public Query{ + vector where; + DeleteQuery(void); + QueryResult execute(map &tables); +}; -- cgit v1.2.3-54-g00ecf