diff options
author | tomsmeding <hallo@tomsmeding.nl> | 2015-05-23 18:50:21 +0200 |
---|---|---|
committer | tomsmeding <hallo@tomsmeding.nl> | 2015-05-23 18:50:21 +0200 |
commit | f1d3ad1f73bd82e98de2a3f4709e33ae0acdf46e (patch) | |
tree | 6563e5a87d5f230ce9379963a14af55a2176ebb6 | |
parent | 91140dcb42f441f8883b204fdfea367c133def9e (diff) |
Start delete query and generalise iterator find
-rw-r--r-- | query.cpp | 89 | ||||
-rw-r--r-- | query.h | 7 |
2 files changed, 94 insertions, 2 deletions
@@ -37,7 +37,49 @@ QueryResult CreateQuery::execute(map<string,Table> &tables){ } -FindQuery::FindQuery(void):limit(-1),sort(0){}; +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; + + 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.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<map<string,Row>::const_iterator> v; + v.push_back(rit); + return {v,""}; + } + + typedef map<string,Row>::const_iterator cit_t; + + cit_t end=table.rows.end(); + pair<vector<map<string,Row>::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<string,Table> &tables){ if(limit==0)return QueryResult(0,"zero limit"); @@ -98,3 +140,48 @@ QueryResult InsertQuery::execute(map <string,Table> &tables){ table.rows.insert(make_pair(primkey,row)); return QueryResult(1); } + + +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"); + 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); + } + } + return ret; +} @@ -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<WhereClause> where; FindQuery(void); + pair<vector<map<string,Row>::const_iterator>,string> executeIterators(map<string,Table> &tables); QueryResult execute(map<string,Table> &tables); }; @@ -56,3 +56,8 @@ struct InsertQuery : public Query{ QueryResult execute(map<string,Table> &tables); }; +struct DeleteQuery : public Query{ + vector<WhereClause> where; + DeleteQuery(void); + QueryResult execute(map<string,Table> &tables); +}; |