Autore Topic: Progetto pgDesigner 2/3  (Letto 86682 volte)

Offline sotema

  • Maestro Gambero
  • ****
  • Post: 467
    • Mostra profilo
Re: Progetto pgDesigner 2
« Risposta #150 il: 20 Maggio 2011, 20:15:49 »
Citazione
mmmmmmh... stò ceskho tocca eliminarlo, è come una mosca, ma più fastidioso.. :rotfl:
sti giovinastri sempre sfrontati con noi vecchietti...


L'uomo ha inventato la bomba atomica, ma nessun topo al mondo costruirebbe una trappola per topi.
Albert Einstein

Offline sotema

  • Maestro Gambero
  • ****
  • Post: 467
    • Mostra profilo
Re: Progetto pgDesigner 2
« Risposta #151 il: 26 Maggio 2011, 11:48:44 »
Ho fatto alcuni test con il driver MySQL. Mi sembra che la parte di progettazione del DB funzioni egregiamente, mentre ho riscontrato alcuni errori nella esportazione verso fonti esterne; ho quindi modificato la funzione MySQL50._sqlTable(), cercando di rispettare la sintassi riportata sulla Reference Guide, per correggere tali errori.
Rimane un unico problema: nel file sql generato bisogna inserire i seguenti comandi:
in testa
Codice: [Seleziona]
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;

in coda
Codice: [Seleziona]
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;

al fine di evitare l'errore "Cannot create Table..." dovuto al fatto che alcune Foreign Key referenziano tabelle non ancora create.
I suddetti comandi devono essere inoltre eseguiti nella fase di esportazione su DB.
Scusami ma proprio non ho capito dove inserirle; del resto non volevo toglierti il piacere di farlo personalmente... :-[
Ti allego la classe modificata, il progetto e il file sql contenente i comandi.

L'uomo ha inventato la bomba atomica, ma nessun topo al mondo costruirebbe una trappola per topi.
Albert Einstein

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Progetto pgDesigner 2
« Risposta #152 il: 26 Maggio 2011, 15:30:51 »
Faccio una diff per verificare le tue modifiche stasera.

Riguardo all'implementazione delle righe in testa e in fondo agli export, due domande:

1) la sintassi è valida per tutte le versioni MySQL, dalla 5.0 in poi?
2) è proprio necessaria?

La seconda comporterebbe un'idea che avevo già in mente, cioè quella di implementare una sorta di metodi PRE/POST per la creazione dell'output sql.
In effetti, al momento, non è prevista una cosa del genere, nel senso che sarebbe anche teoricamente possibile inserire istruzioni all'interno dell'oggetto DATABASE (ovviamente il primo in lista), ma è molto in teoria.

Ci devo pensare.

Ti faccio sapere a breve, forse stasera stessa, al momento non ho modo perchè sono in ufficio.

Offline sotema

  • Maestro Gambero
  • ****
  • Post: 467
    • Mostra profilo
Re: Progetto pgDesigner 2
« Risposta #153 il: 26 Maggio 2011, 16:44:06 »
Citazione
1) la sintassi è valida per tutte le versioni MySQL, dalla 5.0 in poi?
Si, comunque farò verifiche approfondite.

Citazione
2) è proprio necessaria?
l'output generato dalla funzione _sqlTable crea le tabelle ordinate alfabeticamente, ciò comporta che se la tabella 'azienda' contiene delle foreign key che referenziano la tabella 'comune' il server genera l'errore 'Cannot create table ERR105', in quanto la tabella comune non esiste.
L'istruzione
Codice: [Seleziona]
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
istruisce MySQL di ignorare i riferimenti.
L'uomo ha inventato la bomba atomica, ma nessun topo al mondo costruirebbe una trappola per topi.
Albert Einstein

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Progetto pgDesigner 2
« Risposta #154 il: 26 Maggio 2011, 17:23:01 »
Citazione
1) la sintassi è valida per tutte le versioni MySQL, dalla 5.0 in poi?
Si, comunque farò verifiche approfondite.
OK...

Citazione
2) è proprio necessaria?
l'output generato dalla funzione _sqlTable crea le tabelle ordinate alfabeticamente, ciò comporta che se la tabella 'azienda' contiene delle foreign key che referenziano la tabella 'comune' il server genera l'errore 'Cannot create table ERR105', in quanto la tabella comune non esiste.
L'istruzione
Codice: [Seleziona]
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
istruisce MySQL di ignorare i riferimenti.
In effetti, dato che in MySQL la gestione delle relazioni viene effettuata direttamente dalla funzione di creazione tabelle, diversamente da PostgreSQL. Questo fà saltare la logica che avevo impiegato appunto per evitare il problema di ordinamento...

