#include "dba/dba.h"
#include <iostream>
#include <sstream>
class Keyboard {
public:
int mKeys;
};
class KeyboardFilter : public dba::StoreableFilter<Keyboard> {
public:
KeyboardFilter() {};
KeyboardFilter(Keyboard& pData) : dba::StoreableFilter<Keyboard>(pData) {};
virtual std::string toString(const dba::ConvSpec& pSpec) const throw (dba::StoreableFilterException) {
std::stringstream d;
d << mMember->mKeys;
return d.str();
}
virtual bool isNull() const { return false; }
virtual void fromInt(const dba::ConvSpec& pSpec, int pData) throw (dba::StoreableFilterException) {
mMember->mKeys = pData;
};
virtual void fromDouble(const dba::ConvSpec& pSpec, double pData) throw (dba::StoreableFilterException) {
mMember->mKeys = static_cast<int>(pData);
};
virtual void fromString(const dba::ConvSpec& pSpec, const std::string& pData) throw (dba::StoreableFilterException) {
std::istringstream ostr(pData);
if (!ostr >> mMember->mKeys)
throw dba::StoreableFilterException("Failed to convert string to int");
};
virtual dba::Database::StoreType getPrefferedStoreType() const { return dba::Database::INTEGER; }
virtual void fromNull() throw (dba::StoreableFilterException) {
mMember->mKeys = 0;
};
virtual ~KeyboardFilter() {};
};
dba::SQL table(
"CREATE TABLE data ("
" intval INT,"
" strval VARCHAR"
")");
void
simple_queries(dba::SQLArchive& pAr) {
pAr.getOStream().sendUpdate(
dba::SQL("INSERT INTO data(intval,strval) VALUES(:d,:s)") << 1 << "test"
);
std::string strval;
int intval;
std::auto_ptr<dba::DbResult> res(
pAr.getIStream().sendQuery(dba::SQL("SELECT strval,intval FROM data").into(strval).into(intval))
);
while(res->fetchRow()) {
std::cout << "intval: "<< intval << " strval: "
<< strval << std::endl;
};
dba::SQL sel1("SELECT intval FROM data");
sel1.into(intval);
dba::SQL sel2(" WHERE strval LIKE '%:s%'");
sel2 << "te";
res.reset(pAr.getIStream().sendQuery(sel1 + sel2));
while(res->fetchRow()) {
std::cout << "intval: "<< intval << std::endl;
};
};
void
custom_conversions(dba::SQLArchive& pAr) {
Keyboard k;
k.mKeys = 102;
pAr.getOStream().sendUpdate(dba::SQL("INSERT INTO data(intval) VALUES(:d)") << new KeyboardFilter(k));
pAr.mapType(typeid(Keyboard), new KeyboardFilter());
k.mKeys = 103;
pAr.getOStream().sendUpdate(dba::SQL("INSERT INTO data(intval) VALUES(:d)") << k);
std::vector<int> intvals;
intvals.push_back(102);
intvals.push_back(103);
dba::SQL sel1(dba::SQL("SELECT intval FROM data").into(k));
dba::SQL sel2(dba::SQL(" WHERE intval IN ") + dba::SQLUtils::createIN(intvals));
std::auto_ptr<dba::DbResult> res(pAr.getIStream().sendQuery(sel1 + sel2));
while(res->fetchRow()) {
std::cout << "got keyboard with " << k.mKeys << " keys" << std::endl;
};
};
int
main (int argc, char** argv) {
try {
dba::SQLArchive ar;
unlink("foobasefile.sqt3");
ar.open("dbasqlite3-static", "dbname=foobasefile.sqt3");
ar.getOStream().sendUpdate(table);
simple_queries(ar);
custom_conversions(ar);
return 0;
} catch (const dba::SQLException& pEx) {
std::cout << "SQL Error: " << pEx.what() << std::endl;
std::cout << "While executing: " << std::endl
<< pEx.getQuery() << std::endl;
} catch (const dba::Exception& pEx) {
std::cout << "Error: " << pEx.what() << std::endl;
return -1;
};
};