Newsgroup: it.comp.lang.vo-clipper
Titolo: Vo e MySql

Chi usa Vo con MySql ?
Lo scopo della domanda è quello di avviare una collaborazione per migliorare
sempre l'uso di questa spendida accoppiata.
Pongo subito un quesito:
Caricamento di immagini in un campo Blob e successiva visualizzazione.
Come avete risolto il problema del controllo dei caratteri Escape e come
invertite il problema ?
Ripassate attraverso una immagine temporanea ?
Ho visto che alcune utility, velocissime per giunta, caricano le immagini
direttamnete dal compo Blob, qualcuno ha capito come fanno ?
Confromtiamo le soluzioni.
Danilo Giuliani
PS per caricare un file in un campo blob uso questa funzione:
Non uso la funzione MySql Load_file (che peraltro funziona egregiamante)
perchè presuppone che il file sia su un percorso noto al server e non su
client remoto.
FUNCTION UpdateBlob(cFile,cCommand)
// dove cCommand è una stringa del tipo = [update foto set immagine =
concat(immagine,'?') where  cPriKey = Value //
LOCAL cBuffer AS STRING
LOCAL ptrHandle AS PTR
LOCAL dwBytes AS FLOAT
LOCAL cString AS STRING
LOCAL nLen AS DWORD
LOCAL oBar AS BarraDiProgressione
oBar := BarraDiProgressione{SysObject(),TRUE} // una classe che mostra una
finestra con una barra di progressione
oBar:Show()
oBar:Clear("Caricamento immagine in corso")
SysObject():Pointer := Pointer{POINTERHOURGLASS}
ptrHandle := FOpen2(cFile, FO_READ)
IF FError() != 0
 RETURN FALSE
ELSE
 FFirst(cFile, FC_NORMAL)
 nLen := FSize() //   1048576//
 IF nLen > 1048576
  FClose(ptrHandle)
  Mostra("Attenzione il file è troppo grosso per essere caricato in
archivio")
  oBar:EndDialog()
  SysObject():Pointer := Pointer{POINTERARROW}
  RETURN FALSE
 ENDIF
 DO WHILE !FEof(ptrHandle)
  cBuffer := Space(2048)
  dwBytes := FRead(ptrHandle, @cBuffer, 2048)
  IF FError() != 0
   FClose(ptrHandle)
   oBar:EndDialog()
   SysObject():Pointer := Pointer{POINTERARROW}
   RETURN FALSE
  ENDIF
  cBuffer := StrTran(cBuffer,"\","\\")
  cBuffer := StrTran(cBuffer,CHR(0),"\0")
  cBuffer := StrTran(cBuffer,"'","\'")
  cBuffer := StrTran(cBuffer,["],[\"])
  cBuffer := StrTran(cBuffer,CHR(8),"\b")
  cBuffer := StrTran(cBuffer,CHR(10),"\n")
  cBuffer := StrTran(cBuffer,CHR(13),"\r")
  cBuffer := StrTran(cBuffer,CHR(9),"\t")
  cString := StrTran(cCommand,"?",cBuffer)
  EseguiSql(cString)  // una funzione che esegue la query
  oBar:Display(FTell(ptrHandle),nLen)
 ENDDO
 FClose(ptrHandle)
ENDIF
oBar:EndDialog()
SysObject():Pointer := Pointer{POINTERARROW}
RETURN TRUE


Non posso dare un parere sul quesito di come gestire le immagini in un campo
blob di MySql  poiché non mi si č ancora presentato il problema. Approfitto perň
per porre un mio quesito:
Esiste un modo per configurare MySql al fine di fargli creare un file di LOG con
tutte le operazioni effettuate su uno specifico Data Base? Il modo standard (per
quanto ne so io), realizza un unico file LOG che comprende tutte le operazioni
fatte su TUTTI i database presenti nella specifica installazione di MySql.
Questo fatto comporta un grosso problema per il recupero dei dati quando vi
siano piů applicazioni che accedono alla medesima installazione di MySql.
Ciao, Marino

Non so perchč ho preferito creare in ogni database una tabella "attivita"
nella quale vado a scrivere ogni singolo evento, la data e l'ora, chi lo ha
generato; il tutto in DLL per cui scritto una volta non me ne preoccupo piů
cComando := "create table if not exists attivita ("+;
      "ordine int not null primary key auto_increment,"+;
      "data date,"+;
      "ora varchar(8),"+;
      "archivio varchar(30),"+;
      "operazione varchar(25),"+;
      "chiave varchar(50),"+;
      "nome varchar(50)"+;
      ")"
FUNCTION RegistraAttivita(cArchivio,cOperazione, cKey)
LOCAL cCommand AS STRING
cCommand := [INSERT INTO ATTIVITA
(DATA,ORA,ARCHIVIO,OPERAZIONE,CHIAVE,NOME) ]+;
   [VALUES
("]+DToS(Today())+[","]+Time()+[","]+cArchivio+[","]+cOperazione+[","]+xtoc(
cKey)+[","]+SQLConn():cUser+[")]
EseguiSql(cCommand)
RETURN NIL
es:
RegistraAttivita("","Accesso alla procedura","")
RegistraAttivita(SELF:TableName,LoadResString("Cancellazione",IDS_DELETE,CLA
NGUAGE_DLL),SELF:Server:GetPrimarykeyValue())
RegistraAttivita("","Uscita dalla Procedura","")
RegistraAttivita(SELF:Server:TableName,"Inserimento",SELF:Server:GetPrimaryk
eyValue())
RegistraAttivita(SELF:Server:TableName,"Modifica",SELF:Server:GetPrimarykeyV
alue())
solo in italiano
RegistraAttivita(SELF:TableName,"Cancellazione",xtoc(uKey)) uKey č la chive
cancellata
La funzione SQLConn mi torna la mia classe connessione attiva che contiene
tra l'altro l'istanza user
La funzione LoadResString mi serve per l'internazionalizzazione dei
programmi
Xtoc č una funzione che trasforma qualsiasi tipo in stringa
eseguisql č una nostra funzione per seguire un comando sql e averne, se
serve una risposta.
GetPrimarykeyValue č un metodo della nostra classe MySqlTable ma č
facilmente sostiyuibile
queste chiamate inserite nella classe MySqlTable scritte una volta.......
Avendo tutto in una tabella posso poi fare query per informazioni
statistiche etc..



Grazie per la risposta, avevo pensato anch'io ad un sistema del genere, ma,
utilizzando il file di log generato automaticamente sul server da MySql si
eviterebbe un  accesso in scrittura duplicato al database, con benefici influssi
sulle prestazioni (il nostro programma accede ad archivi posizionati su un
server internet a cui ci si collega con normali modem ISDN).
Ciao, Marino