Offline sotema

  • Maestro Gambero
  • ****
  • Post: 467
    • Mostra profilo
Re: Progetto pgDesigner 2
« Risposta #155 il: 26 Maggio 2011, 20:15:24 »
Ho verificato la sintassi, è valida anche per la versione 5.5 e 5.6.
L'uomo ha inventato la bomba atomica, ma nessun topo al mondo costruirebbe una trappola per topi.
Albert Einstein

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Progetto pgDesigner 2
« Risposta #156 il: 26 Maggio 2011, 20:41:50 »
Ho fatto le variazioni che mi hai indicato nell'allegato, ma non completamente, dato che avevo dei dubbi sull'impaginazione della sintassi, per cui ti prego di riverificare l'esportazione, sia su file sql che su db.

Riguardo alle stringhe PRE e POST creazione, ho appunto inserito due nuovi metodi nella classe pgDriver (e derivati), proprio per poter applicare comandi appositi. Questi metodi intervengono subito dopo la creazione del database, e appena prima della chiusura dell'intera struttura sql. Non ho potuto provare la cosa, ma credo che funzioni, visto che al momento è piuttosto semplice. Ad ogni modo se riesci, prova anche questa cosa.

Bel lavoro!!!

Offline sotema

  • Maestro Gambero
  • ****
  • Post: 467
    • Mostra profilo
Re: Progetto pgDesigner 2
« Risposta #157 il: 27 Maggio 2011, 10:12:32 »
Major Tom to Ground Control, have a problem here.
Ho provato la nuova release, l'esportazione non funziona in nessun caso;
1. Su Database ritorna un errore di sintassi SQL. che risulta difficile indagare perché:
2. Su File o Video mi riporta errore di connessione al Database. ???
In effetti l'uscita della riga pgSqlExport._preSql(...)
Codice: [Seleziona]
RETURN ME.Project.Driver.ExecuteSqlArray(ME.Project.Driver.PreSql(pgDriver.SQL_CREATE))
forza l'esecuzione di
Codice: [Seleziona]
pgConnect.ExecArray(pgLogin.Create($type, $host, $port, $name, $login, $password), arr)
che scatena l'errore di connessione.
Ho riprovato la release precedente e l'impaginazione mi sembra corretta. Quello che ho fatto è inserire un controllo sulla presenza di Indici, nel qual caso dopo la definizione della Primary Key deve essere inserita la virgola.
L'uomo ha inventato la bomba atomica, ma nessun topo al mondo costruirebbe una trappola per topi.
Albert Einstein

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Progetto pgDesigner 2
« Risposta #158 il: 27 Maggio 2011, 18:54:41 »
Credo di aver fatto una cavolata "ENORME"!!!

In effetti, non ho tenuto conto, tra le altre cose, che la sessione viene aperta e chiusa ad ogni output, per cui quelle funzioni PRE/POST, oltre a non funzionare, non servono proprio a nulla...
Riguardo l'errore durante l'export su file sql, è una mia svista...

Per il momento le tolgo, poi analizzerò come riattivarle in modo corretto.

Tra un pò metterò tutto sul repository.

 :-\
« Ultima modifica: 27 Maggio 2011, 19:02:54 da md9327 »

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Progetto pgDesigner 2
« Risposta #159 il: 27 Maggio 2011, 19:14:43 »
Fatto!

Credo di avere in questo periodo la testa un pò fuori... avevo aggiornato sqlexport, inserendo altri errori. Per fortuna me ne sono accorto, anche se ho dovuto riaggiornare la revisione.

Mi fai sapere se ora funziona come prima? (Export sql e Export DB).

Grazie

Offline sotema

  • Maestro Gambero
  • ****
  • Post: 467
    • Mostra profilo
Re: Progetto pgDesigner 2
« Risposta #160 il: 27 Maggio 2011, 19:28:20 »
OK. Ora l'esport su file/video funziona; per quanto riguarda il DB no, xchè bisogna sempre inserire i comandi per disabilitare il check delle Foreign Key.
Ad occhio mi sembra che manchi qualche virgola nell'output sql.
Domani ci do un occhio.

EDIT:
I metodi  PreSql/PostSQL nella classe MySQL50 sono  commentati, se li attivi l'esport su video/file funziona perfettamente, domani provo l'esport su DB.

Buona  :sleepy:
« Ultima modifica: 27 Maggio 2011, 23:09:58 da sotema »
L'uomo ha inventato la bomba atomica, ma nessun topo al mondo costruirebbe una trappola per topi.
Albert Einstein

Offline sotema

  • Maestro Gambero
  • ****
  • Post: 467
    • Mostra profilo
