Patch level : 12.0 1002

Files correlati     : xvtdb.dll
Descrizione Patch   :

Corretto l'errore di archiviazione sulle vendite di Gennaio di Vega Servizi. Un cliente che conteneva nella ragione sociale SELECT bloccava l'estrazione.

Istruzioni interne  :

Fare un breve giro di controllo su F9
This commit is contained in:
Alessandro Bonazzi 2020-10-27 18:51:21 +01:00
parent 39f5c5df06
commit a19d64b13e

View File

@ -11,12 +11,23 @@
#define CHECK_FREEZED if (is_freezed()) { return set_error_freezed(); }
template<typename T> void safe_delete(T*& a)
{
delete a;
a = nullptr;
}
/******************************************************************************
* TXvt_recordset *
* Classe per esecuzioni di query temporanee (wrapper semplice per SACommand) *
******************************************************************************/
TXvt_recordset::TXvt_recordset() : _freezed(false)
TXvt_recordset::TXvt_recordset() : _recset(nullptr), _con(nullptr), _db(NOT_INITIALIZEDS),
_usr(NOT_INITIALIZEDS), _psw(NOT_INITIALIZEDS),
_drv(TSDB_undefined), _query(NOT_INITIALIZEDS),
_string_error(NOT_INITIALIZEDS), _string_error_full_text(NOT_INITIALIZEDS),
_code_error(NOT_INITIALIZED), _recno(0), _freezed(false),
_loaded(false)
{
_con = new SAConnection;
_recset = new SACommand;
@ -34,7 +45,9 @@ TXvt_recordset::TXvt_recordset() : _freezed(false)
TXvt_recordset::TXvt_recordset(const char* db, const char* user, const char* pass, const TT_driver tipo_db, const char * query, const bool ex, const bool freezed)
: _db(db), _usr(user), _psw(pass), _drv(tipo_db), _query(""), _recno(0), _freezed(false), _loaded(false)
: _db(db), _usr(user), _psw(pass), _drv(tipo_db), _query(NOT_INITIALIZEDS),
_string_error(NOT_INITIALIZEDS), _string_error_full_text(NOT_INITIALIZEDS),
_recno(0), _freezed(false), _loaded(false)
{
_con = new SAConnection;
if(connect(db, user, pass, tipo_db) == NOERR)
@ -124,8 +137,8 @@ TXvt_recordset::~TXvt_recordset()
}
catch (...) {}
// Prima cancellare il recordset POI la connessione
delete _recset;
delete _con;
safe_delete(_recset);
safe_delete(_con);
}
/* PRIVATE FUNCTIONS **************************************************************************************************/
@ -322,7 +335,7 @@ long TXvt_recordset::items()
_CON(conn)->Connect(_db, _usr, _psw, static_cast<SAClient_t>(_drv));
items = xvt_rcs_get_items(conn, _query);
if (conn != _con)
delete conn;
safe_delete(conn);
}
catch(SAException &x)
{
@ -343,7 +356,7 @@ long xvt_rcs_get_items(P_CONN_VOID con, const char* query)
long r = 0;
while(_RCS(rcs)->FetchNext())
r++;
delete rcs;
safe_delete(rcs);
return r;
}
@ -378,11 +391,20 @@ bool TXvt_recordset::exec(const bool auto_f)
_RCS(_recset)->Execute();
_loaded = true;
_recno = -1;
ok = true;
// Se trovo almeno un "select" faccio l'autofetch, ovviamente non mi sbatto se auto_f è disattivato
if (auto_f)
{
SAString s = _RCS(_recset)->CommandText(); s.MakeUpper();
ok = s.Find("SELECT") != SIZE_MAX ? next() : true;
size_t selpos = s.Find("SELECT ");
if (selpos != SIZE_MAX)
{
size_t frompos = s.Find("FROM ");
if (frompos != SIZE_MAX && frompos > selpos)
ok = next();
}
}
else
ok = true;
@ -408,7 +430,7 @@ bool TXvt_recordset::next()
bool fetched = false;
try
{
if(_RCS(_recset)->FetchNext())
if (_RCS(_recset)->FetchNext())
{
fetched = true;
_recno++;
@ -735,10 +757,10 @@ long TXvt_recordset::get_code_error(const bool erase)
const char* TXvt_recordset::get_string_error(bool erase)
{
static char* app;
static const char* app;
if (app != nullptr)
delete app;
safe_delete(app);
_CPY_STR(_string_error, app);
@ -749,10 +771,10 @@ const char* TXvt_recordset::get_string_error(bool erase)
const char* TXvt_recordset::get_text_error(bool erase)
{
static char* app;
static const char* app;
if (app != nullptr)
delete app;
safe_delete(app);
_CPY_STR(_string_error_full_text, app);