14#include "tkdb_table.h"
33 glog.set_class(
"db_table");
41 glog.set_method(
tkstring::Form(
"get_column_list(%s)",fName.data()));
44 int rc = sqlite3_prepare_v2(fDataBase,
tkstring::form(
"PRAGMA table_info('%s');",fName.data()), -1, &stmt,
nullptr);
46 glog <<
error_v <<
"SQL error: " << sqlite3_errmsg(fDataBase) <<
" while loading table '" << fName.data() <<
"'" <<
do_endl;
47 sqlite3_free(
nullptr);
50 while((sqlite3_step(stmt)) == SQLITE_ROW) {
51 tkstring name = sqlite3_column_text(stmt, 1);
52 tkstring type = sqlite3_column_text(stmt, 2);
56 sqlite3_finalize(stmt);
71 for(
auto &column : fColumns) {
72 if(_opt.
contains(
"notnull")&&column.second.is_empty())
continue;
73 if(column.first.contains(_opt)) glog <<
info <<
tkstring::form(
"[%3d] %20s %6s %s",ii++,column.second.get_name(),column.second.get_type(),column.second.get_value().data()) <<
do_endl;
82 std::vector<tkstring> colnames;
84 if(pro.
equal_to(
"*")) colnames = fOrderedColumnNames;
87 for(
auto col : colnames) glog <<
tkstring::form(
"%20s",fColumns[col.data()].get_name());
90 begin(sel,_properties);
93 for(
auto col : colnames) glog <<
tkstring::form(
"%20s",fColumns[col.data()].get_value().data());
102 glog <<
warning <<
"Previous sql statement not yet closed. Closing in to start new statement..." <<
do_endl;
106 tkstring cmd =
tkstring::form(
"select %s from %s where %s",_selection.data(),fName.data(),_condition.data());
108 int rc = sqlite3_prepare_v2(fDataBase, cmd.data(), -1, &fSQL_stmt,
nullptr);
110 glog <<
error <<
"SQL error: " << sqlite3_errmsg(fDataBase) <<
"while executing cmd : " << cmd.data() <<
do_endl;
112 sqlite3_free(
nullptr);
114 else fReading =
true;
120 glog <<
error <<
"No sql statement prepared, please call begin() to prepare it " <<
do_endl;
124 int ret_code = sqlite3_step(fSQL_stmt);
125 if(ret_code== SQLITE_ROW) {
126 int cols = sqlite3_column_count(fSQL_stmt);
127 for (
int i=0; i<cols; i++) {
128 const unsigned char* tmp = sqlite3_column_text(fSQL_stmt, i);
130 fColumns[sqlite3_column_name(fSQL_stmt, i)].set_value(
"");
132 fColumns[sqlite3_column_name(fSQL_stmt, i)].set_value(sqlite3_column_text(fSQL_stmt, i));
142 if(!fReading) {glog <<
error <<
"No sql statement prepared to close..." <<
do_endl;
return;}
143 sqlite3_finalize(fSQL_stmt);
176 fColumns.insert(std::make_pair(col_name,col));
177 fOrderedColumnNames.push_back(col_name);
182 fConstraint += _constraint;
188 return fColumns.count(_col_name)>0;
193 for (
auto &column : fColumns)
194 column.second.set_value_str(
"");
201 for(
auto &column : fColumns) {
202 if(column.second.is_empty())
continue;
203 sql += column.second.get_name();
204 if(column.second.is_text()) values +=
"'";
205 values += column.second.get_value();
206 if(column.second.is_text()) values +=
"'";
210 sql.erase(sql.length()-1);
211 values.erase(values.length()-1);
214 sql += values.data();
215 exec_sql(sql.data());
225 for(
auto &column : fColumns) {
226 if(column.second.is_empty())
continue;
227 sql += column.second.get_name();
229 if(column.second.is_text()) sql +=
"'";
230 sql += column.second.get_value();
231 if(column.second.is_text()) sql +=
"'";
234 sql.erase(sql.length()-1);
236 sql += _where.data();
238 exec_sql(sql.data());
246 for (
auto it: fOrderedColumnNames) {
247 sql += fColumns[it.data()].get_name();
249 sql += fColumns[it.data()].get_type();
252 sql = sql.
substr(0,sql.size()-1);
253 if(!fConstraint.empty()) {
255 sql += fConstraint.data();
258 exec_sql(sql.data());
263 for (
auto &column : fColumns)
264 column.second.set_value_str(
"0");
268int tkdb_table::exec_sql(
const char *_cmd)
270 char *zErrMsg =
nullptr;
271 int rc = sqlite3_exec(fDataBase, _cmd,
nullptr,
nullptr, &zErrMsg);
273 if( rc != SQLITE_OK ) {
274 glog <<
error <<
"SQL error: " << zErrMsg <<
" while excuting command: " << _cmd <<
do_endl;
275 sqlite3_free(zErrMsg);
283 if(!fColumns.count(_col_base_name.data())) {
284 glog <<
warning <<
"no column named: " << _col_base_name <<
" in database: " << fName <<
do_endl;
287 tkdb_column *col = &(*this)[_col_base_name.data()];
297 col = &(*this)[
tkstring::form(
"%s_unc_low",_col_base_name.data())];
299 col = &(*this)[
tkstring::form(
"%s_unc_high",_col_base_name.data())];
Simple structure to store a table column.
tkstring get_value() const
Representaiton of a sqlite data table.
void read_measure(measure_data_struct &_struct, const tkstring &_col_base_name)
void begin(tkstring _condition, tkstring _selection="*")
bool has_column(const tkstring &_col_name)
void update_row(const tkstring &_where)
void load()
resets column values and ends the select statement
bool next()
executes the select statement
void print_columns(const tkstring &_opt="")
void add_constraint(const char *_constraint)
void print_rows(const char *_selection, const char *_properties="*")
void end()
reads the next entry coresponding to the select statement and fills columns
void print(const tkstring &_opt="")
void add_column(const char *_colname, const char *_coltype)
void reset_column_values()
std::string with usefull tricks from TString (ROOT) and KVString (KaliVeda) and more....
static const char * form(const char *_format,...)
std::vector< tkstring > tokenize(const tkstring &_delim=" ") const
Create a vector of string separated by at least one delimiter.
static tkstring Form(const char *_format,...)
tkstring substr(size_type __pos=0, size_type __n=npos) const
Inlines.
bool equal_to(const char *_s, ECaseCompare _cmp=kExact) const
Returns true if the string and _s are identical.
bool contains(const char *_pat, ECaseCompare _cmp=kExact) const
double atof() const
Converts a string to double value.
tklog & yellow(tklog &log)
tklog & error_v(tklog &log)
tklog & error(tklog &log)
tklog & do_endl(tklog &log)
tklog & warning(tklog &log)
data structure used to fill a tkmeasure object from the sqlite database