From 918068e758ff40301015b35a17a742600022b497 Mon Sep 17 00:00:00 2001 From: guy Date: Mon, 30 Mar 1998 13:43:36 +0000 Subject: [PATCH] form.cpp Migliorata indentazione isam.* Migliorata gestione handles dei file isam aperti os_win16.cpp Migliorate le funzioni di riconoscimento del tipo di disco os_win32.cpp Semplificati calcoli di centrature icone git-svn-id: svn://10.65.10.50/trunk@6456 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- include/form.cpp | 4 +- include/isam.cpp | 1604 +++++++++++++++--------------------------- include/isam.h | 122 +--- include/os_win16.cpp | 10 +- include/os_win32.cpp | 4 +- 5 files changed, 589 insertions(+), 1155 deletions(-) diff --git a/include/form.cpp b/include/form.cpp index eb38467fe..5042417c2 100755 --- a/include/form.cpp +++ b/include/form.cpp @@ -3697,10 +3697,10 @@ bool TForm::reread( if (key == "SE" || key == "") // ..if section or end of file... break; } - const char secr = scanner.popkey()[0]; // Section name (GRAPH, HEAD, BODY, FOOT) + const char secr = scanner.popkey()[0]; // Section name (GRAPH, HEAD, BODY, FOOT) if (secr=='\0') break; const pagetype pr = char2page(scanner.popkey()[0]); // Section type (odd, even, first, last) - if (secr==sec && pr==p) ok = TRUE; // L'ha trovata... + if (secr == sec && pr == p) ok = TRUE; // L'ha trovata... } // ...riesegue la parse della sezione leggendo dal file sorgente if(ok && s->parse(scanner)) diff --git a/include/isam.cpp b/include/isam.cpp index 9cf835fb5..d7eaa6f98 100755 --- a/include/isam.cpp +++ b/include/isam.cpp @@ -20,24 +20,12 @@ #include #include -#define NOT_OPEN() CHECKS(_isamfile != NULL, "File chiuso: ", (const char*)name()) - #define RECLOCKTYPES 0xFF00 #define READTYPES 0x00FF #define INVFLD 255 -isfdptr* ext_files; -isfdptr* openf; Str80 cprefix; -HIDDEN int error_codes_g[] = {-1,_isnotopen,-1,-1,-1,_islocked,-1,-1,-1,-1,-1,-1,_isfilefull, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,_iskeynotfound,_ispatherr,-1,-1,_isdupkey}; - -HIDDEN int error_codes_ra[] = {NOERR,NOERR,_iskeynotfound,_iseof,_isbof,_isnrecerr} ; -// Codici da 0 a 9 -HIDDEN int error_codes_rb[] = {-1,-1,_isreinsert,-1,-1,_islocked,-1,_isalropen,_iskeyerr } ; -// Codici da 10 a ... - HIDDEN char _isam_string[257]; #define NOALLOC (char **) -1 @@ -269,33 +257,51 @@ void get_idx_names( i_names.restart(); } +// Converte un errore di codebase in un errore isam int get_error(int err) { +// Codici negativi +HIDDEN int error_codes_g[] = {-1,_isnotopen,-1,-1,-1,_islocked,-1,-1,-1,-1,-1,-1,_isfilefull, + -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,_iskeynotfound,_ispatherr,-1,-1,_isdupkey}; +// Codici da 0 a 9 +HIDDEN int error_codes_ra[] = {NOERR,NOERR,_iskeynotfound,_iseof,_isbof,_isnrecerr} ; +// Codici da 10 a ... +HIDDEN int error_codes_rb[] = {-1,-1,_isreinsert,-1,-1,_islocked,-1,_isalropen,_iskeyerr } ; + + int isamerr = NOERR; if (err > 0) { if (err >= 10) { - if (err > 80 || error_codes_rb[err/10]==-1) return err; + if (err > 80 || error_codes_rb[err/10]==-1) + isamerr = err; else - return(error_codes_rb[err/10]); + isamerr = error_codes_rb[err/10]; } else - return(error_codes_ra[err]); + isamerr = error_codes_ra[err]; } else if (err < 0) { - int ierr = DB_get_error(); - if (ierr < 0) ierr = -ierr; - if (ierr > 340 || error_codes_g[ierr/10]==-1) - return (-ierr); - return (error_codes_g[ierr/10]); + if (err == -1) + isamerr = _isnotopen; + else + { + int ierr = DB_get_error(); + if (ierr == 0) ierr = -err; // DB_get_error already called + if (ierr < 0) ierr = -ierr; + if (ierr > 340 || error_codes_g[ierr/10]==-1) + isamerr = -ierr; + else + isamerr = error_codes_g[ierr/10]; + } } DB_zero_error(); - return(NOERR); + return isamerr; } -HIDDEN bool rec_has_memo( const RecDes * rd ) +HIDDEN bool rec_has_memo(const RecDes* rd) { for( int i = rd->NFields - 1; i >= 0; i--) if (rd->Fd[i].TypeF == _memofld) @@ -303,160 +309,13 @@ HIDDEN bool rec_has_memo( const RecDes * rd ) return FALSE; } - -HIDDEN bool lf_has_memo( const int lffile ) -{ - TTrec r; - - r.get( lffile ); - return rec_has_memo(r.rec()); -} - HIDDEN void browse_null(char *start, int nc) { for (int i = nc - 1; i >= 0 ; i--) // Anche il primo byte(deletion flag) deve essere cambiato. nc comprende il primo byte if (start[i] == '\0') start[i] = ' '; } -HIDDEN const char * translate_key(const char* key) // Traduce l'espressione chiave di CodeBase -{ - // Trasforma l'espressione - static TToken_string t; - t = key; - TToken_string k(t.get(0),'+'); - TToken_string range("",','); - TString ws; - const bool is_dup = t.get(1)[0] == 'X'; - const int items = k.items(); - t = ""; - for (int i = 0; i= 0; - const bool is_sub = ws.find("SUBSTR") >= 0; - int paren1 = ws.find('('); // Trova la prima parentesi aperta - int paren2,last,from,to; - - if (paren1 >= 0 && is_sub && is_upper) - paren1 = ws.find('('); // Trova la seconda parentesi (in questo caso c'e' per forza) - - if (paren1 >= 0) // Trova la prima virgola o parentesi chiusa (per qualsiasi espressione) - { - paren2 = ws.find(','); - if (paren2 == -1) // se non ci sono virgole trova la parentesi chiusa - paren2 = ws.find(')'); - CHECK(paren2 > paren1,"Something wrong happened translating CodeBase expressions."); - if (is_sub) // Se e' una sottostringa estrae i campi DA e A - { - range = ws; - last = ws.find(')'); - range.sub(paren2,last); // dalla virgola alla parentesi - from = range.get_int(0); - to = range.get_int(1); - } - ws = ws.sub(paren1+1,paren2); // Nome del campo pulito pulito - ws.upper(); - } - - if (is_upper) - t << "UPPER("; - - t << ws; // aggiunge il nome del campo - - if (is_sub) - { - t << "["; - t << from << ","; - t << to << "]"; - } - if (is_upper) - t << ")"; - t << '+'; - } - t.rtrim(1); // Toglie il + in piu' - t.add(is_dup ? "X" : " "); - return t; -} - -HIDDEN void getisfd(isfdptr & isfd, int logicnum) -{ - CHECK(logicnum < LF_EXTERNAL, "Incorrect use of getisfd() with external file definition"); - isfd = new isdef ; - isfd->r = new RecDes ; - isfd->d = new FileDes ; - CGetFile(logicnum, isfd->d, _nolock, _nordir); - const TFixed_string name(isfd->d->SysName); - if (name.not_empty() && name[0] != '$') - isfd->ft = _comdir; - else - isfd->ft = _nordir; - COpenFile(logicnum, isfd->d, _nolock, isfd->ft); - CGetRec(logicnum, isfd->r, isfd->ft); - isfd->ln = logicnum; -} - -HIDDEN void getisfd(isfdptr & isfd, const char* name) -{ -// For External file definition only - TTrec rec; - int err; - char* cb_keys = new char[256*MaxKeys]; - - isfd = new isdef ; - isfd->r = new RecDes ; - isfd->d = new FileDes ; - isfd->ln = -1; - - if (!fexist(name)) - fatal_box("Il file %s non esiste.",(const char*)name); - TFilename n(name); - n.ext(""); // Remove extension - err = DB_recinfo(n,isfd->d,rec.rec(),cb_keys); - if (err == NOERR) - { - strncpy(isfd->d->SysName, name,40); - isfd->d->SysName[41] = '\0'; - isfd->fhnd = 0; - isfd->RecNo = -1; - isfd->ft = 0; - isfd->knum = 0; - rec.rehash(); - const int num_keys = rec.keys(); - TToken_string keys(cb_keys,'$'); - - for (int i=0; i< num_keys; i++) - rec.update_keydef(i,translate_key(keys.get(i))); // Traduce l'espressione chiave di CodeBase - memcpy(isfd->r,rec.rec(),sizeof(RecDes)); - } - else - { - if (err == -60) // This because existance of file is checked before - fatal_box("File %s aperto in modo esclusivo da un'altra applicazione.",name); - else - fatal_box("Apertura file %s : errore n. %d ",name,err); - } - delete cb_keys; -} - -HIDDEN void relisfd(isfdptr & isfd) -{ - if (isfd->ln > 0 && isfd->fhnd >= 0) - { - TDir d; - d.get(isfd->ln, _lock, (TDirtype) isfd->ft, _sysdirop); - d.eod() = isfd->d->EOD; - d.eox() = isfd->d->EOX; - d.put(isfd->ln, (TDirtype) isfd->ft, _sysdirop); - } - delete isfd->d; - delete isfd->r; - delete isfd; - - isfd = NULL; -} - - -HIDDEN int __build_key(RecDes *recd, int numkey, RecType recin, char *key, bool build_x_cb) +HIDDEN int __build_key(const RecDes *recd, int numkey, RecType recin, char *key, bool build_x_cb) /* *recd; descrittore record */ /* numkey; numero chiave */ /* recin; buffer contenente il record */ @@ -544,35 +403,30 @@ HIDDEN int __build_key(RecDes *recd, int numkey, RecType recin, char *key, bool return(_ispatherr); } -HIDDEN int cisstart(isfdptr isfd, int keynum, TRectype & record, unsigned int mode) -{ - // It seems quite unuseful... Quando cambio la chiave con setkey, la d4tagselect - // seleziona gia' l'indice, rendendo inutile il senso della cisstart - return NOERR; -} - - -HIDDEN int cisread(isfdptr isfd, TRectype & record, int mode, TRecnotype curr_recno) +HIDDEN int cisread(int fhnd, int knum, TRectype& record, int mode, TRecnotype& curr_recno) { - int rmode = (mode & READTYPES), lmode = (mode & RECLOCKTYPES); + const int rmode = (mode & READTYPES); + const int lmode = (mode & RECLOCKTYPES); // Non usare mai _isnextn o _isprevn, usare il metodo skip! CHECK (rmode !=_isnextn && rmode !=_isprevn, "_isnextn and _isprevn not supported in cisread"); - char key[128]; + TString256 keystr; + char* key = keystr.get_buffer(); + int err = NOERR ; - do { - if (rmode>=_isequal && rmode<=_isgteq) + if (rmode>=_isequal && rmode<=_isgteq) { - err=__build_key(isfd->r, isfd->knum, record.string(),key,TRUE); + const RecDes* r = record.rec_des(); + err=__build_key(r, knum, record.string(),key,TRUE); if (err == NOERR) { - err = DB_seek(isfd->fhnd,key); - if (rmode == _isgreat && err == NOERR) - err = DB_next(isfd->fhnd); + err = DB_seek(fhnd,key); + if (err == NOERR && rmode == _isgreat) + err = DB_next(fhnd); if (err != NOERR) err = get_error(err); } @@ -582,104 +436,91 @@ HIDDEN int cisread(isfdptr isfd, TRectype & record, int mode, TRecnotype curr_re else { if (rmode==_isfirst) - err=DB_first(isfd->fhnd); + err=DB_first(fhnd); else if (rmode==_islast) - err=DB_last(isfd->fhnd); + err=DB_last(fhnd); else if (rmode==_isnext) { - if (curr_recno != DB_recno(isfd->fhnd)) + if (curr_recno != DB_recno(fhnd)) { - err = __build_key(isfd->r, isfd->knum, record.string(),key,TRUE); + RecDes* r = record.rec_des(); + err = __build_key(r, knum, record.string(),key,TRUE); if (err == NOERR) { - err = DB_seek(isfd->fhnd,key); + err = DB_seek(fhnd,key); err = get_error(err); if (err != NOERR && err != _iskeynotfound) fatal_box("Errore nella next %d : non posso riposizionarmi", err); else if (err == NOERR) - err=DB_next(isfd->fhnd); + err=DB_next(fhnd); } } else - err=DB_next(isfd->fhnd); + err=DB_next(fhnd); } else if (rmode==_isprev) { - if (curr_recno != DB_recno(isfd->fhnd)) + if (curr_recno != DB_recno(fhnd)) { - err = __build_key(isfd->r, isfd->knum, record.string(),key,TRUE); + RecDes* r = record.rec_des(); + err = __build_key(r, knum, record.string(),key,TRUE); if (err == NOERR) { - err = DB_seek(isfd->fhnd,key); + err = DB_seek(fhnd,key); err = get_error(err); if (err != NOERR && err != _iseof) fatal_box("Errore nella next %d : non posso riposizionarmi", err); else if (err == NOERR) - err=DB_prev(isfd->fhnd); + err=DB_prev(fhnd); } } else - err=DB_prev(isfd->fhnd); + err=DB_prev(fhnd); } else if (rmode==_iscurr) - err=DB_go(isfd->fhnd,DB_recno(isfd->fhnd)); - if (err != NOERR) err=get_error(err); + err=DB_go(fhnd,DB_recno(fhnd)); + if (err != NOERR) + err=get_error(err); } if (err == _iseof) - DB_last(isfd->fhnd); + DB_last(fhnd); if (err == NOERR && (lmode == _lock || lmode == _testandlock)) // _lock e _testandlock { - err=DB_lock(isfd->fhnd); - if (err != NOERR) err=get_error(err); - if (err == _islocked && lmode == _testandlock) break; + err=DB_lock(fhnd); + if (err != NOERR) + err = get_error(err); + if (err == _islocked && lmode == _testandlock) + break; } if (err == _islocked) { - record = (const char *) DB_getrecord(isfd->fhnd); - __build_key(isfd->r, isfd->knum, record.string(), key, TRUE); + RecDes* r = record.rec_des(); + record = (const char *) DB_getrecord(fhnd); + __build_key(r, knum, record.string(), key, TRUE); message_box("Codice %s in uso da parte\ndi un altro utente.", key); } } while (err ==_islocked); if (err == NOERR && lmode == _unlock) { - err=DB_unlock(isfd->fhnd); - if (err != NOERR) err=get_error(err); + err=DB_unlock(fhnd); + if (err != NOERR) + err = get_error(err); } - record = (const char *) DB_getrecord(isfd->fhnd); - isfd->RecNo = DB_recno(isfd->fhnd); + curr_recno = DB_recno(fhnd); + record = (const char *)DB_getrecord(fhnd); + return err; } -#ifndef CB6 -HIDDEN int delkeys(isfdptr fd, char* record,long recno) -{ - int rt=NOERR,oldkey = fd->knum; - - for (int i=1; i<=fd->r->NKeys;i++) - { - char key[128]; - - DB_tagselect(fd->fhnd,i); - rt=__build_key(fd->r,i,record,key,TRUE); - if (rt!=NOERR) break; - rt=DB_delkey(fd->fhnd,key,recno); - if (rt!=NOERR) break; - } - - DB_tagselect(fd->fhnd,oldkey); - return(rt); -} -#endif - //////////////////////////////////////////////////////////////////////////////////////////////////// // Funzioni implementate per la gestione file dati tramite Codebase //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -733,10 +574,10 @@ TExtrectype::TExtrectype(const TTrec& r) : TVariable_rectype(r.num()) /////////////////////////////////////////////////////////// TBaseisamfile::TBaseisamfile(int logicnum) - { - _isamfile = NULL; _logicnum = logicnum; + _isam_handle = 0; + _curr_key = 0; _lasterr = NOERR; _current = new TRectype(this); } @@ -746,43 +587,27 @@ TBaseisamfile::TBaseisamfile(int logicnum) // @mfunc Reperisce il tracciato dal file stesso. // TBaseisamfile::TBaseisamfile( - const char* name) // @parm Indica il nome del file + const char* name, int mode, bool index) // @parm Indica il nome del file // @comm Esiste la possibilita' di codificare i valori di pathpref e prefix in