Re: Progetto pgDesigner 2
« Risposta #161 il: 29 Maggio 2011, 00:12:23 »
    Ho controllato per bene il metodo pgMySQL50 che ho modificato attenendomi alle seguenti regole del comando CREATE TABLE...
    • Ogni definizione di Field deve terminare con la virgola
    • La definizione della Primary Key deve essere seguita dalla virgola solo se ci sono indici nella tabella
           NB Gli indici sono obbligatori su tutti i campi che costituiscono una Foreign Key
    • La definizione di un indice deve terminare con la virgola se:
      • ci sono altri indici
      • ci sono delle Foreign Key
    • La definizione di una Foreign Key deve terminare con la virgola solo se ci sono altre FK

    Le modifiche apportate le trovi:
    pgMySSQL50._sqlTable():
     - riga 2048: aggiunto carattere "," al termine del commento.
     - eliminata istruzione:
Codice: [Seleziona]
IIf(oField <> data.GetValue("Fields")[data.GetValue("Fields").Count - 1], ",", "")&
- attivati i metodi PreSql() e PostSql()

pgSqlExport._openFile():
 - righe 151 e 160: inserito una spazio dopo i primi due caratteri --
                    MySQL interpreta tutto ciò che segue "--" come commento, senza lo spazio ottieni un errore Sql Syntax Error

Con le suddette modifiche l'esportazione su Video e su File funziona perfettamente, ho eseguito l'importazione del file .sql tramite phpPgAdmin e il DB è stato popolato correttamente.

L'esportazione su Database fallisce a causa del diverso utilizzo dei metodi _preSql e _postSql.
Mentre per l'esportazione su Video o File viene eseguito il metodo _output() che scrive su video o stream il contenuto dell'array ritornato dai metodi, l'esportazione su Database apre una connessione, esegue la query con le sql dei metodi e chiude la connessione; così facendo i comandi si perdono in quanto le Server System Variable corrispondenti sono di tipo Session Scope e quindi riacquistano il valore predefinito ad ogni connessione.
Per ovviare al problema credo si debbano inserire i comandi nell'array $Data i cui item vengono eseguiti in un'unica connessione.
La buona notizia é che dalla versione 5.5 entrambe le variabili sono sia SESSION che GLOBAL.
L'uomo ha inventato la bomba atomica, ma nessun topo al mondo costruirebbe una trappola per topi.
Albert Einstein

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Progetto pgDesigner 2
« Risposta #162 il: 29 Maggio 2011, 11:11:23 »
Vedrò le tue modifiche e vedrò di applicarle al sorgente. Data la differenza nel reperimento delle info con PostgreSQL, probabile anzi sicuro, che abbia scritto qualche sciocchezza...  :-\

La riattivazione dei due nuovi metodi PRE/POST, a mio avviso, funziona solo se imposto la procedura in modo da non perdere la sessione, e la cosa al momento non è attuabile... Si vedrà in seguito come definirla... L'output su file funziona perchè non soggetto a problemi di sessione ma l'ho disabilitata per una questione di forma...

Ti faccio sapere quando aggiorno il repository!!!

BEL LAVORO!!!  :ok: GRAZIE!!!


Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Progetto pgDesigner 2
« Risposta #163 il: 29 Maggio 2011, 11:28:41 »
Ho applicato le tue modifiche, ma ho disattivato le funzioni PRE/POST nellexport su database. Questo al momento per evitare l'errore.

Vedrò poi come fare per inserire correttamente la logica...

Repository aggiornato!


Offline sotema

  • Maestro Gambero
  • ****
  • Post: 467
    • Mostra profilo
Re: Progetto pgDesigner 2
« Risposta #164 il: 29 Maggio 2011, 14:24:50 »
Concordo sulla disabilitazione delle funzioni pre/post su db.
Un piccolo aggiornamento sempre sulla classe pgMySQL50. La riga 2071 deve essere modificata da :
Codice: [Seleziona]
IF (NOT data.IsNull("Option")) AND IF (data.GetValue("Option") = "UNIQUE") THEN
a:
Codice: [Seleziona]
IF (NOT oIndex.IsNull("Option")) AND IF (oIndex.GetValue("Option") = "UNIQUE") THEN
altrimenti l'opzione UNIQUE non viene valorizzata.

E' certamente superfluo aggiornare il repository solo per questo, puoi inserire la modifica e tenerla "al caldo" per il prossimo upload,

Citazione
Il repository e nuovamente aggiornato. Due versioni nella stessa giornata... mò basta...   :D

A presto...
L'uomo ha inventato la bomba atomica, ma nessun topo al mondo costruirebbe una trappola per topi.
Albert Einstein