2016-09-18 20:01:57 +08:00
|
|
|
/*=============================================================================
|
|
|
|
# Filename: ResultSet.cpp
|
|
|
|
# Author: Bookug Lobert
|
|
|
|
# Mail: 1181955272@qq.com
|
|
|
|
# Last Modified: 2015-10-24 22:01
|
|
|
|
# Description: implement functions in ResultSet.h
|
|
|
|
=============================================================================*/
|
|
|
|
|
|
|
|
#include "ResultSet.h"
|
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
ResultSet::ResultSet()
|
|
|
|
{
|
|
|
|
this->select_var_num = 0;
|
|
|
|
this->var_name = NULL;
|
|
|
|
this->ansNum = 0;
|
|
|
|
this->answer = NULL;
|
|
|
|
this->stream = NULL;
|
2016-09-25 22:14:36 +08:00
|
|
|
this->useStream = false;
|
2016-09-18 20:01:57 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
ResultSet::~ResultSet()
|
|
|
|
{
|
|
|
|
delete[] this->var_name;
|
2016-09-25 22:14:36 +08:00
|
|
|
if (!this->useStream)
|
|
|
|
{
|
|
|
|
for(int i = 0; i < this->ansNum; i ++)
|
|
|
|
{
|
|
|
|
delete[] this->answer[i];
|
|
|
|
}
|
|
|
|
delete[] this->answer;
|
|
|
|
}
|
|
|
|
else
|
2016-09-18 20:01:57 +08:00
|
|
|
{
|
2016-09-25 22:14:36 +08:00
|
|
|
delete this->stream; //maybe NULL
|
2016-09-18 20:01:57 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ResultSet::ResultSet(int _v_num, const string* _v_names)
|
|
|
|
{
|
|
|
|
this->select_var_num = _v_num;
|
|
|
|
this->var_name = new string[this->select_var_num];
|
|
|
|
for(int i = 0; i < this->select_var_num; i ++)
|
|
|
|
{
|
|
|
|
this->var_name[i] = _v_names[i];
|
|
|
|
}
|
2016-09-25 22:14:36 +08:00
|
|
|
this->ansNum = 0;
|
|
|
|
this->answer = NULL;
|
2016-09-18 20:01:57 +08:00
|
|
|
this->stream = NULL;
|
2016-09-25 22:14:36 +08:00
|
|
|
this->useStream = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ResultSet::setUseStream()
|
|
|
|
{
|
|
|
|
this->useStream = true;
|
2016-09-18 20:01:57 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ResultSet::setVar(const vector<string> & _var_names)
|
|
|
|
{
|
|
|
|
this->select_var_num = _var_names.size();
|
|
|
|
this->var_name = new string[this->select_var_num];
|
|
|
|
for(int i = 0; i < this->select_var_num; i++)
|
|
|
|
{
|
|
|
|
this->var_name[i] = _var_names[i];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//convert to usual string
|
|
|
|
string
|
|
|
|
ResultSet::to_str()
|
|
|
|
{
|
|
|
|
if(this->ansNum == 0)
|
|
|
|
{
|
|
|
|
return "[empty result]\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
stringstream _buf;
|
|
|
|
|
|
|
|
//#ifdef DEBUG_PRECISE
|
2016-09-25 22:14:36 +08:00
|
|
|
//_buf << "There has answer: " << this->ansNum << endl;
|
2016-09-18 20:01:57 +08:00
|
|
|
_buf << this->var_name[0];
|
|
|
|
for(int i = 1; i < this->select_var_num; i ++)
|
|
|
|
{
|
2017-01-16 14:12:57 +08:00
|
|
|
_buf << '\t' << this->var_name[i];
|
2016-09-18 20:01:57 +08:00
|
|
|
}
|
2017-01-16 14:12:57 +08:00
|
|
|
_buf << '\n';
|
2016-09-18 20:01:57 +08:00
|
|
|
//#endif
|
2016-09-25 22:14:36 +08:00
|
|
|
if (!this->useStream)
|
2016-09-18 20:01:57 +08:00
|
|
|
{
|
2016-09-25 22:14:36 +08:00
|
|
|
for(int i = 0; i < this->ansNum; i++)
|
|
|
|
{
|
2016-09-18 20:01:57 +08:00
|
|
|
#ifdef DEBUG_PRECISE
|
2016-09-25 22:14:36 +08:00
|
|
|
printf("to_str: well!\n"); //just for debug!
|
2016-09-18 20:01:57 +08:00
|
|
|
#endif //DEBUG_PRECISE
|
2017-01-16 14:12:57 +08:00
|
|
|
_buf << Util::node2string(this->answer[i][0].c_str());
|
2016-09-18 20:01:57 +08:00
|
|
|
for(int j = 1; j < this->select_var_num; j++)
|
|
|
|
{
|
2017-01-16 14:12:57 +08:00
|
|
|
_buf << '\t' << Util::node2string(this->answer[i][j].c_str());
|
2016-09-18 20:01:57 +08:00
|
|
|
}
|
2017-01-16 14:12:57 +08:00
|
|
|
_buf << '\n';
|
2016-09-18 20:01:57 +08:00
|
|
|
}
|
|
|
|
#ifdef DEBUG_PRECISE
|
2016-09-25 22:14:36 +08:00
|
|
|
printf("to_str: ends!\n"); //just for debug!
|
2016-09-18 20:01:57 +08:00
|
|
|
#endif //DEBUG_PRECISE
|
2016-09-25 22:14:36 +08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
printf("using stream to produce to_str()!\n");
|
|
|
|
_buf << this->readAllFromStream();
|
|
|
|
}
|
2016-09-18 20:01:57 +08:00
|
|
|
return _buf.str();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ResultSet::output(FILE* _fp)
|
|
|
|
{
|
2016-09-25 22:14:36 +08:00
|
|
|
if (this->useStream)
|
2016-09-18 20:01:57 +08:00
|
|
|
{
|
2016-09-25 22:14:36 +08:00
|
|
|
fprintf(_fp, "%s", this->var_name[0].c_str());
|
|
|
|
for(int i = 1; i < this->select_var_num; i++)
|
|
|
|
{
|
|
|
|
fprintf(_fp, "\t%s", this->var_name[i].c_str());
|
|
|
|
}
|
|
|
|
fprintf(_fp, "\n");
|
2016-09-18 20:01:57 +08:00
|
|
|
|
2016-09-25 22:14:36 +08:00
|
|
|
if(this->ansNum == 0)
|
2016-09-18 20:01:57 +08:00
|
|
|
{
|
2016-09-25 22:14:36 +08:00
|
|
|
fprintf(_fp, "[empty result]\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
const Bstr* bp;
|
|
|
|
for(int i = 0; i < this->ansNum; i++)
|
|
|
|
{
|
|
|
|
if (this->output_limit != -1 && i == this->output_offset + this->output_limit)
|
|
|
|
break;
|
|
|
|
bp = this->stream->read();
|
|
|
|
if (i >= this->output_offset)
|
2016-09-18 20:01:57 +08:00
|
|
|
{
|
2017-01-16 14:12:57 +08:00
|
|
|
fprintf(_fp, "%s", Util::node2string(bp[0].getStr()).c_str());
|
2016-09-25 22:14:36 +08:00
|
|
|
//fprintf(_fp, "%s", bp->getStr());
|
|
|
|
for(int j = 1; j < this->select_var_num; j++)
|
|
|
|
{
|
2017-01-16 14:12:57 +08:00
|
|
|
fprintf(_fp, "\t%s", Util::node2string(bp[j].getStr()).c_str());
|
2016-09-25 22:14:36 +08:00
|
|
|
//bp = this->stream.read();
|
|
|
|
//fprintf(_fp, "\t%s", bp->getStr());
|
|
|
|
}
|
|
|
|
fprintf(_fp, "\n");
|
2016-09-18 20:01:57 +08:00
|
|
|
}
|
|
|
|
}
|
2016-09-25 22:14:36 +08:00
|
|
|
}
|
2017-01-16 14:12:57 +08:00
|
|
|
else {
|
|
|
|
fprintf(_fp, "%s", this->to_str().c_str());
|
|
|
|
}
|
2016-09-18 20:01:57 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ResultSet::openStream(std::vector<int> &_keys, std::vector<bool> &_desc, int _output_offset, int _output_limit)
|
|
|
|
{
|
2016-09-25 22:14:36 +08:00
|
|
|
if (this->useStream)
|
2016-09-18 20:01:57 +08:00
|
|
|
{
|
2016-09-25 22:14:36 +08:00
|
|
|
#ifdef DEBUG_STREAM
|
|
|
|
vector<int> debug_keys;
|
|
|
|
vector<bool> debug_desc;
|
|
|
|
for(int i = 0; i < this->select_var_num; ++i)
|
|
|
|
{
|
|
|
|
debug_keys.push_back(i);
|
|
|
|
debug_desc.push_back(false);
|
|
|
|
}
|
2016-09-18 20:01:57 +08:00
|
|
|
#endif
|
2016-09-25 22:14:36 +08:00
|
|
|
if(this->stream != NULL)
|
|
|
|
{
|
|
|
|
delete this->stream;
|
|
|
|
this->stream = NULL;
|
|
|
|
}
|
2016-09-18 20:01:57 +08:00
|
|
|
#ifdef DEBUG_STREAM
|
2016-09-25 22:14:36 +08:00
|
|
|
if(this->ansNum > 0)
|
|
|
|
this->stream = new Stream(debug_keys, debug_desc, this->ansNum, this->select_var_num, true);
|
2016-09-18 20:01:57 +08:00
|
|
|
#else
|
2016-09-25 22:14:36 +08:00
|
|
|
if(this->ansNum > 0)
|
|
|
|
this->stream = new Stream(_keys, _desc, this->ansNum, this->select_var_num, _keys.size() > 0);
|
2016-09-18 20:01:57 +08:00
|
|
|
#endif //DEBUG_STREAM
|
2016-09-25 22:14:36 +08:00
|
|
|
this->output_offset = _output_offset;
|
|
|
|
this->output_limit = _output_limit;
|
|
|
|
}
|
2016-09-18 20:01:57 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ResultSet::resetStream()
|
|
|
|
{
|
2016-09-25 22:14:36 +08:00
|
|
|
if (this->useStream)
|
|
|
|
{
|
|
|
|
//this->stream.reset();
|
|
|
|
if(this->stream != NULL)
|
|
|
|
this->stream->setEnd();
|
|
|
|
}
|
2016-09-18 20:01:57 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ResultSet::writeToStream(string& _s)
|
|
|
|
{
|
2016-09-25 22:14:36 +08:00
|
|
|
if (this->useStream)
|
|
|
|
{
|
|
|
|
if(this->stream != NULL)
|
|
|
|
this->stream->write(_s.c_str(), _s.length());
|
|
|
|
}
|
2016-09-18 20:01:57 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
//QUERY: how to manage when large?
|
|
|
|
string
|
|
|
|
ResultSet::readAllFromStream()
|
|
|
|
{
|
|
|
|
stringstream buf;
|
2016-09-25 22:14:36 +08:00
|
|
|
if (this->useStream)
|
2016-09-18 20:01:57 +08:00
|
|
|
{
|
2016-09-25 22:14:36 +08:00
|
|
|
if(this->stream == NULL)
|
|
|
|
return "";
|
|
|
|
|
|
|
|
this->resetStream();
|
|
|
|
const Bstr* bp;
|
|
|
|
for(int i = 0; i < this->ansNum; i++)
|
2016-09-18 20:01:57 +08:00
|
|
|
{
|
2016-09-25 22:14:36 +08:00
|
|
|
if (this->output_limit != -1 && i == this->output_offset + this->output_limit)
|
|
|
|
break;
|
|
|
|
bp = this->stream->read();
|
|
|
|
if (i >= this->output_offset)
|
2016-09-18 20:01:57 +08:00
|
|
|
{
|
2016-09-25 22:14:36 +08:00
|
|
|
buf << bp[0].getStr();
|
|
|
|
for(int j = 1; j < this->select_var_num; ++j)
|
|
|
|
{
|
|
|
|
buf << "\t" << bp[j].getStr();
|
|
|
|
}
|
2016-09-18 20:01:57 +08:00
|
|
|
|
2016-09-25 22:14:36 +08:00
|
|
|
//buf << bp->getStr();
|
|
|
|
//for(int j = 1; j < this->select_var_num; j++)
|
|
|
|
//{
|
|
|
|
//bp = this->stream.read();
|
|
|
|
//buf << "\t" << bp->getStr();
|
|
|
|
//}
|
|
|
|
buf << "\n";
|
|
|
|
}
|
2016-09-18 20:01:57 +08:00
|
|
|
}
|
2016-09-25 22:14:36 +08:00
|
|
|
}
|
2016-09-18 20:01:57 +08:00
|
|
|
return buf.str();
|
|
|
|
}
|
|
|
|
|
|
|
|
const Bstr*
|
|
|
|
ResultSet::getOneRecord()
|
|
|
|
{
|
2016-09-25 22:14:36 +08:00
|
|
|
if (this->useStream)
|
2016-09-18 20:01:57 +08:00
|
|
|
{
|
2016-09-25 22:14:36 +08:00
|
|
|
if(this->stream == NULL)
|
|
|
|
{
|
|
|
|
fprintf(stderr, "ResultSet::getOneRecord(): no results now!\n");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
if(this->stream->isEnd())
|
|
|
|
{
|
|
|
|
fprintf(stderr, "ResultSet::getOneRecord(): read till end now!\n");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
//NOTICE:this is one record, and donot free the memory!
|
|
|
|
//NOTICE:Bstr[] but only one element, used as Bstr*
|
|
|
|
return this->stream->read();
|
2016-09-18 20:01:57 +08:00
|
|
|
}
|
2016-09-25 22:14:36 +08:00
|
|
|
else
|
2016-09-18 20:01:57 +08:00
|
|
|
{
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|