// % si riferisce ai dati comuni // $ si riferisce ai dati di ditta corrente // # si riferisce al direttorio indicato da PATHPREF.INI { - _isamfile = NULL; _lasterr = NOERR; - _logicnum = -1; - TFilename n(name); - CHECK(n.not_empty(),"Must define the file to open!"); + TFilename filename(name); // Espande il nome! - const char c = n[0]; + const char c = filename[0]; if (c == '%' || c == '$') - n = CAddPref((char*)(const char*)n); + filename = CAddPref(filename.get_buffer()); else if (c == '#') { - n.ltrim(1); - n.format("%s/%s",__ptprf,(const char*)n); - } - - n.ext("dbf"); - getisfd (_isamfile, n); // Importa il tracciato dal file - TDir d; - d.get(1); - const int max = (int) d.eod(); - for (int i=0; iln = i+LF_EXTERNAL; // Primo slot libero - ext_files[i] = _isamfile; - break; - } - if (_logicnum == -1) - fatal_box("Raggiunto il numero massimo di files esterni apribili."); + filename.ltrim(1); + filename.format("%s/%s",__ptprf,(const char*)filename); + } + _logicnum = LF_EXTERNAL; + _isam_handle = prefix().open_isamfile(_logicnum, filename, mode == _excllock, index); _current = new TRectype(this); } @@ -790,15 +615,16 @@ TBaseisamfile::~TBaseisamfile() { if (_current) delete _current; - if (_isamfile != NULL) - delete _isamfile; } +TCodeb_handle TBaseisamfile::handle(int key) const +{ + return prefix().get_handle(_isam_handle, key > 0 ? key : _curr_key); +} long TBaseisamfile::items() const { - NOT_OPEN(); - return(DB_reccount(filehnd()->fhnd)); + return DB_reccount(handle()); } const char* TBaseisamfile::name() const @@ -808,43 +634,30 @@ const char* TBaseisamfile::name() const } const char* TBaseisamfile::filename() const -{ - if (_isamfile == NULL && num() < LF_EXTERNAL) - { - TDir d; - d.get(num()); - strcpy(_isam_string, d.filename()); - } - else - { - strcpy(_isam_string, _isamfile->d->SysName); - strcat(_isam_string, ".dbf"); - } +{ + const int n = _isam_handle > 0 ? _isam_handle : num(); + const FileDes& d = prefix().get_filedes(n); + strcpy(_isam_string, d.SysName); + strcat(_isam_string, ".dbf"); return _isam_string; } const char* TBaseisamfile::description() { - if (_isamfile == NULL && num() < LF_EXTERNAL) - { - TDir d; - d.get(num()); - strcpy(_isam_string, d.des()); - return _isam_string; - } - return _isamfile->d->Des; + const int n = _isam_handle > 0 ? _isam_handle : num(); + const FileDes& d = prefix().get_filedes(n); + return d.Des; } TRecnotype TBaseisamfile::eod() const { - NOT_OPEN(); - return(DB_reccount(_isamfile->fhnd)); + return items(); } void TBaseisamfile::set_curr(TRectype * curr) - { - CHECK(curr != NULL, "You must pass a valid record"); + CHECK(curr != NULL, "You must set a valid current record"); + CHECK(num() == curr->num(), "You must set a coherent current record"); if (_current != NULL) delete _current; _current = curr; @@ -852,117 +665,56 @@ void TBaseisamfile::set_curr(TRectype * curr) void TBaseisamfile::setkey(int nkey) { - CHECKD(nkey > 0 && nkey-1 <= _isamfile->r->NKeys, "Chiave non valida ", nkey); - NOT_OPEN(); - - int rt = DB_tagselect(_isamfile->fhnd,nkey); - if (rt>=0) _isamfile->knum=nkey; - if (rt!=NOERR) rt=get_error(rt); - if (_lasterr == NOERR) setstatus(rt); + _curr_key = nkey; } int TBaseisamfile::getkey() const { - NOT_OPEN(); - CHECKD(DB_tagget(_isamfile->fhnd) == _isamfile->knum, "Chiave inconsistente sul file ", _logicnum); - return _isamfile->knum; + return _curr_key; } int TBaseisamfile::first(word lockop) - { return TBaseisamfile::read(curr(), _isfirst, lockop); } - int TBaseisamfile::last(word lockop) - { return TBaseisamfile::read(curr(), _islast, lockop); } -/*int TBaseisamfile::_next(word lockop) -{ - NOT_OPEN(); - curr().setdirty(); - if (_recno != DB_recno(_isamfile->fhnd)) - { - _lasterr = cisread(_isamfile, curr(), _isgreat + lockop); - if (_lasterr != NOERR) - { - _lasterr = get_error(_lasterr); - if (_lasterr != _islocked && _lasterr != _iseof) - fatal_box("Errore nella next %d : non posso riposizionarmi", _lasterr); - } - } - else - { - _lasterr=cisread(_isamfile, curr(), _isnext + lockop); - if (_lasterr != NOERR) _lasterr = get_error(_lasterr); - } - _recno = _isamfile->RecNo; - if( curr().has_memo( ) ) - curr( ).init_memo(_recno ); - return _lasterr; -} -*/ - int TBaseisamfile::next(word lockop) { return TBaseisamfile::read(curr(), _isnext, lockop); } - int TBaseisamfile::prev(word lockop) - { -/* NOT_OPEN(); - curr().setdirty(); - if (_recno != DB_recno(_isamfile->fhnd)) - { - _lasterr = cisread(_isamfile, curr(), _isgteq + _nolock); - if (_lasterr != NOERR) - { - _lasterr = get_error(_lasterr); - if (_lasterr != _islocked && _lasterr != _iseof) - fatal_box("Errore nella next %d : non posso riposizionarmi", _lasterr); - } - } - _lasterr=cisread(_isamfile, curr(), _isprev + lockop); - if (_lasterr != NOERR) _lasterr = get_error(_lasterr); - _recno = _isamfile->RecNo; - if( curr().has_memo( ) ) - curr( ).init_memo(_recno); - return _lasterr;*/ return TBaseisamfile::read(curr(), _isprev, lockop); } - int TBaseisamfile::reread(word lockop) - + { return TBaseisamfile::reread(curr(), lockop); } - int TBaseisamfile::reread(TRectype& rec, word lockop) - { return rec.read(*this, _iscurr, lockop); } - int TBaseisamfile::skip(TRecnotype nrec, word lockop) - { - char key[128]; - - NOT_OPEN(); if (!nrec) return NOERR; curr().setdirty(); - if (_recno != DB_recno(_isamfile->fhnd)) + + const int fhnd = handle(); + + // controllo se mi sono spostato dall'ultima lettura + if (_recno != DB_recno(fhnd)) { - _lasterr = DB_go(_isamfile->fhnd, _recno); + _lasterr = DB_go(fhnd, _recno); if (_lasterr != NOERR) { _lasterr = get_error(_lasterr); @@ -970,49 +722,51 @@ int TBaseisamfile::skip(TRecnotype nrec, word lockop) fatal_box("Errore nella skip %d : non posso riposizionarmi", _lasterr); } } - _lasterr=DB_skip(_isamfile->fhnd,nrec); - if (_lasterr != NOERR) _lasterr = get_error(_lasterr); - do { - if (_lasterr == _islocked) - { - __build_key(_isamfile->r, DB_tagget(_isamfile->fhnd), curr().string(), key,TRUE); - message_box("Codice %s in uso da parte\ndi un altro utente.", key); - } - _lasterr=cisread(_isamfile,curr(),_iscurr + lockop, _recno); - } while (_lasterr ==_islocked); - _recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd); - if( curr().has_memo( ) ) - curr( ).init_memo(_recno); + _lasterr=DB_skip(fhnd, nrec); + if (_lasterr != NOERR) + _lasterr = get_error(_lasterr); + while (_lasterr ==_islocked) + { + const RecDes& r = prefix().get_recdes(num()); + TString key(128); + __build_key(&r, _curr_key, curr().string(), key.get_buffer(), TRUE); + message_box("Codice %s in uso da parte\ndi un altro utente.", (const char*)key); + _lasterr = cisread(fhnd, getkey(), curr(),_iscurr + lockop, _recno); + } + + if (curr().has_memo()) + curr().init_memo(_recno); + return _lasterr; } - // funzione di lettura dei file int TBaseisamfile::_read(TRectype& rec, word op, word lockop) { - NOT_OPEN(); + const TCodeb_handle fhnd = handle(); rec.setdirty(); - _lasterr=cisread(_isamfile, rec, op + lockop, _recno); - if (_lasterr != NOERR) _lasterr=get_error(_lasterr); - _recno = _isamfile->RecNo; - if( rec.has_memo( ) ) + _lasterr=cisread(fhnd, getkey(), rec, op + lockop, _recno); + if(rec.has_memo()) rec.init_memo(_recno); + if (lockop && _lasterr == NOERR) + { + if (lockop == _lock) + prefix().lock_record(_isam_handle, _recno); + if (lockop == _unlock) + prefix().unlock_record(_isam_handle, _recno); + } return _lasterr; } int TBaseisamfile::read(TRectype& rec, word op, word lockop) - { -// CHECKD(op >= _iscurr && op <= _isgteq, "Invalid read operation : ", op); - NOT_OPEN(); _lasterr=rec.read(*this, op, lockop); return _lasterr; } int TBaseisamfile::read(word op, word lockop) - + { -// CHECKD(op >= _iscurr && op <= _isgteq, "Invalid read operation : ", op); return TBaseisamfile::read(curr(), op, lockop); } @@ -1026,162 +780,128 @@ int TBaseisamfile::readat(TRecnotype nrec, word lockop) return TBaseisamfile::readat(curr(), nrec, lockop); } - int TBaseisamfile::_readat(TRectype& rec, TRecnotype nrec, word lockop) { - NOT_OPEN(); + const int fhnd = handle(); rec.setdirty(); - _lasterr=DB_go(_isamfile->fhnd,nrec); + _lasterr=DB_go(fhnd,nrec); if (_lasterr != NOERR) _lasterr = get_error(_lasterr); else - rec = (const char *) DB_getrecord(_isamfile->fhnd); - _recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd); - if( rec.has_memo( ) ) - rec.init_memo( _recno ); + rec = (const char *) DB_getrecord(fhnd); + _recno = DB_recno(fhnd); + if(rec.has_memo()) + rec.init_memo(_recno); return _lasterr; } int TBaseisamfile::_write(const TRectype& rec) { -/* - NOT_OPEN(); - TRectype save_rec(curr()); - - const int cur_key = getkey(); - setkey(1); - _lasterr = cisread(_isamfile, save_rec, _isequal + _nolock); // Si Posiziona per sicurezza... - setkey(cur_key); - if (_lasterr == NOERR) - { - const int len = DB_reclen(_isamfile->fhnd); - - browse_null(curr().string(), len); - if (memcmp(curr().string(),save_rec.string(), len) != 0) - { - memcpy(DB_getrecord(_isamfile->fhnd), curr().string(), len); - _lasterr = DB_rewrite(_isamfile->fhnd); - if (_lasterr != NOERR) _lasterr = get_error(_lasterr); - } - else - DB_unlock(_isamfile->fhnd); - - _recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd); - if(_lasterr == NOERR && curr().has_memo( )) - curr( ).write_memo( _isamfile, _recno ); - } - return _lasterr; -*/ CHECK(!rec.empty(), "Can't write an empty record"); + #ifdef _DEMO_ - const int logicnum = num(); - if ((logicnum > LF_COMUNI && logicnum < LF_ANALISI) || logicnum > LF_RELANA) + if ((num() > LF_COMUNI && num() < LF_ANALISI) || num() > LF_RELANA) { if (items() > 979L) return _isfilefull; } #endif - NOT_OPEN(); - const int dst_len = DB_reclen(_isamfile->fhnd); - CHECKD(rec.len() == dst_len, "Record size mismatch on file ", _logicnum); - - const int oldkey=getkey(); - browse_null(rec.string(), dst_len); - setkey(1); - memcpy(DB_getrecord(_isamfile->fhnd), rec.string(), dst_len); - _lasterr = DB_add(_isamfile->fhnd); - if (_lasterr != NOERR) _lasterr = get_error(_lasterr); - setkey(oldkey); + // Forza l'uso della chiave principale (per chiavi duplicate?) + const int fhnd = handle(1); - _recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd); + const int dst_len = DB_reclen(fhnd); + if (dst_len != rec.len()) + NFCHECK("Record size mismatch on file %d: RecDes=%d, DB_reclen=%d", + _logicnum, rec.len(), dst_len); + + browse_null(rec.string(), dst_len); + memcpy(DB_getrecord(fhnd), rec.string(), dst_len); + _lasterr = DB_add(fhnd); + if (_lasterr != NOERR) _lasterr = get_error(_lasterr); + + _recno = DB_recno(fhnd); if (_lasterr == NOERR && rec.has_memo()) - ((TRectype &)rec).write_memo( _isamfile, _recno ); + ((TRectype &)rec).write_memo( fhnd, _recno ); return _lasterr; } int TBaseisamfile::write(const TRectype& rec) { -// CHECK(!rec.empty(), "Can't write an empty record"); return rec.write(*this); } int TBaseisamfile::write() { -// CHECK(!curr().empty(), "Can't write an empty record"); return TBaseisamfile::write(curr()); } - int TBaseisamfile::_rewrite(const TRectype& rec) { CHECK(!rec.empty(), "Can't write an empty record"); - NOT_OPEN(); TRectype save_rec(rec); - const int cur_key = getkey(); - setkey(1); - _lasterr = cisread(_isamfile, save_rec, _isequal + _nolock, _recno); // Si Posiziona per sicurezza... - setkey(cur_key); + + // Forza l'uso della chiave principale (per chiavi duplicate?) + const int fhnd = handle(1); + _lasterr = cisread(fhnd, 1, save_rec, _isequal + _nolock, _recno); // Si Posiziona per sicurezza... + if (_lasterr == NOERR) { - const int len = DB_reclen(_isamfile->fhnd); - CHECKD(len == save_rec.len(), "Record size mismatch on file ", _logicnum); + const int len = DB_reclen(fhnd); + if (len != save_rec.len()) + NFCHECK("Record size mismatch on file %d: RecDes=%d, DB_reclen=%d", + _logicnum, save_rec.len(), len); browse_null(rec.string(), len); if (memcmp(rec.string(), save_rec.string(), len) != 0) { - memcpy(DB_getrecord(_isamfile->fhnd), rec.string(), len); - _lasterr = DB_rewrite(_isamfile->fhnd); - if (_lasterr != NOERR) _lasterr = get_error(_lasterr); + memcpy(DB_getrecord(fhnd), rec.string(), len); + _lasterr = DB_rewrite(fhnd); + if (_lasterr != NOERR) + _lasterr = get_error(_lasterr); } else - DB_unlock(_isamfile->fhnd); - _recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd); + DB_unlock(fhnd); + _recno = DB_recno(fhnd); if(_lasterr == NOERR && curr().has_memo( )) - ((TRectype &)rec).write_memo( _isamfile, _recno ); + ((TRectype &)rec).write_memo( fhnd, _recno ); } return _lasterr; } int TBaseisamfile::rewrite(const TRectype& rec) - { -// CHECK(!rec.empty(), "Can't write an empty record"); return rec.rewrite(*this); } int TBaseisamfile::rewrite() { -// CHECK(!curr().empty(), "Can't rewrite an empty record"); return TBaseisamfile::rewrite(curr()); } - int TBaseisamfile::rewriteat(const TRectype& rec, TRecnotype nrec) - { - NOT_OPEN(); - if ((_lasterr=DB_go(_isamfile->fhnd,nrec))== NOERR) + const int fhnd = handle(); + + if ((_lasterr=DB_go(fhnd,nrec))== NOERR) { - browse_null(rec.string(),DB_reclen(_isamfile->fhnd)); - memcpy(DB_getrecord(_isamfile->fhnd),rec.string(),DB_reclen(_isamfile->fhnd)); - _lasterr=DB_rewrite(_isamfile->fhnd); + browse_null(rec.string(),DB_reclen(fhnd)); + memcpy(DB_getrecord(fhnd),rec.string(),DB_reclen(fhnd)); + _lasterr=DB_rewrite(fhnd); if (_lasterr != NOERR) _lasterr = get_error(_lasterr); } else _lasterr = get_error(_lasterr); - _recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd); + _recno = DB_recno(fhnd); if(_lasterr == NOERR && curr().has_memo( )) - ((TRectype &)rec).write_memo( _isamfile, _recno ); + ((TRectype &)rec).write_memo( fhnd, _recno ); return _lasterr; } - int TBaseisamfile::rewriteat(TRecnotype nrec) - { return TBaseisamfile::rewriteat(curr(),nrec); } @@ -1191,33 +911,21 @@ int TBaseisamfile::_remove(const TRectype& rec) { CHECK(!rec.empty(), "Can't remove an empty record"); - NOT_OPEN(); - memcpy(DB_getrecord(_isamfile->fhnd),rec.string(),DB_reclen(_isamfile->fhnd)); - if ((_lasterr=cisread(_isamfile, (TRectype&) rec, _isequal + _nolock, _recno))==NOERR) + const int fhnd = handle(1); + memcpy(DB_getrecord(fhnd),rec.string(),DB_reclen(fhnd)); + if ((_lasterr=cisread(fhnd, 1, (TRectype&)rec, _isequal + _nolock, _recno))==NOERR) { - _lasterr = DB_delete(_isamfile->fhnd); // Put only deletion flag on record, must remove keys too! + _lasterr = DB_delete(fhnd); // Put only deletion flag on record, must remove keys too! if (_lasterr != NOERR) { _lasterr = get_error(_lasterr); - DB_recall(_isamfile->fhnd); + DB_recall(fhnd); } -#ifndef CB6 - else - { - _lasterr=delkeys(_isamfile,rec.string(),_isamfile->RecNo); - if (_lasterr != NOERR) - { - DB_recall(_isamfile->fhnd); - _lasterr = get_error(_lasterr); - } - } -#endif } if(_lasterr == NOERR && curr().has_memo()) curr().memo_recno(); - _recno = _isamfile->RecNo = DB_recno(_isamfile->fhnd); return _lasterr; } @@ -1233,17 +941,19 @@ int TBaseisamfile::remove() int TBaseisamfile::lock() { - NOT_OPEN(); - _lasterr = DB_lockfile(_isamfile->fhnd); - if (_lasterr != NOERR) _lasterr = get_error(_lasterr); + const int fhnd = handle(); + _lasterr = DB_lockfile(fhnd); + if (_lasterr != NOERR) + _lasterr = get_error(_lasterr); return _lasterr; } int TBaseisamfile::unlock() { - NOT_OPEN(); - _lasterr = DB_unlock(_isamfile->fhnd); - if (_lasterr != NOERR) _lasterr = get_error(_lasterr); + const int fhnd = handle(); + _lasterr = DB_unlock(fhnd); + if (_lasterr != NOERR) + _lasterr = get_error(_lasterr); return (_lasterr); } @@ -1251,15 +961,16 @@ void TBaseisamfile::indexon() { } -bool TBaseisamfile::empty() -{ - return (DB_reccount(_isamfile->fhnd) == 0); -} - void TBaseisamfile::indexoff() { } +bool TBaseisamfile::empty() +{ + return items() <= 0; +} + + // @doc EXTERNAL // @mfunc Apre il file isam di base con lock @@ -1281,51 +992,33 @@ int TBaseisamfile::_open( // @flag FALSE | Il file viene aperto senza indici { - CHECKS(filehnd() == NULL, "File already open ", (const char*)filename()); - - getisfd(_isamfile,num()); - if ((filehnd()->fhnd = DB_open(filehnd()->d->SysName,mode==_excllock,index)) >= 0) + CHECKD(_isam_handle == 0, "Can't reopen file ", _logicnum); + _curr_key = index ? 1 : 0; + + TFilename filename; + _isam_handle = prefix().open_isamfile(_logicnum, filename, mode==_excllock, index); + if (_isam_handle > 0) { - TRecnotype n=DB_reccount(filehnd()->fhnd); - TDir d; - d.get(num(),_nolock,_nordir,_sysdirop); - if (d.is_com()) d.get(num(),_nolock,_comdir,_sysdirop); - if ((filehnd()->d->EOD != n && n > 0) || (n > d.eox())) - { - filehnd()->d->EOD = d.eod() = n; - filehnd()->d->EOX = d.eox() = n; - if (d.is_com()) - d.put(num(),_comdir,_sysdirop); - else - d.put(num(),_nordir,_sysdirop); - } - filehnd()->ln = num(); - openf[num() - 1] = filehnd(); _recno = RECORD_NON_FISICO; - - CHECKD(filehnd()->r->NKeys > 0, "File senza indici: ", num()); - setkey(1); _lasterr = NOERR; } else { TString e_msg; - _lasterr = get_error(filehnd()->fhnd); + _lasterr = get_error(_isam_handle); if (_lasterr == -60) { - int rc = access(filename(),0); // check for existance - if (rc!=0) - e_msg.format("Il file %d(%s) non esiste, errore %d",num(),filename(),_lasterr); + if (!filename.exist()) + e_msg.format("Il file %d(%s) non esiste, errore %d",num(),(const char*)filename,_lasterr); else - e_msg.format("Il file %d(%s) e' aperto in modo esclusivo da un'altra applicazione", - num(), filename()); + e_msg.format("Il file %d(%s) e' aperto in modo esclusivo da un'altra applicazione", + num(), (const char*)filename); } if (e_msg.empty()) - e_msg.format("Il file %d(%s) non puo' essere aperto, errore %d",num(),filename(),_lasterr); - relisfd(_isamfile); + e_msg.format("Il file %d(%s) non puo' essere aperto, errore %d",num(),(const char*)filename,_lasterr); fatal_box((const char*) e_msg); } - return (_lasterr); + return _lasterr; } int TBaseisamfile::_open_ex( @@ -1343,112 +1036,59 @@ int TBaseisamfile::_open_ex( // @flag FALSE | Il file viene aperto senza indici { - if (openf[num() - 1] != NULL) - return _isalropen; // Gia' aperto - - getisfd(_isamfile,num()); - - if (filehnd()->r->NKeys <= 0) - { - relisfd(_isamfile); - return _lasterr = _ispatherr; // Nessun indice - } + CHECKD(_isam_handle == 0, "Can't reopen file ", _logicnum); + _curr_key = index ? 1 : 0; - if ((filehnd()->fhnd = DB_open(filehnd()->d->SysName,mode==_excllock,index)) >= 0) - { - TRecnotype n=DB_reccount(filehnd()->fhnd); - TDir d; - d.get(num(),_nolock,_nordir,_sysdirop); - if (d.is_com()) d.get(num(),_nolock,_comdir,_sysdirop); - if ((filehnd()->d->EOD != n && n > 0) || (n > d.eox())) + TFilename filename; + _isam_handle = prefix().open_isamfile(_logicnum, filename, mode==_excllock, index); + if (_isam_handle > 0) + { + if (prefix().get_reclen(_logicnum) > 0) { - filehnd()->d->EOD = d.eod() = n; - filehnd()->d->EOX = d.eox() = n; - if (d.is_com()) - d.put(num(),_comdir,_sysdirop); - else - d.put(num(),_nordir,_sysdirop); - } - filehnd()->ln = num(); - openf[num() - 1] = filehnd(); - _recno = RECORD_NON_FISICO; - - setkey(1); - _lasterr = NOERR; - } - else - { - _lasterr = get_error(filehnd()->fhnd); - if (_lasterr == -60) - { - if (fexist(filename())) - _lasterr = _islocked; - else - _lasterr = 2; - } - relisfd(_isamfile); - } - return _lasterr; -} - - -int TBaseisamfile::_close() - -{ - int err = NOERR; - - if (filehnd() != NULL) - { - if (num() > 0) - { - TDir d; - TRecnotype n=DB_reccount(filehnd()->fhnd); - d.get(num(),_nolock,_nordir,_sysdirop); - if (d.is_com()) d.get(num(),_nolock,_comdir,_sysdirop); - if ((filehnd()->d->EOD != n && n > 0) || (n > d.eox())) + const int fhnd = handle(); + if (fhnd >= 0) { - filehnd()->d->EOD = d.eod() = n; - filehnd()->d->EOX = d.eox() = n; - if (d.is_com()) - d.put(num(),_comdir,_sysdirop); - else - d.put(num(),_nordir,_sysdirop); + _recno = RECORD_NON_FISICO; + _lasterr = NOERR; } - CHECK(openf[num() - 1] != NULL, "Open file array corrupted"); - err=DB_close(filehnd()->fhnd); - if (err != NOERR) err = get_error(err); - if ((err == NOERR) && (num() > 0)) - openf[num() - 1] = NULL; + else + _lasterr = get_error(fhnd); } else - if (filehnd() == NULL) - { - err = _isnotopen; - error_box("File n. %d close : Error n. %d ", num(), err); - } - if (err == NOERR) - { - relisfd(_isamfile); - clearfilehnd(); - } + _lasterr = _isbadtrc; + } + else + { + _isam_handle = 0; + _lasterr = get_error(_isam_handle); } + return _lasterr; +} + +int TBaseisamfile::_close() +{ + int err = prefix().close_isamfile(_isam_handle); setstatus(err); return err; } int TBaseisamfile::is_valid() -{ // Ritorna 0 se il file puo' essere aperto senza errori - CHECKS(filehnd() == NULL, "File already open ", (const char*)filename()); - int err = NOERR; - getisfd(_isamfile,num()); - if ((filehnd()->fhnd = DB_open(filehnd()->d->SysName,0,TRUE)) >= 0) +{ // Ritorna NOERR se il file puo' essere aperto senza errori + CHECKD(_isam_handle == 0, "Can't reopen file ", _logicnum); + TFilename filename; + TIsam_handle isam_handle = prefix().open_isamfile(_logicnum, filename, FALSE, TRUE); + int err= isam_handle > 0 ? prefix().get_handle(isam_handle,1) : -60; + if (err < 0) + err = get_error(err); + else { - if (DB_tagget(filehnd()->fhnd) == -1) err = _ispatherr; - DB_close(filehnd()->fhnd); + if (prefix().get_reclen(_logicnum) > 0) + err = NOERR; + else + err = _isbadtrc; } - else - err = get_error(filehnd()->fhnd); - relisfd(_isamfile); + if (isam_handle > 0) + prefix().close_isamfile(isam_handle); return err; } @@ -1467,99 +1107,43 @@ TLocalisamfile::TLocalisamfile( { if (open() != NOERR) fatal_box("Impossibile aprire il file %d", logicnum); - if (_was_open) - _oldkey = getkey(); - setkey(1); } // @mfunc Costruttore // // @rdesc Ritorna l'oggetto TLocalisamfile::TLocalisamfile( - const char* name) // @parm Nome del file esterno da aprire -: TBaseisamfile(name) + const char* name, // @parm Nome del file esterno da aprire + int mode, + bool index) +: TBaseisamfile(name, mode, index) { - _was_open = FALSE; } TLocalisamfile::TLocalisamfile(int logicnum, bool tmpfile) : TBaseisamfile(logicnum) { - CHECK(tmpfile = TRUE, "Protected constructor badly used"); - _was_open = TRUE; + CHECK(tmpfile == TRUE, "Protected constructor badly used"); } TLocalisamfile::~TLocalisamfile() { - if (_isamfile) - { - if (_was_open) - setkey(_oldkey); - close(); - } + close(); } int TLocalisamfile::close() { - int err = NOERR; - - if (_was_open) - { - clearfilehnd(); - } - else - { - if (_isamfile) - { - TRecnotype n = DB_reccount(filehnd()->fhnd); - TDir d; - d.get(num(),_nolock,_nordir,_sysdirop); - if (d.is_com()) d.get(num(),_nolock,_comdir,_sysdirop); - if ((filehnd()->d->EOD!=n && n > 0) || (n > d.eox())) - { - filehnd()->d->EOD = d.eod() = n; - filehnd()->d->EOX = d.eox() = n; - if (d.is_com()) - d.put(num(),_comdir,_sysdirop); - else - d.put(num(),_nordir,_sysdirop); - } - err = DB_close(_isamfile->fhnd); - _isamfile->fhnd = -1; - if (err != NOERR) err = get_error(err); - relisfd(_isamfile); - _isamfile=NULL; - } - openf[num() -1] = NULL; - } - setstatus(err); - return err; + return TBaseisamfile::_close(); } int TLocalisamfile::open(unsigned int mode) { - int err = NOERR; - const int logicnum = num(); - - if (openf[logicnum - 1] != NULL) - { - _was_open = TRUE; - _isamfile = openf[logicnum - 1]; - } - else - { - err = _open_ex(mode, TRUE); - _was_open = FALSE; - } - - setstatus(err); - return err; + return TBaseisamfile::_open(mode); } int TLocalisamfile::operator +=(const TRecnotype npos) - { skip(npos); return status(); @@ -1567,7 +1151,6 @@ int TLocalisamfile::operator +=(const TRecnotype npos) int TLocalisamfile::operator -=(const TRecnotype npos) - { skip(-npos); return status(); @@ -1575,7 +1158,6 @@ int TLocalisamfile::operator -=(const TRecnotype npos) int TLocalisamfile::operator ++() - { next(); return status(); @@ -1583,7 +1165,6 @@ int TLocalisamfile::operator ++() int TLocalisamfile::operator --() - { prev(); return status(); @@ -1597,41 +1178,44 @@ TIsamfile::TIsamfile(int logicnum) TIsamfile::~TIsamfile() - { close(); } +/* + // @doc EXTERNAL // @mfunc Aggiorna i flags associati al file // -// @rdesc Ritorna NOERR se e' riuscita ad eseguiore l'operazione, altrimenti ritorna il numero +// @rdesc Ritorna NOERR se e' riuscita ad eseguire l'operazione, altrimenti ritorna il numero // di errore generato (vedi ). int TIsamfile::flags( bool updateeod) // @parm Indica se aggiornare anche l'EOD del file { + if (num() <= 0) + return NOERR ; + TDir d; - int err = NOERR; - - if (filehnd()->ln <= 0) return NOERR ; - NOT_OPEN(); - - const TDirtype dirtype = (TDirtype) filehnd()->ft; - + const TDirtype dirtype = prefix().get_dirtype(_filename); d.get(num(), _lock, dirtype); - if ((err = d.status(dirtype)) == NOERR) + int err = d.status(dirtype); + if (err == NOERR) { - d.flags() = filehnd()->d->Flags; - if (updateeod) d.eod() = filehnd()->d->EOD; + const FileDes& fd = prefix().get_filedes(_filename); + d.flags() = fd.Flags; + if (updateeod) + d.eod() = fd.EOD; d.put(num(), dirtype); } setstatus(err); return err; } +*/ + /////////////////////////////////////////////////////////// // TIsamtempfile /////////////////////////////////////////////////////////// @@ -1703,56 +1287,45 @@ int TIsamtempfile::open( { int err = NOERR; - TFilename tmpname; - - CHECKS(filehnd() == NULL, "File already open", (const char*)filename()); + TFilename filename; if (radix[0] == '%') - tmpname << &radix[1] ; + filename << &radix[1] ; else - tmpname.temp(radix); - tmpname.ext(""); - - getisfd (_isamfile, num()); - strcpy(filehnd()->d->SysName, (const char*)tmpname); - filehnd()->d->EOX = eox; + filename.temp(radix); + filename.ext(""); + + CHECKS(_isam_handle == 0, "File already open ", (const char*)filename); + if (create) { - err=DB_build(filehnd()->d->SysName, filehnd()->r) ; - if (err == NOERR) - filehnd()->d->EOD = 0L; - else + RecDes* r = (RecDes*)&prefix().get_recdes(num()); + err = DB_build(filename, r) ; + if (err != NOERR) { err = get_error(err); - relisfd(_isamfile); - fatal_box("Can't create temp file '%s': Error n. %d", (const char*)tmpname, err); + fatal_box("Can't create temp file '%s' num. %d: Error n. %d", (const char*)filename, num(), err); } } - else - filehnd()->d->EOD = eod; - filehnd()->fhnd = DB_open(filehnd()->d->SysName, 0, TRUE); - if (filehnd()->fhnd < 0) - err = get_error(filehnd()->fhnd); + + _isam_handle = prefix().open_isamfile(_logicnum, filename); + TCodeb_handle fhnd = handle(_curr_key = 1); + if (fhnd < 0) + err = get_error(fhnd); if (err != NOERR) { - TFilename n(filehnd()->d->SysName); - - relisfd(_isamfile); + filename.ext("dbf"); if (err == -60) { - if (access(n,0)) // check for existance - fatal_box("Apertura file %s : errore n. %d. File non esistente.",(const char*) n,err); + if (!filename.exist()) // check for existance + fatal_box("Apertura file %s : errore n. %d. File non esistente.",(const char*)filename,err); else - fatal_box("Apertura file %s : errore n. %d. File aperto in uso esclusivo da un'altra applicazione.",(const char*) n,err); + fatal_box("Apertura file %s : errore n. %d. File aperto in uso esclusivo da un'altra applicazione.",(const char*)filename,err); } else - fatal_box("Apertura file %s : errore n. %d ",(const char*) n,err); - } - else - { - filehnd()->ln = -num(); - filehnd()->knum = 1; + fatal_box("Apertura file %s : errore n. %d ",(const char*)filename,err); } + _recno = RECORD_NON_FISICO; setstatus(err); return err; @@ -1761,44 +1334,37 @@ int TIsamtempfile::open( int TIsamtempfile::close() { - int err = NOERR; - - if (filehnd() != NULL) + TFilename f = filename(); + int err = prefix().close_isamfile(_isam_handle); + if (err == NOERR && _autodel) { - err=DB_close(filehnd()->fhnd); - if (err != NOERR) err = get_error(err); - if (_autodel && err==NOERR) - { - TFilename f(filehnd()->d->SysName); - long c = DB_getconf(); + long c = DB_getconf(); - f.ext("dbf"); - ::remove((const char*)f); - if (c & 1) // FOXPRO format - f.ext("cdx"); - if (c & 4) // DBIV format - f.ext("mdx"); - if (c & 8 || c & 2) // CLIPPER and DBIII format + f.ext("dbf"); + ::remove(f); + if (c & 1) // FOXPRO format + f.ext("cdx"); + if (c & 4) // DBIV format + f.ext("mdx"); + if (c & 8 || c & 2) // CLIPPER and DBIII format + { + f.ext("cgp"); + FILE *fp=fopen((const char*)f,"r"); + char in[16]; + while (fgets(in,16,fp)!=NULL) { - f.ext("cgp"); - FILE *fp=fopen((const char*)f,"r"); - char in[16]; - while (fgets(in,16,fp)!=NULL) - { - TFilename a(in); - if (c & 8) // DBIII format - a.ext("ndx"); - else - a.ext("ntx"); // CLIPPER format - ::remove((const char *)a); - } - fclose(fp); + TFilename a(in); + if (c & 8) // DBIII format + a.ext("ndx"); + else + a.ext("ntx"); // CLIPPER format + ::remove((const char *)a); } - ::remove((const char *)f); + fclose(fp); } - relisfd(_isamfile); - clearfilehnd(); + ::remove(f); } + setstatus(err); return err; } @@ -1806,76 +1372,19 @@ int TIsamtempfile::close() /////////////////////////////////////////////////////////// // TExternisamfile /////////////////////////////////////////////////////////// -TExternisamfile::TExternisamfile(const char* name, bool exclusive, bool index) -: TLocalisamfile(name) +TExternisamfile::TExternisamfile(const char* name, int mode, bool index) +: TLocalisamfile(name, mode, index) { - _name = name; - _name.ext("dbf"); -// Espande il nome! - const char c = _name[0]; - if (c == '%' || c == '$') - _name = CAddPref((char*)(const char*)_name); - else - if (c == '#') - { - _name.ltrim(1); - _name.format("%s/%s",__ptprf,(const char*)_name); - } - open(exclusive, index); } TExternisamfile::~TExternisamfile() { - close(); -} - -int TExternisamfile::open(bool exclusive, bool index) -{ - int err=NOERR; - - filehnd()->fhnd = DB_open(_name, exclusive, index); - if (filehnd()->fhnd < 0) - err = get_error(filehnd()->fhnd); - if (err != NOERR) - { - relisfd(_isamfile); - if (err == -60) - { - if (access(_name,0)) // check for existance - fatal_box("Apertura file %s : errore n. %d. File non esistente.",(const char*) _name,err); - else - fatal_box("Apertura file %s : errore n. %d. File aperto in uso esclusivo da un'altra applicazione.",(const char*) _name,err); - } - else - fatal_box("Apertura file %s : errore n. %d ",(const char*) _name,err); - } - else - filehnd()->knum = 1; - _recno = RECORD_NON_FISICO; - setstatus(err); - return err; -} - -int TExternisamfile::close() -{ - CHECKS(filehnd() != NULL, "File already closed", (const char*)_name); - int err; - err=DB_close(filehnd()->fhnd); - if (err != NOERR) err = get_error(err); - if (err == NOERR) - { - ext_files[_isamfile->ln - LF_EXTERNAL] = NULL; - relisfd(_isamfile); - clearfilehnd(); - } - setstatus(err); - return err; + _close(); } const char* TExternisamfile::name() const { - sprintf(_isam_string, "%s", (const char*)_name); - return _isam_string; + return filename(); } /////////////////////////////////////////////////////////// @@ -1884,32 +1393,24 @@ const char* TExternisamfile::name() const int TSystemisamfile::build(TRecnotype eox, const TTrec& r) { - CHECKS(filehnd() == NULL, "Can't build open file", (const char*)filename()); int err=NOERR; TDir d; d.get(num()); CHECK(r.len() != 0, "Can't create a file with empty field info"); - TFilename f(d.name()); + TFilename f(filename()); + + TFilename fname(f); fname.ext(""); // sostituto per _filename f = f.path(); if (!is_not_slash(f.right(1)[0])) f.rtrim(1); if (!fexist(f)) make_dir(f); if (r.len() != 0) { - err=DB_build(d.name(),r.rec()); - if (err == NOERR) - { - isfdptr i; - getisfd(i,num()); - i->d->EOX = eox; - i->fhnd = 0; // So relisfd() will record the EOX just set - relisfd(i); - } - else + err=DB_build(fname,r.rec()); + if (err != NOERR) err = get_error(err); setstatus(err); - clearfilehnd(); #ifndef FOXPRO if (err == NOERR && __autoload) @@ -1936,23 +1437,6 @@ int TSystemisamfile::extend(TRecnotype eox) { int err = NOERR; - isfdptr i; - - CHECKS(filehnd() == NULL, "Can't extend open file ", (const char*)filename()); - getisfd(i,num()); - if (num() > 0) - { - if (eox < i->d->EOD) - err = _ispathfull; - else - { - i->d->EOX = eox; - i->fhnd = 0; // So relisfd() will write the EOX just set. - } - } - relisfd(i); - setstatus(err); - clearfilehnd(); return err; } @@ -1982,12 +1466,19 @@ int TSystemisamfile::exec_convapp( if (flev == 0) flev = 199401; else flev++; + + TConfig conv(CONFIG_FCONV); + TString16 paragraph; + + TString_array paralist; + conv.list_paragraphs(paralist); + for (long l = flev; err == 0 && l <= get_std_level(); l++) { - TString16 paragraph; paragraph.format("%06ld", l); - TConfig conv(CONFIG_FCONV, paragraph); - - if (!conv.new_paragraph() && conv.exist(v, num())) + paragraph.format("%06ld", l); + if (paralist.find(paragraph) < 0) + continue; + if (conv.set_paragraph(paragraph) && conv.exist(v, num())) { TToken_string s(conv.get(v, NULL, num()), ' '); TFilename f(s.get(0)); @@ -2025,12 +1516,20 @@ bool TSystemisamfile::getlcf( _exps.destroy(); if (flev == 0) flev = 199401; else flev++; + + TConfig conv(CONFIG_FCONV); + TString16 paragraph; + + TString_array paralist; + conv.list_paragraphs(paralist); + for (long l = flev; l <= get_std_level(); l++) { - TString16 paragraph(format("%06ld", l)); - TConfig conv(CONFIG_FCONV, paragraph); + paragraph.format("%06ld", l); + if (paralist.find(paragraph) < 0) + continue; - if (!conv.new_paragraph() && conv.exist("F", num())) + if (conv.set_paragraph(paragraph) && conv.exist("F", num())) { TToken_string exprline(conv.get("F", NULL, num())); @@ -2053,7 +1552,6 @@ bool TSystemisamfile::getlcf( } void TSystemisamfile::makelc(TRectype& rec) - { for (int i = 0 ; i < _flds.items(); i++) { @@ -2072,13 +1570,14 @@ void TSystemisamfile::makelc(TRectype& rec) // // @rdesc Ritorna il risulato della conversione, altrimenti il codice di errore generato // (vedi ) + int TSystemisamfile::update( const TTrec& newrec, // @parm Nuovo tracciato record con cui aggiornare il file bool vis) // @parm Indica se visualizzare lo stato dell'operazione { - CHECKS(filehnd() == NULL, "Can't update open file", (const char*)filename()); - CHECK(newrec.len() != 0, "Can't update to file with empty field info"); + CHECK(newrec.len() != 0, "Can't update file with empty field info"); + int err = NOERR; TTrec wrec(newrec); TDir dir; @@ -2087,130 +1586,159 @@ int TSystemisamfile::update( const bool is_com = prefix().is_com(); const bool toconvert = is_com ? dir.is_com() : dir.is_firm(); - int err = NOERR; TTrec oldrec; - oldrec.get(num()); - if (wrec.len() != 0) + + const int lenr = wrec.len(); + + if (lenr != 0) { const long lev = prefix().filelevel(); const bool lcf = getlcf(lev); - err = exec_convapp(lev, TRUE); - if (err != NOERR) + if (toconvert) { - setstatus(err); - return err; - } + err = exec_convapp(lev, TRUE); // Pre-conversion + if (err != NOERR) + { + setstatus(err); + return err; + } - if (!lcf && wrec == oldrec) + if (!lcf && wrec == oldrec) + { + err = exec_convapp(lev, FALSE); // Post-conversion + setstatus(err); + return err; + } + } + else { - err = exec_convapp(lev, FALSE); - setstatus(err); - return err; + if (dir.eox() > 0L) + { + dir.eod() = 0L; + dir.eox() = 0L; + } } - - const TRecnotype nitems = dir.eod(); - const unsigned int lenr = wrec.len(); - - if (!toconvert && dir.eox() > 0L) - { - dir.eod() = 0L; - dir.eox() = 0L; - } - - TFilename fname(filename()); - if (toconvert && (dir.eox() > 0L || fexist(fname))) + TFilename fname; + if (toconvert) + fname = filename(); + + if (toconvert && (dir.eox() > 0L || fname.exist())) { TRecnotype ni = 0L; - isfdptr i0; - TFilename tmpfname("tmpf"); + TFilename tmpfname; tmpfname.temp("tf"); - open(_excllock); - getisfd(i0, num()); - err=DB_build((const char*) tmpfname, wrec.rec()); + err = _open_ex(_excllock); + if (err != NOERR) + return err; + + err=DB_build(tmpfname, wrec.rec()); if (err != NOERR) { err=get_error(err); return (err); } - i0->fhnd=DB_open((const char*)tmpfname,0, TRUE); - if (i0->fhnd < 0 ) err=get_error(i0->fhnd); - TString s(80), fld_name, fld_val; - s.format("Aggiornamento archivio %s", (const char*) fname); - TProgind p(nitems ? nitems : 1, s, TRUE, TRUE, 70); - int nflds = curr().items(); - TArray fld(nflds); + + // Apro il file destinazione in modo esclusivo e senza indici + int tmpnum = num(); + TIsam_handle ishandle = prefix().open_isamfile(tmpnum, tmpfname, TRUE, FALSE); + TCodeb_handle fhnd = prefix().get_handle(ishandle); + if (fhnd < 0 ) + { + err=get_error(fhnd); + return err; + } + + TString s(80); + s.format("Aggiornamento archivio %s\nTempo stimato alla fine del processo: ", (const char*) fname); + + const TRecnotype nitems = items(); + TProgind p(nitems > 0 ? nitems : 1, s, FALSE, TRUE, 70); + TExtrectype nrec(wrec); - TRecnotype i = 0; - + + const int nflds = curr().items(); + TArray infld, outfld; for (int j = 0; j < nflds; j++) - fld.add(TString(curr().fieldname(j)), j); - + { + const char* fld_name = curr().fieldname(j); + infld.add(new TRecfield(curr(), fld_name), j); + if (nrec.exist(fld_name)) + outfld.add(new TRecfield(nrec, fld_name), j); + } + + const clock_t start_time = clock(); for (first(); good(); next()) { - if ((i++ % 50) == 0) p.setstatus(i + 1); - nrec.zero(); + const bool tick = p.addstatus(1); ni++; - for (j = 0; j < nflds; j++) + + if (curr().isdeleted()) + continue; + + nrec.zero(); + for (j = outfld.first(); j < nflds; j = outfld.succ(j)) { - fld_name = (TString&) fld[j]; - if (nrec.exist((fld_name))) - { - fld_val = get(fld_name); - // Se il campo e' di tipo stringa ed e' stato accorciato, tronca il contenuto, - // per evitare segnalazioni inutili in conversione. Nel caso di campo numerico - // viene "zappato" - // Questo trattamento non viene effettuato per i campi data - // perchè la get() restituisce una data formattata e quindi - // di lunghezza maggiore, ciò provoca una "zappatura" indiscriminata - // di tutti i campi data (fa pure rima) L.A. - TFieldtypes fld_type = nrec.type(fld_name); - if (fld_type != _datefld) - { - const int l1 = nrec.length(fld_name); - const int l2 = fld_val.len(); - if ( l1 < l2) - fld_val.cut(fld_type == _alfafld ? l1 : 0); - } - nrec.put(fld_name, fld_val); - } + TRecfield& in_fld = (TRecfield&)infld[j]; + TRecfield& out_fld = (TRecfield&)outfld[j]; + const char* fld_val = in_fld; + out_fld = fld_val; } if (lcf) makelc((TRectype &)nrec); - browse_null(nrec.string(),DB_reclen(i0->fhnd)); - memcpy(DB_getrecord(i0->fhnd),nrec.string(),DB_reclen(i0->fhnd)); - err=DB_add(i0->fhnd); + browse_null(nrec.string(),lenr/*DB_reclen(fhnd)*/); + memcpy(DB_getrecord(fhnd),nrec.string(),lenr/*DB_reclen(fhnd)*/); + err=DB_add(fhnd); if ( err == NOERR && nrec.has_memo()) - nrec.write_memo( i0, DB_recno(i0->fhnd)); - if (err != NOERR) err=get_error(err); + nrec.write_memo(fhnd, DB_recno(fhnd)); + if (err != NOERR) + err=get_error(err); setstatus(err); + + if (tick) + { + const clock_t elapsed_ticks = clock() - start_time; + const clock_t total_ticks = elapsed_ticks * nitems / ni; + const clock_t estimated_ticks = total_ticks - elapsed_ticks; + long secs = estimated_ticks / CLOCKS_PER_SEC; + CHECK(secs >= 0, "Bad time estimation"); + const int hours = int(secs / 3600L); + secs %= 3600L; + const int mins = int(secs / 60L); + secs %= 60L; + const int append_pos = s.find("o: ")+3; + s.cut(append_pos); + s << format("%02d:%02d:%02ld", hours, mins, secs); + p.set_text(s); + } } - const int werr=DB_close(i0->fhnd); close(); + prefix().close_isamfile(ishandle); + if (err!=NOERR) err=get_error(err); - relisfd(i0); + p.setstatus(nitems); if (err == NOERR) { long c = DB_getconf(); fname.ext("dbf"); tmpfname.ext("dbf"); - fcopy((const char*)tmpfname,(const char*)fname); - ::remove((const char*)tmpfname); + fcopy(tmpfname, fname); + ::remove(tmpfname); if (c & 1) tmpfname.ext("fpt"); else tmpfname.ext("dbt"); - if (fexist((const char *) tmpfname)) + if (tmpfname.exist()) { if (c & 1) fname.ext("fpt"); else fname.ext("dbt"); - fcopy((const char*)tmpfname,(const char*)fname); - ::remove((const char*)tmpfname); + fcopy(tmpfname, fname); + ::remove(tmpfname); } if (c & 1) // FOXPRO format tmpfname.ext("cdx"); @@ -2219,31 +1747,37 @@ int TSystemisamfile::update( if (c & 8 || c & 2) { tmpfname.ext("cgp"); - char in[16]; - FILE *fp=fopen((const char *) tmpfname,"r"); - while (fgets(in,16,fp)!=NULL) + TFilename a; + FILE *fp=fopen(tmpfname,"rb"); + while (fgets(a.get_buffer(),16,fp) != NULL) { - TFilename a(in); a.rtrim(1); // Cut \n if (c & 8) // DBIII format a.ext("ndx"); else a.ext("ntx"); // CLIPPER format - ::remove((const char *)a); + ::remove(a); } fclose(fp); } - ::remove((const char*)tmpfname); + ::remove(tmpfname); dir.eod() = ni; } } dir.set_len(lenr); dir.put(num(), _nordir, _sysdirop); wrec.put(num()); - if (toconvert && dir.eox() > 0L) packindex(); - if (err == NOERR) - err = exec_convapp(lev, FALSE); + prefix().update_recdes(num()); + + if (toconvert) + { + if (dir.eox() > 0L) + packindex(); + if (err == NOERR) + err = exec_convapp(lev, FALSE); // Post - conversion + } } + setstatus(err); return err; } @@ -2266,7 +1800,9 @@ int TSystemisamfile::packfile( // d.get(num(),_nolock, _nordir,_sysdirop); d.get(num(),_nolock, (d.is_com()) ? _comdir : _nordir); - CHECKS(filehnd() == NULL, "Can't pack open file", (const char*)filename()); + +// CHECKS(filehnd() == NULL, "Can't pack open file", (const char*)filename()); + err=DB_packfile(vis, d.name(), zap ? 0L : d.eod()); if (zap && err == NOERR) @@ -2302,15 +1838,15 @@ int TSystemisamfile::packindex( TTrec r; TDir d; - CHECKS(filehnd() == NULL, "Can't pack index of open file", (const char*)filename()); - r.get(num()); d.get(num(),_nolock, _nordir,_sysdirop); bool is_com = d.is_com(); d.get(num(),_nolock, is_com ? _comdir : _nordir); err=DB_packindex(vis,d.name(),r.rec(),&peod,ask); - if (err != NOERR) err = get_error(err); - if (err != NOERR) error_box("Errore in compattamento indici.\nFile %d : %d", num(),err); + if (err != NOERR) + err = get_error(err); + if (err != NOERR) + error_box("Errore in compattamento indici.\nFile %d : %d", num(),err); else if (peod >= 0 && peod != d.eod()) { @@ -2324,7 +1860,6 @@ int TSystemisamfile::packindex( int TSystemisamfile::pack(bool vis, bool ask) { int err=NOERR; - if ((err=packfile(vis))==NOERR) err=packindex(vis,ask); setstatus(err); @@ -2391,16 +1926,14 @@ int TSystemisamfile::load( fseek(fl, 0L, SEEK_END); nitems = ftell(fl) - nitems; fclose(fl); - - const bool open_now = filehnd() == NULL; - if (open_now) + + TFilename filename; + TIsam_handle isam_handle = prefix().open_isamfile(_logicnum, filename); + int fhnd = handle(isam_handle); + if (fhnd < 0) { - err = open_ex(_excllock); - if (err != NOERR) - { - setstatus(err); - return err; - } + error_box("Impossibile aprire il file %s", (const char*)filename); + return _isnotopen; } TScanner f(from); @@ -2475,7 +2008,7 @@ int TSystemisamfile::load( if (fd) sfd << fd; int last = NOERR; - s1.format("Imp. archivio %s\n%6ld records %6ld errori - %3d", filename(), r, e, last); + s1.format("Imp. archivio %s\n%6ld records %6ld errori - %3d", (const char*)filename, r, e, last); TProgind p(nitems, s1, TRUE, TRUE, 70); for (s = f.line(); s.not_empty() && !p.iscancelled(); s = f.line()) { @@ -2492,7 +2025,7 @@ int TSystemisamfile::load( } if ((r + e) % 50 == 0) { - s1.format("Imp. archivio %s\n%6ld records %6ld errori - %3d", filename(), r, e, last); + s1.format("Imp. archivio %s\n%6ld records %6ld errori - %3d", (const char*)filename, r, e, last); p.set_text(s1); } p.setstatus(nread + 1); @@ -2538,11 +2071,10 @@ int TSystemisamfile::load( break; } } - s1.format("Imp. archivio %s\n%6ld records %6ld errori - %3d", filename(), r, e, last); + s1.format("Imp. archivio %s\n%6ld records %6ld errori - %3d", (const char*)filename, r, e, last); p.set_text(s1); - if (!open_now) - close(); + prefix().close_isamfile(isam_handle); setstatus(err); return err; @@ -2595,7 +2127,9 @@ int TSystemisamfile::dump( len[j] = (t == _datefld) ? 10 : curr().length(wfld); } TRecnotype i = 0; - const TRecnotype nitems = nkey ? items() : filehnd()->d->EOD; +// const TRecnotype nitems = nkey ? items() : filehnd()->d->EOD; + const TRecnotype nitems = items(); + s.format("Esportazione archivio %s", filename()); TProgind p(nitems, s, TRUE, TRUE, 70); TString s1; @@ -2692,78 +2226,43 @@ TRectype::TRectype(int logicnum) : _cod(NULL), _memo_data(NULL), _memo_dirty(NULL) { - bool has_memo_fld = FALSE; - _logicnum = logicnum; - if (openf[_logicnum - 1] != NULL) + _length = prefix().get_reclen(logicnum); + _rec = new char [_length]; + *_tab = '\0'; + if (_length > 0) { - _length = DB_reclen(openf[logicnum - 1]->fhnd); - has_memo_fld = rec_has_memo(rec_des()); + zero(); + if (rec_has_memo(rec_des())) + init_memo(RECORD_NON_FISICO); } - else - { - TDir wdir; - wdir.get(_logicnum, _nolock, _nordir, _sysdirop); - if (wdir.is_com()) - wdir.get(_logicnum, _nolock, _comdir, _sysdirop); - _length = wdir.len(); - has_memo_fld = _length > 0 && lf_has_memo(_logicnum); - } - _rec = new char [ _length ]; - *_tab = '\0'; - if (_length) - zero(); else setempty(TRUE); - if(has_memo_fld) - init_memo(RECORD_NON_FISICO ); } TRectype::TRectype(const TBaseisamfile* i) : _cod(NULL), _memo_data(NULL), _memo_dirty(NULL) - { - bool has_memo_fld = FALSE; - _logicnum = i->num(); - if (i->filehnd() != NULL && _logicnum < LF_EXTERNAL) + _length = prefix().get_reclen(_logicnum); + _rec = new char [_length]; + *_tab = '\0'; + if (_length > 0) { - _length = DB_reclen(i->filehnd()->fhnd); - has_memo_fld = rec_has_memo(rec_des()); + zero(); + if (rec_has_memo(rec_des())) + init_memo(RECORD_NON_FISICO); } - else - if (_logicnum >= LF_EXTERNAL) - { - _length = i->filehnd()->d->LenR; - has_memo_fld = rec_has_memo(i->filehnd()->r); - } - else - { - TDir wdir; - - wdir.get(_logicnum, _nolock, _nordir, _sysdirop); - if (wdir.is_com()) - wdir.get(_logicnum, _nolock, _comdir, _sysdirop); - _length = wdir.len(); - has_memo_fld = _length > 0 && lf_has_memo(_logicnum); - } - *_tab = '\0'; - _rec = new char [ _length ]; - if (_length) - zero(); else setempty(TRUE); - - if(has_memo_fld) - init_memo(RECORD_NON_FISICO ); } TRectype::TRectype(const TRectype& r) - : _cod(NULL), _memo_data(NULL), _memo_dirty(NULL) + : _logicnum(r._logicnum), _cod(NULL), + _memo_data(NULL), _memo_dirty(NULL) { - _logicnum = r._logicnum; if (r._memo_data) { init_memo(); @@ -2782,7 +2281,6 @@ TRectype::TRectype(const TRectype& r) } TRectype::~TRectype() - { if (_cod != NULL) delete _cod; if (_rec != NULL) delete _rec; @@ -2795,15 +2293,15 @@ void TRectype::unknown_field(const char* name) const yesnofatal_box("Il campo '%s' non appartiene al file %d", name, _logicnum); } -void TRectype::write_memo(isdef * file, const TRecnotype recno) +void TRectype::write_memo(int fhnd, const TRecnotype recno) { memo_recno(recno); CHECK( _memo_recno > 0, "Maiale! Non fare le GO con _recno < 0 " ); - DB_go( file->fhnd, _memo_recno ); + DB_go( fhnd, _memo_recno ); RecDes *r = rec_des( ); for( int i = _memo_data->last( ); i > 0; i = _memo_data->pred( i ) ) - DB_memowrite( file->fhnd, r->Fd[ i ].Name, ( char * )( const char * )_memo_data->row( i ) ); - *this = (const char *) DB_getrecord(file->fhnd); + DB_memowrite( fhnd, r->Fd[ i ].Name, ( char * )( const char * )_memo_data->row( i ) ); + *this = (const char *) DB_getrecord(fhnd); init_memo(recno); } @@ -2922,29 +2420,22 @@ HIDDEN int fld_cmp(const char* a, const char* b, int len, bool number) RecDes* TRectype::rec_des() const { - const isdef* i = _logicnum < LF_EXTERNAL ? openf[_logicnum-1] : ext_files[_logicnum - LF_EXTERNAL]; - CHECKD(i, "Can't use a record of closed file ", _logicnum); - RecDes* r = i->r; - CHECKD(r, "Missing record description of file", _logicnum); - return r; + return (RecDes*)&prefix().get_recdes(_logicnum); } int TRectype::items() const - { return rec_des()->NFields; } const char* TRectype::start(int nf) const - { return string() + rec_des()->Fd[nf].RecOff; } int TRectype::compare(const TSortable& s) const - { const TRectype& br = (const TRectype&) s; int res = 0; @@ -2972,10 +2463,9 @@ int TRectype::compare(const TSortable& s) const } TFieldtypes TRectype::type(const char* fieldname) const - { - int p; - const RecDes * recd = rec_des(); + const RecDes* recd = rec_des(); + int p; if ((p = findfld(recd, fieldname)) != -1) return (TFieldtypes) recd->Fd[p].TypeF; else return _nullfld; @@ -3017,7 +2507,7 @@ const char* TRectype::fieldname(int i) const return i >= 0 && i < recd->NFields ? recd->Fd[i].Name : NULL; } -const TString & TRectype::get_str(const char* fieldname) const +const TString& TRectype::get_str(const char* fieldname) const { char * s = _isam_string; static TFixed_string tmp(_isam_string, sizeof(_isam_string)); @@ -3046,10 +2536,14 @@ const TString& TRectype::get(const char* fieldname) const return _memo_data->row( index ); if( _memo_recno >= 0L ) { - TLocalisamfile posfile( num() ); - isdef * def = posfile.filehnd( ); - DB_go( def->fhnd, _memo_recno ); - _memo_data->add( DB_memoptr( def->fhnd, fieldname ), index ); + TFilename fname; + int lnum = num(); + TIsam_handle isam_handle = prefix().open_isamfile(lnum, fname); + TCodeb_handle cb_handle = prefix().get_handle(isam_handle); + CHECKD(cb_handle >= 0, "Can't read memo from file ", lnum); + DB_go(cb_handle, _memo_recno ); + _memo_data->add( DB_memoptr(cb_handle, fieldname ), index ); + prefix().close_isamfile(isam_handle); } else _memo_data->add( "", index ); @@ -3151,12 +2645,17 @@ void TRectype::put(const char* fieldname, long val) void TRectype::put(const char* fieldname, TTextfile& txt) { long val = get_long(fieldname); - bool isnew = val == 0; - TLocalisamfile f(_logicnum); + const bool isnew = val == 0; - TMemo_file memo(f.filename()); + TFilename fname; + int logicnum = num(); + TIsam_handle isam_handle = prefix().open_isamfile(logicnum, fname); + + TMemo_file memo(fname); + + prefix().close_isamfile(isam_handle); - long id = memo.set_field(txt, isnew ? FIELDERR : val); + const long id = memo.set_field(txt, isnew ? FIELDERR : val); if (isnew) val = id; sprintf(_isam_string, "%ld", val); @@ -3208,7 +2707,12 @@ void TRectype::put(const char* fieldname, bool val) void TRectype::put_str(const char* fieldname, const char* val) { - const TFieldtypes ft = type(fieldname); + const RecDes* recd = rec_des(); + const int nf = findfld(recd, fieldname); + if (nf == FIELDERR) + unknown_field(fieldname); + const TFieldtypes ft = (TFieldtypes)recd->Fd[nf].TypeF; + if (val == NULL) val = ""; if (ft == _boolfld) @@ -3219,21 +2723,14 @@ void TRectype::put_str(const char* fieldname, const char* val) if (*f.pos() == '\0') return; } - if(type(fieldname) == _memofld) + if(ft == _memofld) { - int index( findfld( rec_des( ), ( char * ) fieldname ) ); - _memo_dirty->set( index ); - _memo_data->add( val, index ); + _memo_dirty->set(nf); + _memo_data->add(val, nf); } else { - const RecDes * recd = rec_des(); - int nf = findfld(recd, fieldname); - - if (nf == FIELDERR) - unknown_field(fieldname); - else - __putfieldbuff(recd->Fd[nf].Len, recd->Fd[nf].Dec, recd->Fd[nf].TypeF, val, + __putfieldbuff(recd->Fd[nf].Len, recd->Fd[nf].Dec, ft, val, _rec + recd->Fd[nf].RecOff); } setempty(FALSE); @@ -3319,7 +2816,7 @@ TRectype& TRectype::operator =(const TBaseisamfile& f) return *this = f.curr(); } -// Certified ??% +// Certified 50% int TRectype::read(TBaseisamfile& f, word op, word lockop) { return f._read(*this,op,lockop) ; @@ -3474,8 +2971,6 @@ const TDate& TRecfield::operator =(const TDate& d) return d; } - - const char* TRecfield::operator =(const char* s) { __putfieldbuff( _len, _dec, _type, s, _p); @@ -3483,7 +2978,6 @@ const char* TRecfield::operator =(const char* s) return s; } - void TRecfield::setptr(TRecnotype r) { if (_p == NULL) return; diff --git a/include/isam.h b/include/isam.h index 7815a5234..d645d6461 100755 --- a/include/isam.h +++ b/include/isam.h @@ -31,7 +31,9 @@ class TTextfile; const int MAX_KEYS = 8; +class TBaseisamfile; class TLocalisamfile; +class TRecfield; // @doc EXTERNAL @@ -40,23 +42,14 @@ class TLocalisamfile; // @base public | TSortable class TRectype : public TSortable -// @author:(INTERNAL) Sandro +// @author:(INTERNAL) Alex { - // @cfriend TExtrectype - friend class TExtrectype; // @cfriend TRecfield friend class TRecfield; - // @cfriend TBaseisamfile - friend class TBaseisamfile; - // @cfriend TLocalisamfile - friend class TLocalisamfile; - // @cfriend TIsamtempfile - friend class TIsamtempfile; - // @cfriend TExternisamfile - friend class TExternisamfile; -// @access:(INTERNAL) Private Member +// @access Protected Member +protected: // @cmember:(INTERNAL) Puntatore all'inizio del record char* _rec; @@ -69,10 +62,10 @@ class TRectype : public TSortable // @cmember:(INTERNAL) Indentificatore della tabella char _tab[5]; // @cmember:(INTERNAL) Campo "COD" della tabella - TRecfield * _cod; - TBit_array * _memo_dirty; - TString_array * _memo_data; - TRecnotype _memo_recno; + TRecfield* _cod; + TBit_array* _memo_dirty; + TString_array* _memo_data; + TRecnotype _memo_recno; // @access Protected Member protected: @@ -222,7 +215,6 @@ public: // @cmember Assegnazione tra TRectype TRectype& operator =(const TBaseisamfile& f); - // @cmember Ritorna il descrittore del record virtual RecDes * rec_des() const; // @cmember Ritorna il numero logico del record @@ -241,7 +233,7 @@ public: { return _rec != NULL; } virtual void init_memo(const TRecnotype recno = RECORD_NON_FISICO); - virtual void write_memo(isdef * file, const TRecnotype recno); + virtual void write_memo(int fhnd, const TRecnotype recno); bool has_memo() const { return _memo_data != NULL; } void memo_recno (const TRecnotype recno = RECORD_NON_FISICO) { _memo_recno = recno; } @@ -264,41 +256,31 @@ public: // @base public | TObject class TBaseisamfile : public TObject -// @author:(INTERNAL) Sandro +// @author:(INTERNAL) Alex { // @cfriend TRectype friend class TRectype; - // @cfriend TLocalisamfile - friend class TLocalisamfile; - // @cfriend TIsamfile - friend class TIsamfile; - // @cfriend TIsamtempfile - friend class TIsamtempfile; - // @cfriend TExternisamfile - friend class TExternisamfile; - // @cfriend TRecfield - friend class TRecfield; - // friend class TCursor; - // friend TRecnotype __buildcursor(TFilecursor* tic, TRecnotype rp); - // friend TRecnotype __filtercursor(TFilecursor* tic); - // friend bool __evalcondition(TBaseisamfile* i,TString& condition); - // friend void __readrec(TFilecursor* tic); + // @cfriend TCursor + friend class TCursor; + // @cfriend TSorted_cursor + friend class TSorted_cursor; + +// @access Protected Member +protected: - // @access:(INTERNAL) Private Member - - // @cmember:(INTERNAL) Descrittore del file isam - isdef* _isamfile; // @cmember:(INTERNAL) Numero logico del record corrente int _logicnum; + // @cmember:(INTERNAL) Isam handle + int _isam_handle; + // @cmember:(INTERNAL) Chiave corrente + int _curr_key; // @cmember:(INTERNAL) Ultimo errore int _lasterr; // @cmember:(INTERNAL) Puntatore a record corrente TRectype* _current; // @cmember:(INTERNAL) Record corrente TRecnotype _recno; - // @cmember:(INTERNAL) Indica se il file possiede dei campi memo - bool _has_memo; // @access Protected Member protected: @@ -309,12 +291,6 @@ protected: virtual int _write(const TRectype& rec); virtual int _rewrite(const TRectype& rec); virtual int _remove(const TRectype& rec); - // @cmember Ritorna il descrittore del file isam - isdef** ptrfilehnd() const - { return (isdef**) &_isamfile;} - // @cmember Assegna NULL al descrittore del file isam - void clearfilehnd() - { _isamfile = NULL;} // @cmember UNUSED void recover(); @@ -329,7 +305,9 @@ protected: const char* filename() const; // @cmember Costruttore per derivare TExternisamfile.

