Files correlati : Ricompilazione Demo : [ ] Commento : vedi precedente git-svn-id: svn://10.65.10.50/trunk@10858 c028cbd2-c16b-5b4b-a496-9718f37d4682
567 lines
15 KiB
C++
Executable File
567 lines
15 KiB
C++
Executable File
#include <wx/wx.h>
|
||
#include <wx/db.h>
|
||
#include <wx/mstream.h>
|
||
|
||
#include <codeb.h>
|
||
|
||
///////////////////////////////////////////////////////////
|
||
// TDataBase
|
||
///////////////////////////////////////////////////////////
|
||
|
||
class TDataBase
|
||
{
|
||
wxDbConnectInf m_ci;
|
||
wxDb* m_db;
|
||
|
||
public:
|
||
bool Open(const wxString& dsn, const wxString& user,
|
||
const wxString& password, const wxString& path);
|
||
bool IsOpen() const;
|
||
void Close();
|
||
wxDb& DataBase() { return *m_db; }
|
||
|
||
TDataBase();
|
||
virtual ~TDataBase();
|
||
};
|
||
|
||
bool TDataBase::Open(const wxString& dsn, const wxString& user,
|
||
const wxString& password, const wxString& path)
|
||
{
|
||
Close();
|
||
|
||
m_ci.SetDsn(dsn);
|
||
m_ci.SetUserID(user);
|
||
m_ci.SetPassword(password);
|
||
m_ci.SetDefaultDir(path);
|
||
|
||
if (m_ci.AllocHenv())
|
||
{
|
||
m_db = ::wxDbGetConnection(&m_ci, false); // Forward only?
|
||
if (m_db == NULL)
|
||
m_ci.FreeHenv();
|
||
}
|
||
|
||
return IsOpen();
|
||
}
|
||
|
||
void TDataBase::Close()
|
||
{
|
||
if (m_db)
|
||
{
|
||
m_db->SetSqlLogging(sqlLogOFF);
|
||
::wxDbFreeConnection(m_db);
|
||
m_db = NULL;
|
||
m_ci.FreeHenv();
|
||
}
|
||
}
|
||
|
||
bool TDataBase::IsOpen() const
|
||
{
|
||
return m_db != NULL;
|
||
}
|
||
|
||
TDataBase::TDataBase(), m_db(NULL)
|
||
{
|
||
m_ci.Henv = 0;
|
||
DeleteContents(true);
|
||
}
|
||
|
||
TDataBase::~TDataBase()
|
||
{
|
||
Close();
|
||
}
|
||
|
||
///////////////////////////////////////////////////////////
|
||
// TDataBaseList
|
||
///////////////////////////////////////////////////////////
|
||
|
||
class TDataBaseList : public wxHashTable
|
||
{
|
||
wxString m_strUser, m_strPassword;
|
||
|
||
protected:
|
||
wxString& User();
|
||
wxString& Password();
|
||
|
||
public:
|
||
TDataBase& db(const wxString& path);
|
||
TDataBaseList() : wxHashTable(wxKEY_STRING) { }
|
||
};
|
||
|
||
static DataBaseList theDataBaseList;
|
||
|
||
wxString& TDataBaseList::User()
|
||
{
|
||
if (m_strUser.IsEmpty())
|
||
{
|
||
// TBI Read user and password
|
||
}
|
||
return m_strUser;
|
||
}
|
||
|
||
wxString& TDataBaseList::Password()
|
||
{
|
||
if (m_strPassword.Isempty())
|
||
User(); // Initialize both User and Password
|
||
return m_strPassword;
|
||
}
|
||
|
||
wxString& TDataBaseList::Dsn(const wxString& dbpath)
|
||
{
|
||
wxString study;
|
||
long firm = -1;
|
||
for (int i = dbpath.GetLength()-1; i >= 0; i--)
|
||
if (dbpath[i] == '\\' || dbpath[i] == '/')
|
||
{
|
||
firm = atol(dbpath.Mid(i+1));
|
||
break;
|
||
}
|
||
for (int j = i-1; j >= 0; j--)
|
||
if (dbpath[j] == '\\' || dbpath[j] == '/')
|
||
{
|
||
study = dbpath.Mid(j+1, i-j);
|
||
break;
|
||
}
|
||
wxString dsn = study;
|
||
if (firm > 0)
|
||
dsn << firm;
|
||
return dsn;
|
||
}
|
||
|
||
TDataBase& TDataBaseList::db(const wxString& dbpath)
|
||
{
|
||
wxString dsn = Dsn(dbpath);
|
||
TDataBase* d = (TDataBase*)Get(dsn);
|
||
if (d == NULL)
|
||
{
|
||
d = new TDataBase;
|
||
Put(dsn, d);
|
||
bool ok = d->Open(dsn, User(), Password(), dbpath);
|
||
if (!ok)
|
||
{
|
||
wxString msg = wxString::Format("L'utente %s non <20> abilitato all'uso del database %s\n"
|
||
"corrispondente agli archivi in %s",
|
||
User(), dsn, dbpath);
|
||
wxMessageBox(msg, "Errore");
|
||
exit(0);
|
||
}
|
||
}
|
||
return *d;
|
||
}
|
||
|
||
/*--------------------------------------------------------------------------
|
||
inizializzazione di CodeBase e delle variabili necessarie
|
||
questa funzione deve essere chiamata SOLO una volta all'interno
|
||
di ciascun eseguibile
|
||
--------------------------------------------------------------------------*/
|
||
void DB_init(void)
|
||
{
|
||
}
|
||
|
||
/*--------------------------------------------------------------------------
|
||
reset di CodeBase
|
||
questa funzione dovrebbe essere chiamata prima di uscire da un eseguibile
|
||
per una questione di correttezza formale. Non usandola comunque non acca-
|
||
de niente di drammatico
|
||
--------------------------------------------------------------------------*/
|
||
void DB_exit(void)
|
||
{
|
||
::wxDbCloseConnections();
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
apertura del file 'filename'. Il parametro mode consente se != 0 l'apertura
|
||
esclusiva. Il parametro index consente se == 0 l'apertura senza indici.
|
||
Ritorna l'handle del file aperto oppure -1 in caso di errore
|
||
--------------------------------------------------------------------------*/
|
||
int DB_open(const char *filename,int mode,int index)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
chiusura del database inviduato da handle
|
||
torna -1 se il database non puo essere chiuso, 0 altrimenti
|
||
--------------------------------------------------------------------------*/
|
||
int DB_close(int handle)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
torna il puntatore al buffer del record del database individuato da
|
||
handle. In caso di errore torna (char *) 0
|
||
--------------------------------------------------------------------------*/
|
||
char *DB_getrecord(int handle)
|
||
{
|
||
return NULL;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
torna la lunghezza del record
|
||
--------------------------------------------------------------------------*/
|
||
int DB_reclen(int handle)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
torna la lunghezza della chiave corrente
|
||
--------------------------------------------------------------------------*/
|
||
|
||
int DB_keylen(int handle)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
torna il numero del record attuale
|
||
--------------------------------------------------------------------------*/
|
||
long int DB_recno(int handle)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
torna il numero complessivo dei records presenti nell'archivio
|
||
--------------------------------------------------------------------------*/
|
||
long int DB_reccount(int handle)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
seleziona un indice sul database specificato
|
||
torna -1 se errore, altrimenti 0
|
||
--------------------------------------------------------------------------*/
|
||
int DB_tagselect(int handle,int index_no)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
torna il numero dell'indice selezionato
|
||
torna -1 se errore
|
||
--------------------------------------------------------------------------*/
|
||
int DB_tagget(int handle)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
si posiziona sul primo record
|
||
torna -1 se errore
|
||
--------------------------------------------------------------------------*/
|
||
int DB_first(int handle)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
si posiziona sull'ultimorecord
|
||
torna -1 se errore
|
||
--------------------------------------------------------------------------*/
|
||
int DB_last(int handle)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
skip avanti di un record
|
||
--------------------------------------------------------------------------*/
|
||
int DB_next(int handle)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
skip indietro di un record
|
||
--------------------------------------------------------------------------*/
|
||
int DB_prev(int handle)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
skip di n records
|
||
--------------------------------------------------------------------------*/
|
||
int DB_skip(int handle,long int recno)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
locka il record attuale
|
||
--------------------------------------------------------------------------*/
|
||
int DB_lock(int handle)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
slocka il record attuale
|
||
--------------------------------------------------------------------------*/
|
||
int DB_unlock(int handle)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
cerca la chiave, torna r4after se not found ma si e' posizionato sul record
|
||
successivo, se torna r4eof e' su eof
|
||
--------------------------------------------------------------------------*/
|
||
int DB_seek(int handle,char *key)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
torna 1 se eof, 0 altrimenti
|
||
--------------------------------------------------------------------------*/
|
||
int DB_eof(int handle)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
torna 1 se tof, 0 altrimenti
|
||
--------------------------------------------------------------------------*/
|
||
int DB_bof(int handle)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
legge un record per numero record
|
||
--------------------------------------------------------------------------*/
|
||
int DB_go(int handle,long recno)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
cancella il record attuale. Non cancella le chiavi.
|
||
--------------------------------------------------------------------------*/
|
||
int DB_delete(int handle)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
ripristina il record attuale
|
||
--------------------------------------------------------------------------*/
|
||
int DB_recall(int handle)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
|
||
--------------------------------------------------------------------------*/
|
||
int DB_flush(int handle)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
riscrive il record attuale
|
||
--------------------------------------------------------------------------*/
|
||
int DB_rewrite(int handle)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
appende il record attuale
|
||
--------------------------------------------------------------------------*/
|
||
int DB_add(int handle)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
Blocca in modo esclusivo il file dati ed indice
|
||
--------------------------------------------------------------------------*/
|
||
int DB_lockfile(int handle)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
Compatta il file dati
|
||
--------------------------------------------------------------------------*/
|
||
int DB_packfile(short vis, const char * filename, long eod)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
Compatta il file memo
|
||
--------------------------------------------------------------------------*/
|
||
int DB_packmemo(short vis, const char * filename)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
Elimina i record duplicati
|
||
--------------------------------------------------------------------------*/
|
||
int DB_clean_file(int handle, char * filename, char * ff, RecDes * r, short vis)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
Compatta gli indici
|
||
--------------------------------------------------------------------------*/
|
||
int DB_packindex(short vis, const char * filename, RecDes *r, long *peod, bool ask)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
costruisce il file filename
|
||
--------------------------------------------------------------------------*/
|
||
|
||
int DB_build(const char * filename, RecDes *r)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
reperisce il tracciato record e la stringa di definizione delle chiavi
|
||
Stringa di definizione chiavi:
|
||
expression1|unique1$expression2|unique2$expression3|unique3
|
||
--------------------------------------------------------------------------*/
|
||
|
||
int DB_recinfo(const char * filename, FileDes *d, RecDes *r, char* keys)
|
||
{
|
||
return -1;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
ritorna l'ultimo errore
|
||
--------------------------------------------------------------------------*/
|
||
int DB_get_error(void)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
Azzera la viarabile globale d'errore
|
||
--------------------------------------------------------------------------*/
|
||
|
||
void DB_zero_error(void)
|
||
{
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
Si posiziona sull'indice attivo alla chiave indicata, restituisce
|
||
la prima chiave che trova >= a from. (TCursor)
|
||
--------------------------------------------------------------------------*/
|
||
|
||
int DB_index_seek(int handle, char* from)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
Ritorna il numero di record corrispondente alla chiave corrente
|
||
--------------------------------------------------------------------------*/
|
||
|
||
long DB_index_recno(int handle)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
Si posiziona sulla chiave successiva dell'indice corrente
|
||
--------------------------------------------------------------------------*/
|
||
long DB_index_next(int handle)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
Restituisce la chiave corrente
|
||
--------------------------------------------------------------------------*/
|
||
|
||
char* DB_index_getkey(int handle)
|
||
{
|
||
return NULL;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
Restituisce vero se l'indice e' alla fine
|
||
--------------------------------------------------------------------------*/
|
||
|
||
int DB_index_eof(int handle)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
Blocca il record indicato
|
||
--------------------------------------------------------------------------*/
|
||
|
||
int DB_lock_rec(int handle,long nrec)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
Ritorna vero(non zero) se il file dati od indice sono stati bloccati
|
||
in modo esclusivo dalla presente applicazione, non da altri programmi!!!
|
||
--------------------------------------------------------------------------*/
|
||
|
||
int DB_file_locked(int handle)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
Ritorna vero se il record nrec e' bloccato dalla presente applicazione,
|
||
non da altri programmi!!!
|
||
--------------------------------------------------------------------------*/
|
||
|
||
int DB_rec_locked(int handle,long nrec)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
restituisce la configurazione della libreria
|
||
--------------------------------------------------------------------------*/
|
||
|
||
long DB_getconf()
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
/*-------------------------------------------------------------------------
|
||
Restituisce il numero di versione scritto sull'header dell'indice
|
||
--------------------------------------------------------------------------*/
|
||
|
||
long DB_changed(int handle)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
char* DB_memoptr( const int handle, const char * fieldname )
|
||
{
|
||
return NULL;
|
||
}
|
||
|
||
int DB_memowrite( const int handle, const char * fieldname, const char * data )
|
||
{
|
||
return NULL;
|
||
}
|
||
|