#include "query.h" #include using namespace std; WhereClause::WhereClause(void):col(0){} WhereClause::WhereClause(const int _c,const RowItem &_v):col(_c),value(_v){} QueryResult::QueryResult(void):res(0){} QueryResult::QueryResult(int _res):res(_res){} QueryResult::QueryResult(int _res,const vector &_rows):res(_res),rows(_rows){} QueryResult::QueryResult(int _res,const vector &_rows,const string &_m):res(_res),rows(_rows),msg(_m){} QueryResult::QueryResult(int _res,const string &_m):res(_res),msg(_m){} QueryResult Query::execute(map &tables){return QueryResult(-1);} CreateQuery::CreateQuery(void):nc(0),header(NULL){} void CreateQuery::setHeader(const ColHeader *hd){ header=new ColHeader[nc]; memcpy(header,hd,nc*sizeof(ColHeader)); } QueryResult CreateQuery::execute(map &tables){ if(nc==0)return QueryResult(0,"zero nc"); if(header==NULL)return QueryResult(0,"null header"); const map::const_iterator tit=tables.find(tablename); if(tit!=tables.cend())return QueryResult(0,"existing table"); tables.emplace(piecewise_construct, forward_as_tuple(tablename), forward_as_tuple(tablename,nc,header)); return QueryResult(1); } FindQuery::FindQuery(void):limit(-1),sort(0){}; 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; } 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; } InsertQuery::InsertQuery(const Row &_r):row(_r){} 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"); Table &table=tit->second; if(table.nc!=row.nc)return QueryResult(0,"non-conformant row width"); 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"); table.rows.insert(make_pair(primkey,row)); return QueryResult(1); }