indica il file esterno da aprire. - TBaseisamfile(const char* name); + TBaseisamfile(const char* name, int mode, bool index); + + int handle(int key = 0) const; // @access Public Member public: @@ -429,10 +407,6 @@ public: // @cmember Ritorna il numero di record contenuti nel file corrente virtual TRecnotype eod() const ; - // @cmember Ritorna l'handle del file isam nella tabella - isdef* filehnd() const - { return (isdef*) _isamfile;} - // @cmember Numero di records presenti nel file long items() const; // n.o di records nel file @@ -543,7 +517,8 @@ class TIsamfile : public TBaseisamfile // @access Public Member public: // @cmember Aggiorna i flags associati al file - int flags(bool updateeod = FALSE); + // int flags(bool updateeod = FALSE); + // @cmember Apre un file di isam con lock (vedi ) int open(unsigned int mode = _manulock, bool index = TRUE) { return _open(mode, index); } @@ -629,13 +604,6 @@ class TLocalisamfile : public TBaseisamfile // @author:(INTERNAL) Sandro { -// @access:(INTERNAL) Private Member - - // @cmember:(INTERNAL) Indica se il file e' stato aperto come Localisamfile - bool _was_open; - // @cmember:(INTERNAL) Vecchia chiave se il file e' gia' aperto - int _oldkey; - // @access Protected Member protected: // @cmember Apre il file con lock (vedi ) @@ -646,7 +614,7 @@ protected: // @cmember Costruttore per derivare TTempIsamfile TLocalisamfile(int logicnum, bool tmp); // @cmember Costruttore per derivare TExternisamfile.

