campo-sirio/ab/ablib01.h

475 lines
15 KiB
C
Raw Normal View History

#include <relation.h>
#include <relapp.h>
#include <tree.h>
#include <mask.h>
#include "ablib09.h"
#include "analisi.h"
#include "relvoci.h"
#include "relana.h"
#include "saldi.h"
#include "movdett.h"
#include "voci.h"
#include "caradd.h"
#include "colldich.h"
#define MAX_ID_REL 999999999
#define MAX_ID_MOVDETT 999999
#define NODO_AGGIUNTO "A"
#define NODO_MODIFICATO "M"
#define NODO_RIMOSSO "R"
#define IMMESSO 'I'
#define TRASFERITO 'T'
#define TIPO_ANALISI "A"
#define TIPO_VOCE "V"
#define ID_NULLO 0
#define ID_NULLO_STR "0"
typedef real TNumeric_id;
class TAlbero_movdett : public TBidirectional_tree
{
TToken_string _codtab;
TLocalisamfile *_movdett;
protected:
virtual void node2id(const TObject * node,TString & id) const;
public:
virtual bool has_son() const;
virtual bool has_rbrother() const;
virtual bool has_father() const;
virtual bool has_lbrother() const;
virtual bool goto_root();
virtual bool goto_firstson();
virtual bool goto_father();
virtual bool goto_rbrother();
virtual bool goto_lbrother();
virtual bool goto_node(TString & id)
{return(_movdett->readat(atol(id))==NOERR); }
virtual TObject * curr_node() const;
bool goto_id(const TNumeric_id &id);
TRectype & curr() {return (TRectype &)*curr_node();}
TAlbero_movdett( const char * tabcode);
virtual ~TAlbero_movdett();
};
//Classe per gestire l'albero di relana
class TAlbero_relana : public TBidirectional_tree
{
TString _codtab;
TLocalisamfile *_relana;
TNumeric_id _last_id;
protected:
virtual void node2id(const TObject * node,TString & id) const;
public:
void zero_id() {_last_id = 0;}
virtual bool has_son() const;
virtual bool has_rbrother() const;
virtual bool has_father() const;
virtual bool has_lbrother() const;
virtual bool goto_root();
virtual bool goto_firstson();
virtual bool goto_father();
virtual bool goto_rbrother();
virtual bool goto_lbrother();
virtual bool goto_node(TString & id)
{return(_relana->readat(atol(id))==NOERR); }
virtual TObject * curr_node() const;
bool goto_id(const TNumeric_id &id);
TRectype & curr() {return (TRectype &)*curr_node();}
bool lock();
void unlock();
TNumeric_id &new_id(real id);
TAlbero_relana( const char * tabcode);
virtual ~TAlbero_relana();
};
//Classe per gestire la struttura di una tabella di analisi
// basandosi sull'albero di relvoci
class TAlbero_relvoci : public TTree
{
TString _codtab;
TLocalisamfile *_relvoci;
protected:
virtual void node2id(const TObject* node, TString& id) const;
public:
virtual bool goto_root();
virtual bool has_son() const;
virtual bool goto_firstson();
virtual bool has_rbrother() const;
virtual bool goto_rbrother();
virtual TObject * curr_node() const;
virtual bool goto_node(const TString &id)
{return (_relvoci->readat(atol(id))==NOERR);}
bool has_lbrother() const;
bool goto_lbrother();
TRectype & curr() {return (TRectype &)*curr_node();}
bool lock();
void unlock();
const TString & codtab()
{return _codtab;}
TAlbero_relvoci(const char * tabcode);
virtual ~TAlbero_relvoci() ;
};
// Struttura da albero basata su un file temporaneo cached
class TAlbero_locale : public TBidirectional_tree
{
TLocalisamfile *_f; // da rimuovere !!
protected:
TAssoc_array _status_node;
TRWrecord_cache * _local_cache;
TNumeric_id _last_insert_id;
TRectype *_currnode;
virtual const char * get_headkey() const {return NULL;}
virtual const char * id_fieldname() const {return NULL;}
public:
// debug
void write_cache() { _local_cache->flush(); }
void clear_cache()
{
_local_cache->clear();
_last_insert_id = 0;
}
virtual bool insert_node(TRectype &node, const TNumeric_id id_prec, const TNumeric_id id_padre, TNumeric_id id, const char trasf_immes = TRASFERITO) {return FALSE;}
virtual bool delete_node(const TNumeric_id &id) {return FALSE;}
virtual bool delete_tree() { return FALSE;}
virtual void zero() {;}
virtual bool make_root(TBaseisamfile & saldi) {return FALSE;}
virtual void link_succ_zero(const TNumeric_id currid) {;}
virtual void link_son_zero(const TNumeric_id currid) {;}
virtual TObject * curr_node() const {return _currnode;}
TRectype & current() const {return (TRectype &)*curr_node();}
TRWrecord_cache & current_cache() const {return *_local_cache;}
// ***** gestione interfaccia Database/copia locale
virtual TRectype extract_dirtynode(TString &id, TString& status) { TRectype rec(*_currnode); return rec;}
int dirty_nodes() { return _status_node.items();}
void set_status_node(const TString &id, const char *status);
TString* get_status_node(const TString &id)
{return (TString*)_status_node.objptr(id);}
virtual void goto_node(const TNumeric_id id) {;}
virtual void goto_node(TRectype &node) {*_currnode = node;}
virtual bool goto_node(const TString & id) {TNumeric_id nid(id); goto_node(nid); return TRUE;}
virtual void node2id(const TObject* node, TString& id) const {;}
virtual bool goto_firstson() {return FALSE;}
virtual bool goto_rbrother() {return FALSE;}
virtual bool goto_root() {return FALSE;}
/* virtual const char * idfather_fieldname() const {return NULL;}
virtual const char * idson_fieldname() const {return NULL;}
virtual const char * idsucc_fieldname() const {return NULL;}
virtual const char * idprec_fieldname() const {return NULL;}
virtual void put_headkey(TRectype &) {;}
virtual bool remove_subtree(const TNumeric_id lastnode_id) { return TRUE;}
virtual TNumeric_id &new_id(TNumeric_id) { real i; return i;}
virtual bool has_father() const {return TRUE;}
virtual bool goto_father() {return TRUE;}
virtual bool has_rbrother() const {return TRUE;}
virtual bool has_lbrother() const {return TRUE;}
virtual bool goto_lbrother() {return TRUE;}
virtual bool goto_son_first_level() {return TRUE;}
virtual void curr_id(TString& id) const
{
node2id(curr_node(), id);
}
*/
TAlbero_locale(int filenum);
virtual ~TAlbero_locale();
};
class TAlbero_locale_link : public TAlbero_locale
{
// TLocalisamfile *_c;
// TRWrecord_cache * _local_cache_carad;
protected:
virtual const char * idfather_fieldname() const pure ;
virtual const char * idson_fieldname() const pure;
virtual const char * idsucc_fieldname() const pure;
virtual const char * idprec_fieldname() const pure;
virtual const char * id_fieldname() const pure;
virtual const char * get_headkey() const pure;
virtual void put_headkey(TRectype &) pure;
virtual void node2id(const TObject* node, TString& id) const
{
const TRectype *rec = (const TRectype *)node;
id = rec->get_real(id_fieldname()).string();
}
virtual bool remove_subtree(const TNumeric_id lastnode_id);
virtual TNumeric_id &new_id(TNumeric_id);
public:
virtual bool insert_node(TRectype &node, const TNumeric_id id_prec, const TNumeric_id id_padre, TNumeric_id id, const char trasf_immes = TRASFERITO);
virtual bool delete_node(const TNumeric_id &id);
virtual bool delete_tree();
virtual void zero();
virtual void goto_node(const TNumeric_id id);
virtual void goto_node(TRectype &node) {*_currnode = node;}
virtual bool goto_node(const TString & id) {TNumeric_id nid(id); goto_node(nid); return TRUE;}
virtual bool make_root(TBaseisamfile & saldi) pure;
virtual bool get_description(TString& desc) const pure;
virtual bool has_son() const;
virtual bool goto_firstson();
virtual bool has_father() const;
virtual bool goto_father();
virtual bool has_rbrother() const;
virtual bool goto_rbrother();
virtual bool has_lbrother() const;
virtual bool goto_lbrother();
virtual bool goto_son_first_level();
// virtual bool has_root() const {return FALSE;}
virtual bool goto_root();
virtual void link_succ_zero(const TNumeric_id currid);
virtual void link_son_zero(const TNumeric_id currid);
virtual TRectype extract_dirtynode(TString &id, TString& status);
TAlbero_locale_link(int filenum);
virtual ~TAlbero_locale_link() {;}
};
class TAlbero_locale_relvoci: public TAlbero_locale
{
protected:
// virtual bool remove_subtree(const TNumeric_id lastnode_id);
public:
virtual bool insert_node(TRectype &node, const TNumeric_id id_prec, const TNumeric_id id_padre, TNumeric_id id, const char trasf_immes = TRASFERITO);
virtual bool delete_node(const TNumeric_id &id);
virtual bool goto_node(const TString &key);
/**********************/
virtual bool delete_tree() { return FALSE;}
virtual void zero() {;}
virtual bool make_root(TBaseisamfile & saldi) {return FALSE;}
virtual bool has_rbrother() const;
virtual bool goto_rbrother();
virtual bool has_lbrother() const;
virtual bool goto_lbrother();
virtual TRectype extract_dirtynode(TString &id, TString& status);
TNumeric_id new_id();
// virtual bool delete_tree();
// virtual bool has_son() const;
// virtual bool goto_firstson();
// virtual bool has_father() const;
// virtual bool goto_father();
// virtual bool goto_son_first_level();
TAlbero_locale_relvoci();
virtual ~TAlbero_locale_relvoci() {;}
};
// Copia locale dell'albero di una tabella analisi
class TLocal_relana3 : public TAlbero_locale_link
{
protected:
virtual const char * idfather_fieldname() const {return ABRA_IDPADRE;}
virtual const char * idson_fieldname() const {return ABRA_IDFIGLIO;}
virtual const char * idsucc_fieldname() const {return ABRA_IDSUCC;}
virtual const char * idprec_fieldname() const {return ABRA_IDPREC;}
virtual const char * id_fieldname() const {return ABRA_ID;}
virtual const char * get_headkey() const {return " ";}
virtual void put_headkey(TRectype & node) {node.put(ABRA_CODAN,get_headkey());}
public:
virtual bool make_root(TBaseisamfile & saldi);
virtual bool get_description(TString& desc) const;
TLocal_relana3();
virtual ~TLocal_relana3();
};
// Copia locale dell'albero dei dettagli di un saldo
class TLocal_balance3 : public TAlbero_locale_link
{
protected:
virtual const char * idfather_fieldname() const {return ABMD_IDPADRE;}
virtual const char * idson_fieldname() const {return ABMD_IDFIGLIO;}
virtual const char * idsucc_fieldname() const {return ABMD_IDSUCC;}
virtual const char * idprec_fieldname() const {return ABMD_IDPREC;}
virtual const char * id_fieldname() const {return ABMD_ID;}
virtual const char * get_headkey() const {return " | | | | ";}
virtual void put_headkey(TRectype & node) ;
public:
virtual bool make_root(TBaseisamfile & saldi);
virtual bool get_description(TString& desc) const;
TLocal_balance3();
virtual ~TLocal_balance3();
};
class TAlbero_AB: public TRectype
{
protected:
TAlbero_locale *_inter_tree;
virtual int commit_body() const;
virtual int read_body(bool lockstruct) {return 0;} //DA FARE
virtual void put_headkey(TRectype &rec) const {;} //DA FARE
TRectype * _newrec; //buffer per l'inserimento dodo per nodo
public:
TAlbero_AB(int filenum);
virtual ~TAlbero_AB();
virtual int read(TBaseisamfile& analisi, word isop=_isequal, word lockop=_nolock);
virtual int readat(TBaseisamfile& f, TRecnotype nrec, word lockop = _nolock);
virtual int write(TBaseisamfile& analisi) const;
virtual int rewrite(TBaseisamfile& analisi) const;
virtual int remove(TBaseisamfile& f) const;
virtual bool remove_node(const TNumeric_id &id) {return FALSE;}
virtual bool insert_new_node() {return FALSE;}
virtual void zero();
TAlbero_locale * user_tree()
{return _inter_tree;}
};
class TRecord : public TObject
{
TLocalisamfile *_r; // da rimuovere !!
protected:
TAssoc_array _status_node_record;
TRWrecord_cache * _local_cache_record;
TRectype *_currrec;
public:
// debug
void write_cache() { _local_cache_record->flush(); }
TRectype & current_rec() const {return *_currrec;}
TRWrecord_cache & current_cache_record() const {return *_local_cache_record;}
virtual TRectype extract_dirtynode(TString &id, TString& status);
int dirty_nodes() { return _status_node_record.items();}
void set_status_node(const TString &id, const char *status);
TString* get_status_node(const TString &id)
{return (TString*)_status_node_record.objptr(id);}
TRecord(int filenum);
virtual ~TRecord();
};
class TRecord_caradd : public TRecord
{
public:
TRecord_caradd();
virtual ~TRecord_caradd() {;}
};
class TRecord_colldich : public TRecord
{
public:
TRecord_colldich();
virtual ~TRecord_colldich() {;}
};
class TAnalisi_bil: public TAlbero_AB
{
class TArray_fratelli: public TAssoc_array
{
public:
void setkey(const char *tipocod, const char *codvc, TToken_string &key) const;
bool find1stkey(const char *tipocod, const char *codvc, TToken_string &key);
void mark_used(const char *key);
bool used(TObject *o);
};
TArray_fratelli _nodifratelli;
TLocalisamfile *_analisi;
TLocalisamfile *_voci;
TAlbero_relvoci *_relaz;
TAlbero_relana *_ana;
TAlbero_locale *_inter_tree_relvoci;
TRecord *_record_caradd;
TRecord *_record_colldich;
TNumeric_id _last_id_caradd;
TNumeric_id _last_id_colldich;
void last_id_caradd();
void last_id_colldich();
protected:
void naviga_relazioni(const TNumeric_id & id_relana,const TNumeric_id & prec,const TNumeric_id & padre );
TRectype * sincronizza_relana(const TNumeric_id &begin_relana,TNumeric_id &id_relana);
bool lock_struttura();
bool unlock_struttura();
bool lock_tabella();
bool unlock_tabella();
virtual int read_body(bool lockstruct);
virtual int commit_body() const;
virtual void put_headkey(TRectype &rec) const;
void prova_inserimento();
public:
TNumeric_id new_id_caradd()
{
_last_id_caradd = _last_id_caradd +1;
return _last_id_caradd;
}
TNumeric_id new_id_colldich()
{
_last_id_colldich = _last_id_colldich +1;
return _last_id_colldich;
}
virtual bool remove_node(const TNumeric_id &id);
virtual bool insert_new_node(TToken_string &codice);
virtual void modify_node(TToken_string &codice);
TAnalisi_bil();
virtual ~TAnalisi_bil() ;
TAlbero_locale * user_tree_voc()
{return _inter_tree_relvoci;}
TRecord *user_caradd()
{return _record_caradd;}
TRecord *user_colldich()
{return _record_colldich;}
const TString &type() {return get(ABAN_TIPOAN);}
void set_type(const char * tipo) {put(ABAN_TIPOAN,tipo);}
};
class TABsaldo: public TAlbero_AB
{
TLocalisamfile *_saldi;
TAlbero_movdett *_mov;
TLocalisamfile *_movdett;
protected:
virtual int read_body(bool lockstruct);
virtual void put_headkey(TRectype &rec) const;
void naviga_movdett();
void prova_inserimento();
public:
virtual bool remove_node(const TNumeric_id &id) {return FALSE;} //da fare
TABsaldo();
virtual ~ TABsaldo();
};