Patch level : 12.0 no-patch

Files correlati     :
Commento            :

Aggiunte
 sistemate funzioni freze, unfreeze, frozen, not_frozen nei recordset
This commit is contained in:
Alessandro Bonazzi 2020-08-31 18:56:22 +02:00
parent 3d1fdb90d5
commit f911ddbd7c
5 changed files with 39 additions and 27 deletions

View File

@ -241,7 +241,7 @@ void TMultiple_rectype::renum_key()
TRectype & TMultiple_rectype::operator =(const TRectype & r) TRectype & TMultiple_rectype::operator =(const TRectype & r)
{ {
TRectype::operator=(r); TAuto_variable_rectype::operator=(r);
reset_fields(*this); reset_fields(*this);
set_fields(*this); set_fields(*this);
return *this; return *this;
@ -249,7 +249,7 @@ TRectype & TMultiple_rectype::operator =(const TRectype & r)
TRectype & TMultiple_rectype::operator =(const char * r) TRectype & TMultiple_rectype::operator =(const char * r)
{ {
TRectype::operator=(r); TAuto_variable_rectype::operator=(r);
reset_fields(*this); reset_fields(*this);
set_fields(*this); set_fields(*this);
return *this; return *this;
@ -432,7 +432,7 @@ void TMultiple_rectype::fill_transaction(TConfig& cfg, int row) const
// @doc INTERNAL // @doc INTERNAL
TMultiple_rectype::TMultiple_rectype(int hfn) TMultiple_rectype::TMultiple_rectype(int hfn)
: TAuto_variable_rectype(hfn), _nuovo(TRUE) : TAuto_variable_rectype(hfn), _nuovo(true)
{ {
} }
@ -475,13 +475,13 @@ void TMultiple_rectype::add_file(int logicnum, const char* numfield)
} }
TMultiple_rectype::TMultiple_rectype(const TBaseisamfile* file) TMultiple_rectype::TMultiple_rectype(const TBaseisamfile* file)
:TAuto_variable_rectype(file), _nuovo(TRUE) :TAuto_variable_rectype(file), _nuovo(true)
{ {
} }
// @ cmember costruttore dal record // @ cmember costruttore dal record
TMultiple_rectype::TMultiple_rectype(const TRectype & rec) TMultiple_rectype::TMultiple_rectype(const TRectype & rec)
:TAuto_variable_rectype(rec), _nuovo(TRUE) :TAuto_variable_rectype(rec), _nuovo(true)
{ {
} }

View File

@ -88,7 +88,7 @@ public:
TRecord_array & operator[](int logicnum) { return (TRecord_array &)body(logicnum); } TRecord_array & operator[](int logicnum) { return (TRecord_array &)body(logicnum); }
// @cmember distrugge una riga del record array del corpo // @cmember distrugge una riga del record array del corpo
bool destroy_row(int n, bool pack = FALSE, int logicnum = 0) { return body(logicnum).destroy_row(n, pack); } bool destroy_row(int n, bool pack = false, int logicnum = 0) { return body(logicnum).destroy_row(n, pack); }
// @cmember distrugge tutte le righe del record array del corpo // @cmember distrugge tutte le righe del record array del corpo
void destroy_rows(int logicnum = 0) { body(logicnum).destroy_rows(); } void destroy_rows(int logicnum = 0) { body(logicnum).destroy_rows(); }
@ -98,7 +98,7 @@ public:
TRectype & new_row(int logicnum = 0); TRectype & new_row(int logicnum = 0);
// @cmember Abilita il caricamento del corpo <par lognum> insieme alla testata // @cmember Abilita il caricamento del corpo <par lognum> insieme alla testata
void enable_autoload(int lognum = 0 ,bool on =TRUE); void enable_autoload(int lognum = 0 ,bool on = true);
// @cmember Restituisce il flag di caricamento del corpo <par lognum> insieme alla testata // @cmember Restituisce il flag di caricamento del corpo <par lognum> insieme alla testata
bool autoload_enabled(int lognum =0 ); bool autoload_enabled(int lognum =0 );

View File

@ -249,7 +249,7 @@ int TODBC_recordset::on_get_rows(int argc, char** values, char** columns)
if (!_columns_loaded) if (!_columns_loaded)
on_get_columns(argc, values, columns); on_get_columns(argc, values, columns);
if (!_freezed && _page.items() >= _pagesize) if (not_frozen() && _page.items() >= _pagesize)
return -1; return -1;
if (_cursor_pos++ < _first_row) if (_cursor_pos++ < _first_row)
@ -296,7 +296,7 @@ bool TODBC_recordset::move_to(TRecnotype n)
const TRecnotype tot = items(); const TRecnotype tot = items();
_current_row = n; _current_row = n;
if (_freezed && _loaded) if (frozen() && _loaded)
{ {
if (n < 0) if (n < 0)
_current_row = 0L; _current_row = 0L;
@ -312,7 +312,7 @@ bool TODBC_recordset::move_to(TRecnotype n)
return false; return false;
} }
if ((n < _first_row || n >= _first_row+_page.items()) || _freezed && !_loaded) if ((n < _first_row || n >= _first_row+_page.items()) || frozen() && !_loaded)
{ {
TString sql; parsed_text(sql); TString sql; parsed_text(sql);
XVT_ODBC oc = connection(); XVT_ODBC oc = connection();
@ -326,7 +326,7 @@ bool TODBC_recordset::move_to(TRecnotype n)
sql.cut(semicolon); sql.cut(semicolon);
sql.trim(); sql.trim();
_page.destroy(); _page.destroy();
if (_freezed) if (frozen())
_first_row = 0; _first_row = 0;
else else
if (n >= _pagesize) if (n >= _pagesize)
@ -339,7 +339,7 @@ bool TODBC_recordset::move_to(TRecnotype n)
_cursor_pos = 0; _cursor_pos = 0;
xvt_odbc_execute(oc, sql, query_get_rows, this); xvt_odbc_execute(oc, sql, query_get_rows, this);
_loaded = _freezed; _loaded = frozen();
if (!_columns_loaded) if (!_columns_loaded)
_columns_loaded = true; // Brutto posto ma necessario _columns_loaded = true; // Brutto posto ma necessario
} }
@ -709,15 +709,16 @@ void TODBC_recordset::remove_rec(const TISAM_recordset& dbfset)
void TODBC_recordset::set(const char* sql) void TODBC_recordset::set(const char* sql)
{ {
if (!_freezed || !_loaded || _sql != sql) if (not_frozen() || !_loaded || _sql != sql)
reset(); reset();
_sql = sql; _sql = sql;
if (_sql.find("SELECT") >= 0 || _sql.find("select") >= 0) if (_sql.find("SELECT") >= 0 || _sql.find("select") >= 0)
find_and_reset_vars(); find_and_reset_vars();
} }
TODBC_recordset::TODBC_recordset(const char* sql, const bool freezed) : _freezed(freezed), _loaded(false) TODBC_recordset::TODBC_recordset(const char* sql, const bool freezed) : _loaded(false)
{ {
freeze(freezed);
set(sql); set(sql);
} }
@ -749,9 +750,9 @@ bool TDB_recordset::set(const char* sql)
bool ok; bool ok;
TString real_query = ""; TString real_query = "";
// Posso modificare oppure non posso ma _sql è vuota // Posso modificare oppure non posso ma _sql è vuota
if (!_freezed || _sql.empty()) if (not_frozen() || _sql.empty())
{ {
if (_sql.empty() || !_freezed && !_sql.empty()) if (_sql.empty() || not_frozen() && !_sql.empty())
{ {
// Guardo se la query inizia con la stringa di connessione // Guardo se la query inizia con la stringa di connessione
if (TString(sql).starts_with("CONNECT(", true)) if (TString(sql).starts_with("CONNECT(", true))
@ -778,7 +779,7 @@ bool TDB_recordset::set(const char* sql)
} }
// Serve? // Serve?
if (!_freezed || _sql != sql) if (not_frozen() || _sql != sql)
reset(); reset();
_sql.cut(0) << real_query; _sql.cut(0) << real_query;
@ -922,7 +923,7 @@ void TDB_recordset::freeze(const bool on)
_rec->freeze(); _rec->freeze();
else else
_rec->defrost(); _rec->defrost();
_freezed = on; TRecordset::freeze(on);
} }
bool TDB_recordset::connect(const char* db, const char* user, const char* pass, const char* tipo_db) const bool TDB_recordset::connect(const char* db, const char* user, const char* pass, const char* tipo_db) const
@ -1045,7 +1046,7 @@ const TVariant& TDB_recordset::get(unsigned int column) const
{ {
static TVariant field = NULL_VARIANT; static TVariant field = NULL_VARIANT;
static unsigned int last_get = 0; static unsigned int last_get = 0;
if (!_freezed || column != last_get || field == NULL_VARIANT) if (not_frozen() || column != last_get || field == NULL_VARIANT)
{ {
last_get = column; last_get = column;
field = _rec->sq_get(column); field = _rec->sq_get(column);
@ -1087,7 +1088,7 @@ bool TDB_recordset::commit() const
return _rec->sq_commit(); return _rec->sq_commit();
} }
TDB_recordset::TDB_recordset(const char* sql, const bool freezed) : _freezed(freezed) TDB_recordset::TDB_recordset(const char* sql, const bool freezed)
{ {
_current_row = -1; _current_row = -1;
_rec = new SSimple_query(); _rec = new SSimple_query();

View File

@ -595,7 +595,7 @@ bool TRecordset::set_var(const char* name, const TVariant& var, bool create)
{ {
bool ok = false; bool ok = false;
TVariant* old = (TVariant*)_var.objptr(name); TVariant* old = (TVariant*)_var.objptr(name);
if (old != NULL) if (old != nullptr)
{ {
*old = var; *old = var;
ok = true; ok = true;
@ -605,6 +605,7 @@ bool TRecordset::set_var(const char* name, const TVariant& var, bool create)
if (create) if (create)
{ {
const TFixed_string n(name); const TFixed_string n(name);
if (n.starts_with("#PARENT.") || n.starts_with("#RECORD.")) if (n.starts_with("#PARENT.") || n.starts_with("#RECORD."))
{ {
// Aggiungo solo il nome alla lista: niente valore! // Aggiungo solo il nome alla lista: niente valore!
@ -645,6 +646,7 @@ void TRecordset::find_and_reset_vars()
if (is_var_separator(sql[diesis-1])) // Controllo che ci sia un separatore prima del # if (is_var_separator(sql[diesis-1])) // Controllo che ci sia un separatore prima del #
{ {
int i = diesis+1; int i = diesis+1;
for ( ; sql[i] && (isalnum(sql[i]) || strchr("@_.#", sql[i]) != NULL); i++); for ( ; sql[i] && (isalnum(sql[i]) || strchr("@_.#", sql[i]) != NULL); i++);
if (i > diesis+1) if (i > diesis+1)
{ {
@ -735,12 +737,14 @@ bool TRecordset::ask_variables(bool all)
return true; return true;
const bool ok = variables().items() > 0; const bool ok = variables().items() > 0;
if (ok) // Se ci sono variabili faccio le sostituzioni if (ok) // Se ci sono variabili faccio le sostituzioni
{ {
FOR_EACH_ARRAY_ROW(_varnames, i, name) FOR_EACH_ARRAY_ROW(_varnames, i, name)
{ {
TVariant var = get_var(*name); TVariant var = get_var(*name);
if (var.is_null() || all)
if (var.is_null() || all)
{ {
ask_variable(*name, var); ask_variable(*name, var);
if (var.is_null()) if (var.is_null())

View File

@ -14,6 +14,8 @@
#endif #endif
#define FIELD_NAME(lf, name) TOSTRING(lf) "." name #define FIELD_NAME(lf, name) TOSTRING(lf) "." name
#define SUB_FIELD_NAME(lf, name, from, to ) TOSTRING(lf) "." name "[" TOSTRING(from) "," TOSTRING(to) "]"
#define MAIN_SUB_FIELD_NAME(name, from, to ) name "[" TOSTRING(from) "," TOSTRING(to) "]"
struct TRecordset_column_info : public TObject struct TRecordset_column_info : public TObject
{ {
@ -64,6 +66,7 @@ class TRecordset : public TObject
const TRecordset* _parentset; const TRecordset* _parentset;
char _text_separator; char _text_separator;
bool _disable_variables; bool _disable_variables;
bool _frozen;
protected: protected:
virtual bool save_as_html(const char* path); virtual bool save_as_html(const char* path);
@ -90,7 +93,11 @@ public: // Absolutely needed methods
virtual char text_separator() const { return _text_separator;} virtual char text_separator() const { return _text_separator;}
virtual void set_text_separator(char sep) { _text_separator = sep;} virtual void set_text_separator(char sep) { _text_separator = sep;}
virtual void freeze() {} virtual void freeze(bool on = true) { _frozen = on; }
virtual void unfreeze() { freeze(false); }
virtual bool frozen() const { return _frozen; }
virtual bool not_frozen() const { return !_frozen; }
virtual bool move_first() { return move_to(0); } virtual bool move_first() { return move_to(0); }
virtual bool move_prev() { return move_to(current_row()-1); } virtual bool move_prev() { return move_to(current_row()-1); }
virtual bool move_next() { return move_to(current_row()+1); } virtual bool move_next() { return move_to(current_row()+1); }
@ -157,10 +164,10 @@ protected:
public: public:
bool valid_cursor() const { return _cursor != NULL; } bool valid_cursor() const { return _cursor != NULL; }
virtual TCursor* cursor() const; virtual TCursor* cursor() const;
void freeze(bool on = true) const { return cursor()->freeze(on); } virtual void freeze(bool on = true) { return cursor()->freeze(on); }
void unfreeze() const { return cursor()->freeze(false); } virtual void unfreeze() { return cursor()->freeze(false); }
bool frozen() const { return cursor()->frozen(); } virtual bool frozen() const { return cursor()->frozen(); }
bool not_frozen() const { return cursor()->not_frozen(); } virtual bool not_frozen() const { return cursor()->not_frozen(); }
void set(const char* use); void set(const char* use);
virtual void requery(); virtual void requery();
virtual TRecnotype items() const; virtual TRecnotype items() const;