indica il file esterno da aprire (vedi ). - TLocalisamfile(const char* name); + TLocalisamfile(const char* name, int mode, bool index); // @access Public Member public: @@ -676,7 +644,7 @@ public: // @base public | TLocalisamfile class TIsamtempfile : public TLocalisamfile -// @author:(INTERNAL) Sandro +// @author:(INTERNAL) Alex { // @access:(INTERNAL) Private Member @@ -712,52 +680,24 @@ class TExternisamfile : public TLocalisamfile // @author:(INTERNAL) Angelo { - -// @access:(INTERNAL) Private Member - - //@cmember:(INTERNAL) Indica il nome del file col quale e' stata instanziata la classe - TFilename _name; - -// @access Protected Member -protected: - // @cmember Apre il file.

indica se aprire il file in modo esclusivo - int open(bool exclusive, bool index = TRUE); - // @cmember Chiude il file - int close(); - // @access Public Member public: // @cmember Ritorna il nome del file sotto forma di stringa virtual const char* name() const; // @cmember Costruttore.

indica se aprire il file in modo esclusivo. //

indica se aprire il file con indici o meno - TExternisamfile(const char* name, bool exclusive = FALSE, bool index = TRUE); + TExternisamfile(const char* name, int mode = _nolock, bool index = TRUE); // @cmember Distruttore virtual ~TExternisamfile(); }; -// @doc EXTERNAL - -// @class TRec_array | Classe per la definizione un array di record -// -// @base public | TArray -class TRec_array : public TArray - -// @author:(INTERNAL) Sandro -{ -// @access Public Member -public: - // @cmember Costruttore. - TRec_array(int dimension, TBaseisamfile& i); -}; - // @class TRecfield | Classe per la gestione dei campi di un record // // @base public | TObject class TRecfield : public TObject -// @author:(INTERNAL) Guido +// @author:(INTERNAL) Alex // @access:(INTERNAL) Private Member { diff --git a/include/os_win16.cpp b/include/os_win16.cpp index f8ef2511c..8ba0f8fc7 100755 --- a/include/os_win16.cpp +++ b/include/os_win16.cpp @@ -321,8 +321,8 @@ bool os_destroy_native_icon(unsigned icon) void os_draw_native_icon(WINDOW win, const RCT& rct, unsigned icon) { HDC hdc = (HDC)xvt_vobj_get_attr(win, ATTR_NATIVE_GRAPHIC_CONTEXT); - int x = rct.left + (rct.right - rct.left - 32) / 2; - int y = rct.top + (rct.bottom - rct.top - 32) / 2; + int x = (rct.right + rct.left - 32) / 2; + int y = (rct.bottom + rct.top - 32) / 2; DrawIcon(hdc, x, y, (HICON)icon); } @@ -333,7 +333,7 @@ unsigned long os_get_free_memory() bool os_is_removable_drive(const char* path) { - bool yes = path[1] == ':'; + bool yes = isalpha(path[0]) && path[1] == ':'; if (yes) yes = GetDriveType(toupper(path[0]) - 'A') == DRIVE_REMOVABLE; return yes; @@ -341,7 +341,7 @@ bool os_is_removable_drive(const char* path) bool os_is_network_drive(const char* path) { - bool yes = path[1] == ':'; + bool yes = isalpha(path[0]) && path[1] == ':'; if (yes) yes = GetDriveType(toupper(path[0]) - 'A') == DRIVE_REMOTE; return yes; @@ -349,7 +349,7 @@ bool os_is_network_drive(const char* path) bool os_is_fixed_drive(const char* path) { - bool yes = path[1] == ':'; + bool yes = isalpha(path[0]) && path[1] == ':'; if (yes) yes = GetDriveType(toupper(path[0]) - 'A') == DRIVE_FIXED; return yes; diff --git a/include/os_win32.cpp b/include/os_win32.cpp index f429fc8c3..1fb7520b2 100755 --- a/include/os_win32.cpp +++ b/include/os_win32.cpp @@ -142,8 +142,8 @@ bool os_destroy_native_icon(unsigned icon) void os_draw_native_icon(WINDOW win, const RCT& rct, unsigned icon) { HDC hdc = (HDC)xvt_vobj_get_attr(win, ATTR_NATIVE_GRAPHIC_CONTEXT); - int x = rct.left + (rct.right - rct.left - 32) / 2; - int y = rct.top + (rct.bottom - rct.top - 32) / 2; + int x = (rct.right + rct.left - 32) / 2; + int y = (rct.bottom + rct.top - 32) / 2; DrawIcon(hdc, x, y, (HICON)icon); }