9e87d4da39
git-svn-id: svn://10.65.10.50/trunk@3294 c028cbd2-c16b-5b4b-a496-9718f37d4682
258 lines
5.6 KiB
C++
Executable File
258 lines
5.6 KiB
C++
Executable File
#include <execp.h>
|
||
#include <prefix.h>
|
||
#include <printapp.h>
|
||
#include <relation.h>
|
||
#include <tabutil.h>
|
||
|
||
// trasferimenti
|
||
|
||
|
||
class TField_text : public TObject
|
||
{
|
||
int _pos;
|
||
int _from;
|
||
int _to;
|
||
|
||
struct TField_Flags
|
||
{
|
||
bool rightjust : 1;
|
||
byte trim : 2; // Trim the string
|
||
bool uppercase : 1;
|
||
bool zerofilled : 1;
|
||
|
||
char update(const char*);
|
||
TField_Flags(const char* flags) {update(flags);}
|
||
TField_Flags();
|
||
} _flags;
|
||
protected:
|
||
|
||
public:
|
||
TField_text(int pos, int from, int to, const char* flags);
|
||
~TField_text();
|
||
};
|
||
|
||
TField_text::TField_text(int pos, int from, int to, const char* flags)
|
||
{
|
||
_pos = pos;
|
||
_from = from;
|
||
_to = to;
|
||
_flags.update(flags);
|
||
};
|
||
|
||
TField_text::TField_Flags::TField_Flags()
|
||
{
|
||
uppercase = FALSE;
|
||
rightjust = FALSE;
|
||
zerofilled = FALSE;
|
||
trim = 3;
|
||
};
|
||
|
||
char TField_text::TField_Flags::update(const char* f)
|
||
{
|
||
for (const char* s = f; *s; s++)
|
||
switch(*s)
|
||
{
|
||
case '#':
|
||
trim = 2; break;
|
||
case '@':
|
||
trim = 1; break;
|
||
case ' ':
|
||
case '_':
|
||
trim = 0; break;
|
||
case 'R':
|
||
rightjust = TRUE; break;
|
||
case 'U':
|
||
uppercase = TRUE; break;
|
||
case 'Z':
|
||
zerofilled = TRUE; break;
|
||
default :
|
||
CHECKS(FALSE, "FLAG sconosciuto in ", f);
|
||
break;
|
||
}
|
||
return *s;
|
||
}
|
||
|
||
class TRecord_text : TToken_string
|
||
{
|
||
int _numrec;
|
||
public:
|
||
const char* get_field(int pos, int from, int to);
|
||
TRecord_text();
|
||
};
|
||
|
||
const char* TRecord_text::get_field(int pos, int from, int to)
|
||
{
|
||
if (from == 0 && to == 0)
|
||
return TToken_string::get(pos);
|
||
else
|
||
{
|
||
TString record = TToken_string::get(0);
|
||
return record.sub(from, to);
|
||
}
|
||
}
|
||
|
||
class TFiletext_len : public TObject
|
||
{
|
||
char _name[20];
|
||
word _len;
|
||
TRecord_text* _current;
|
||
|
||
public:
|
||
TRecord_text& curr() {return *_current;}
|
||
};
|
||
|
||
|
||
class TTransfer : public TObject
|
||
{
|
||
|
||
TCursor* _cursor;
|
||
TConfig* _config;
|
||
|
||
link_item* _pr_tree;
|
||
int _cur_file;
|
||
|
||
link_item* _look_transf_node(link_item* head, int logicnum);
|
||
void _reset_tree(link_item* head);
|
||
|
||
protected:
|
||
|
||
void create_cursor(TRelation* r, const char* filter, int nkey,
|
||
const TRectype *from, const TRectype* to);
|
||
void create_config(const char* file);
|
||
virtual bool preprocess_record(int file, int counter) { return TRUE; }
|
||
virtual bool preprocess_transf(int file, int counter) { return TRUE; }
|
||
virtual bool postprocess_record(int file, int counter) { return TRUE; }
|
||
virtual bool postprocess_transf(int file, int counter) { return TRUE; }
|
||
|
||
public:
|
||
void reset_files();
|
||
void add_file(int file, int from = 0);
|
||
void add_file(const char* tab, int from = 0);
|
||
|
||
bool add(TLocalisamfile* f, const char* relexprs, int key, int linkto,
|
||
int alias, bool allow_lock);
|
||
bool add(int logicnum, const char* relexprs, int key = 1, int linkto = 0,
|
||
int alias = 0, bool allow_lock = FALSE);
|
||
bool add(const char* tabname, const char* relexprs, int key = 1, int linkto = 0,
|
||
int alias = 0, bool allow_lock = FALSE);
|
||
|
||
bool do_load();
|
||
bool do_dump();
|
||
|
||
TTransfer();
|
||
virtual ~TTransfer();
|
||
|
||
};
|
||
|
||
TTransfer::~TTransfer()
|
||
{
|
||
if (_cursor != NULL)
|
||
delete _cursor;
|
||
if (_config != NULL)
|
||
delete _config;
|
||
}
|
||
|
||
void TTransfer::create_cursor(TRelation* r, const char* filter, int nkey,
|
||
const TRectype* from, const TRectype* to)
|
||
{
|
||
CHECK(_cursor == NULL, "Il cursore esiste gi<67>");
|
||
_cursor = new TCursor(r, filter, nkey, from, to);
|
||
}
|
||
|
||
void TTransfer::create_config(const char* file)
|
||
{
|
||
CHECK(_config == NULL, "La configurazione esiste gi<67>");
|
||
_config = new TConfig(file, "HEADER");
|
||
}
|
||
|
||
void TTransfer::_reset_tree(link_item* head)
|
||
{
|
||
if (head)
|
||
{
|
||
if (head->_brother)
|
||
_reset_tree(head->_brother);
|
||
if (head->_son)
|
||
_reset_tree(head->_son);
|
||
delete head;
|
||
}
|
||
}
|
||
|
||
link_item* TTransfer::_look_transf_node(link_item* head, int logicnum)
|
||
{
|
||
link_item* s;
|
||
while (head)
|
||
{
|
||
if (head->_logicnum == logicnum)
|
||
return head;
|
||
else if (head->_son)
|
||
if ((s = _look_transf_node(head->_son, logicnum)) != NULL)
|
||
return s;
|
||
head = head->_brother;
|
||
}
|
||
return NULL;
|
||
}
|
||
|
||
void TTransfer::add_file(const char* tab, int from)
|
||
{
|
||
add_file(TTable::name2log(tab), from);
|
||
}
|
||
|
||
void TTransfer::add_file(int file, int from)
|
||
{
|
||
link_item *nw = new link_item(file);
|
||
if (_pr_tree == NULL)
|
||
{
|
||
_pr_tree = nw;
|
||
return;
|
||
}
|
||
|
||
if (from == 0)
|
||
from = _pr_tree->_logicnum;
|
||
|
||
link_item *fr = _look_transf_node(_pr_tree, from);
|
||
|
||
CHECKD(fr, "add_file: nonexistent node: logicnum = ", from);
|
||
|
||
if (fr->_son)
|
||
{
|
||
fr = fr->_son;
|
||
while (fr->_brother)
|
||
fr = fr->_brother;
|
||
fr->_brother = nw;
|
||
}
|
||
else
|
||
fr->_son = nw;
|
||
}
|
||
|
||
// aggiunge un file alla relazione del cursore (come add della TRelation)
|
||
bool TTransfer::add(TLocalisamfile* f, const char* relexprs, int key, int linkto,
|
||
int alias, bool allow_lock)
|
||
{
|
||
return _cursor->relation()->add(f, relexprs, key, linkto, alias, allow_lock);
|
||
}
|
||
|
||
bool TTransfer::add(int logicnum, const char* relexprs, int key, int linkto,
|
||
int alias, bool allow_lock)
|
||
{
|
||
return _cursor->relation()->add(logicnum, relexprs, key, linkto, alias, allow_lock);
|
||
}
|
||
|
||
bool TTransfer::add(const char* tabname, const char* relexprs, int key, int linkto,
|
||
int alias, bool allow_lock)
|
||
{
|
||
return _cursor->relation()->add(tabname, relexprs, key, linkto, alias, allow_lock);
|
||
}
|
||
|
||
bool TTransfer::do_load()
|
||
{
|
||
CHECK((_config != NULL) && (_cursor != NULL), "Non esistono cursore o config");
|
||
return TRUE;
|
||
}
|
||
|
||
bool TTransfer::do_dump()
|
||
{
|
||
CHECK((_config != NULL) && (_cursor != NULL), "Non esistono cursore o config");
|
||
|
||
return TRUE;
|
||
}
|