From a19d64b13e30a749d772b432224f572aa8a6c143 Mon Sep 17 00:00:00 2001 From: Alessandro Bonazzi Date: Tue, 27 Oct 2020 18:51:21 +0100 Subject: [PATCH] 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 --- src/xvtdb/xvtdb.cpp | 46 +++++++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/src/xvtdb/xvtdb.cpp b/src/xvtdb/xvtdb.cpp index 36d6b626a..9025866be 100644 --- a/src/xvtdb/xvtdb.cpp +++ b/src/xvtdb/xvtdb.cpp @@ -11,12 +11,23 @@ #define CHECK_FREEZED if (is_freezed()) { return set_error_freezed(); } +template 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(_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);