Patch level : 12.0 no-patch

Files correlati     : sy
Commento            : Tolti i dati all'interno dei valori nelle query di TODBC_recordset in modo tale da non chiedere la variabile se un valore all'interno rispetta la sintassi di campo
This commit is contained in:
Mattia Tollari 2019-01-15 10:10:28 +01:00
parent fda14eeddd
commit d23c88824e
4 changed files with 48 additions and 4 deletions

View File

@ -84,7 +84,44 @@ bool TODBC_recordset::connect(const char* dsn, const char* usr, const char* pwd,
}
const TString& TODBC_recordset::query_text() const
{ return _sql; }
{
return _sql;
}
const TString& TODBC_recordset::query_text_var() const
{
// INSERT INTO POPPO (COL1, COL2) VALUES (SELECT COL3, COL4 FROM PAPPO WHERE COL5 = #VAR4)
// INSERT INTO POPPO (COL1, COL2) VALUES (SELECT COL3, COL4 FROM PAPPO WHERE COL5 = '#VAR4')
// #VAR4')
// Conto quanti separatori ho
int num_sep = 0;
int pos = _sql.find(query_text_separator());
for (; pos > 0; pos = _sql.find(query_text_separator(), pos + 1))
num_sep++;
if(num_sep == 0 || num_sep % 2 != 0)
{
return _sql;
}
// Se sono pari tolgo dalla mia query tutte le variabili all'interno dei separatori per non farle chiedere all'utente
TString& sql = get_tmp_string();
TString wrk_sql = _sql;
sql.cut(0);
// cerco il primo query_text_separator(), nel nostro caso è l'apice e mi sposto
for (int qts = wrk_sql.find(query_text_separator()); qts > 0; qts = wrk_sql.find(query_text_separator())) // Cerco tutti i separatori
{
sql << wrk_sql.left(qts - 1);
wrk_sql.ltrim(qts);
qts = wrk_sql.find(query_text_separator());
wrk_sql.ltrim(qts);
}
return sql;
}
const TString& TODBC_recordset::driver_version() const
{
@ -715,6 +752,7 @@ void TODBC_recordset::set(const char* sql)
TODBC_recordset::TODBC_recordset(const char* sql, const bool freezed) : _freezed(freezed), _loaded(false)
{
TRecordset::set_query_text_separator('\'');
set(sql);
}

View File

@ -40,6 +40,7 @@ public:
virtual TRecnotype current_row() const;
virtual void requery();
virtual const TString& query_text() const;
virtual const TString& query_text_var() const;
virtual const TString& driver_version() const;
virtual void freeze(const bool on) { _freezed = on; }

View File

@ -623,7 +623,7 @@ void TRecordset::find_and_reset_vars()
_var.destroy();
_varnames.destroy();
const TString& sql = query_text();
const TString& sql = query_text_var();
int diesis = sql.find('#'); // cerco il primo #
for ( ; diesis > 0; diesis = sql.find('#', diesis+1)) // Cerco tutti i #
{

View File

@ -63,6 +63,7 @@ class TRecordset : public TObject
TString_array _varnames;
const TRecordset* _parentset;
char _text_separator;
char _query_text_separator;
protected:
virtual bool save_as_html(const char* path);
@ -71,7 +72,7 @@ protected:
virtual bool save_as_csv(const char* path) { set_text_separator(';'); return save_as_text(path);}
virtual bool save_as_campo(const char* path);
virtual bool save_as_dbf(const char* table, int mode);
void find_and_reset_vars();
void parsed_text(TString& sql) const;
TVariant& get_tmp_var() const;
@ -83,11 +84,15 @@ public: // Absolutely needed methods
virtual TRecnotype current_row() const pure;
virtual void requery() pure;
bool empty() const { return items() == 0; }
virtual const TString& query_text() const pure;
virtual const TString& query_text() const pure;
virtual const TString& query_text_var() const { return query_text(); }
virtual const TString& driver_version() const;
virtual char text_separator() const { return _text_separator;}
virtual void set_text_separator(char sep) { _text_separator = sep;}
virtual char query_text_separator() const { return _query_text_separator; }
virtual void set_query_text_separator(char sep) { _query_text_separator = sep; }
virtual void freeze() {}
virtual bool move_first() { return move_to(0); }