Patch level : 2.0 552

Files correlati     : cg2.exe
Ricompilazione Demo : [ ]
Commento            :

Aggiunti flag necessari per segnalre in prima nota i movimenti gia' inviati
durante la navigazione tramite la nuova toolbar


git-svn-id: svn://10.65.10.50/trunk@11385 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2003-08-08 12:54:27 +00:00
parent c2098e7eab
commit 65eb669bfb
3 changed files with 54 additions and 53 deletions

View File

@ -31,7 +31,6 @@
#include <codeb.h>
#include <rectypes.h>
#include <progind.h>
#include <checks.h>
/*--------------------------------------------------------------------------
numero massimo di database aperti contemporaneamente
@ -96,7 +95,7 @@ void DB_exit(void)
apertura del file 'filename'. Il parametro mode consente se != 0 l'apertura
esclusiva. Il parametro index consente se == 0 l'apertura senza indici
--------------------------------------------------------------------------*/
int DB_open(const char *filename,int mode,int index)
int DB_open(const char *filename,int mode,int index)
{
int i,found;
@ -133,7 +132,7 @@ int DB_open(const char *filename,int mode,int index)
chiusura del database inviduato da handle
torna -1 se il database non puo essere chiuso
--------------------------------------------------------------------------*/
int DB_close(int handle)
int DB_close(int handle)
{
if(!handle_ok(handle)) return(-1);
d4close(dbdata[handle]);
@ -382,13 +381,8 @@ int DB_recall(int handle)
int DB_flush(int handle)
{
int rt;
while ((rt = d4flush(dbdata[handle])) == r4locked)
#ifdef DBG
yesnofatal_box("Sono in attesa nella DB_flush");
#else
u4delaySec();
#endif
u4delaySec();
return rt;
}
@ -400,25 +394,19 @@ int DB_rewrite(int handle)
int rt;
if(!handle_ok(handle)) return(-1);
while ((rt=d4write(dbdata[handle],d4recNo(dbdata[handle]))) == r4locked)
#ifdef DBG
yesnofatal_box("Sono in attesa nella DB_rewrite");
#else
u4delaySec();
#endif
u4delaySec();
if (rt == 0)
{
while ((rt = d4flush(dbdata[handle])) == r4locked)
#ifdef DBG
yesnofatal_box("Sono in attesa nella DB_rewrite (d4flush)");
#else
u4delaySec();
#endif
u4delaySec();
}
if (rt == e4unique)
{
char msg[256];
DB_get_error();
fatal_box("Errore in DB_rewrite(): chiave duplicata nel record %ld, file %s",
sprintf(msg, "Errore in DB_rewrite(): chiave duplicata nel record %ld, file %s",
d4recNo(dbdata[handle]) + 1, d4fileName(dbdata[handle]));
xvt_dm_post_fatal_exit(msg);
}
rt=DB_unlock(handle);
return (rt);
@ -439,35 +427,27 @@ int DB_add(int handle)
if (is_locked == 0) /* Se non e' stato gia' bloccato in modo esclusivo */
{
while (d4lockAll(data) == r4locked)
#ifdef DBG
yesnofatal_box("Sono in attesa nella DB_add");
#else
u4delaySec();
#endif
u4delaySec();
}
while ((rt = d4appendStart(data,0)) == r4locked)
#ifdef DBG
yesnofatal_box("Sono in attesa nella DB_add (d4append_start)");
#else
u4delaySec();
#endif
u4delaySec();
if (rt == 0)
{
d4recall(data);
while ((rt = d4append(data)) == r4locked)
#ifdef DBG
yesnofatal_box("Sono in attesa nella DB_add (d4append)");
#else
u4delaySec();
#endif
u4delaySec();
if (rt == e4unique)
{
long rec_num = d4recNo(data);
DB_get_error();
if (rec_num > 0)
fatal_box("Errore in DB_add(): chiave duplicata nell' indice %ld, file %s",
rec_num + 1, d4fileName(data));
{
char msg[256];
sprintf(msg, "Errore in DB_add(): chiave duplicata nell' indice %ld, file %s",
rec_num + 1, d4fileName(data));
xvt_dm_post_fatal_exit(msg);
}
else
rt = _isreinsert;
}
@ -475,11 +455,7 @@ int DB_add(int handle)
if (rt == 0)
{
while ((rt = d4flush(data)) == r4locked)
#ifdef DBG
yesnofatal_box("Sono in attesa nella DB_add (d4flush)");
#else
u4delaySec();
#endif
}
}
DB_unlock(handle);
@ -745,6 +721,12 @@ int DB_clean_file(int handle, char * filename, char * ff, RecDes * r, short vis)
/*-------------------------------------------------------------------------
Compatta gli indici
--------------------------------------------------------------------------*/
int DB_yesnobox(const char* msg)
{
return xvt_dm_post_ask("Si", "No", NULL, msg) == RESP_DEFAULT;
}
int DB_packindex(short vis, const char * filename, RecDes *r, long *peod, bool ask)
{
int rt=0,handle;
@ -760,7 +742,7 @@ int DB_packindex(short vis, const char * filename, RecDes *r, long *peod, bool a
if (handle >= 0)
{
int i;
char *ff = find_slash_backslash((char *)filename);
char *ff = find_slash_backslash(filename);
if (vis)
progind_create((long)r->NKeys,s,0,1,60);
if ((ff == NULL) || *ff == '\0')
@ -778,7 +760,7 @@ int DB_packindex(short vis, const char * filename, RecDes *r, long *peod, bool a
if (rt == e4unique || rt == r4unique)
{
rt = 0;
if (!ask || yesno_box("Sono stati rilevati alcuni records duplicati nel file %s. Devo eliminarli ?",filename))
if (!ask || DB_yesnobox("Sono stati rilevati alcuni records duplicati:\nsi desidera eliminarli?"))
rt = DB_clean_file(handle, (char*) filename, ff, r, vis);
else
tags[0].unique = r4unique_continue;
@ -839,7 +821,7 @@ int DB_build(const char * filename, RecDes *r)
TAG4INFO tag_info[MaxKeys+1]; /* Numero di chiavi in un file */
DATA4 *dbuilded;
int rt=0,i;
char *ff = find_slash_backslash((char *)filename);
char *ff = find_slash_backslash(filename);
for (i=0; ((i<r->NFields) && (i<MaxFields)); i++) /* Construct field_info */
@ -940,7 +922,11 @@ int DB_recinfo(const char * filename, FileDes *d, RecDes *r, char* keys)
field_info = d4fieldInfo(data_file);
index_file = d4index(data_file,"" /*(char*)filename */);
if (index_file == NULL)
fatal_box("Il file %s e' senza indici.",filename);
{
char msg[256];
sprintf(msg, "Il file %s e' senza indici.",filename);
xvt_dm_post_fatal_exit(msg);
}
tag_info = i4tagInfo(index_file);
d->EOD = d->EOX = d4recCount(data_file);
d->LenR = (word)d4recWidth(data_file);
@ -1221,7 +1207,7 @@ bool handle_ok(int handle)
return handle >=0 && handle < CB4FILES && dbdata[handle] !=0;
}
static char * find_slash_backslash(char * str)
static char * find_slash_backslash(const char * str)
{
static char* xstr = NULL;
int l=strlen(str);
@ -2014,7 +2000,7 @@ int DB_packindex(short vis, const char * filename, RecDes *r, long *peod, bool a
if (handle > -1)
{
int i;
char *ff = find_slash_backslash((char *)filename);
char *ff = find_slash_backslash(filename);
if (vis)
progind_create((long)r->NKeys,s,0,1,60);
if ((ff == NULL) || *ff == '\0')
@ -2099,7 +2085,7 @@ int DB_build(const char * filename, RecDes *r)
TAG4INFO tag_info[MaxKeys+1]; /* Numero di chiavi in un file */
DATA4 *dbuilded;
int rt=0,i;
char *ff = find_slash_backslash((char *)filename);
char *ff = find_slash_backslash(filename);
for (i=0; ((i<r->NFields) && (i<MaxFields)); i++) /* Construct field_info */

View File

@ -14,8 +14,8 @@
///////////////////////////////////////////////////////////
TRelation_application::TRelation_application()
: _mask(NULL), _search_id(-1), _lnflag(FALSE),
_autodelete(FALSE)
: _mask(NULL), _search_id(-1), _lnflag(0),
_autodelete(0), _navigating(false)
{ }
TRelation_application::~TRelation_application()
@ -483,8 +483,11 @@ bool TRelation_application::modify_mode()
{
TRelation* rel = get_relation();
if (!user_can_read(rel))
return warning_box("I dati non sono accessibili per l'utente %s",
(const char*)user());
{
warning_box(TR("I dati non sono accessibili per l'utente %s"), (const char*)user());
query_mode();
return FALSE;
}
const TReclock block = user_can_write(rel) ? _testandlock : _nolock;
int err = rel->read(_isequal, block);
@ -522,6 +525,7 @@ bool TRelation_application::modify_mode()
init_modify_mode(*_mask);
// ....possibilmente spostare questa chiamata .....
// Forse deve essere fatta prima della init_modify_mode()!
if (_curr_transaction == TRANSACTION_MODIFY)
ini2insert_mask();
return TRUE;
@ -1164,7 +1168,11 @@ bool TRelation_application::relation_remove()
if (ok || is_transaction())
set_limits();
else
return error_box(FR("Errore di cancellazione %d"), r.status());
{
const int err = r.status();
if (err != NOERR) // Succede nei remove con richiesta di conferma all'utente
return error_box(FR("Errore di cancellazione %d"), err);
}
}
return TRUE;
}
@ -1392,7 +1400,11 @@ void TRelation_application::main_loop()
break;
}
if (err == NOERR || err == _islocked)
{
_navigating = true;
modify_mode();
_navigating = false;
}
else
query_mode();
}

View File

@ -71,6 +71,8 @@ class TRelation_application : public TSkeleton_application
TString _curr_trans_from;
// @cmember:(INTERNAL) Flag di cancellazione automatica veloce
int _autodelete;
// @cmember:(INTERNAL) Flag di navigazione tramite toolbar
bool _navigating;
private:
// @cmember:(INTERNAL) Carica la transazione corrente (protocollo via .ini)
@ -220,6 +222,7 @@ protected:
void set_search_field(short id)
{ _search_id = id;}
byte autodeleting() const { return _autodelete; }
bool navigating() const { return _navigating; }
bool parse_command_line();
void ini2query_mask();
void ini2insert_mask();