aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortomsmeding <hallo@tomsmeding.nl>2015-05-23 18:50:21 +0200
committertomsmeding <hallo@tomsmeding.nl>2015-05-23 18:50:21 +0200
commitf1d3ad1f73bd82e98de2a3f4709e33ae0acdf46e (patch)
tree6563e5a87d5f230ce9379963a14af55a2176ebb6
parent91140dcb42f441f8883b204fdfea367c133def9e (diff)
Start delete query and generalise iterator find
-rw-r--r--query.cpp89
-rw-r--r--query.h7
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<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;
+}
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<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);
+};