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;
 | ||
| }
 |