Nota:
Per SQLite, ho predisposto le funzionalità per gestire sia la versione 2, che la 3, anche se non ho notato differenze sostanziali tra le due. Ho fatto i test di connessione e lettura, e funzionano, ma ancora non ho potuto eseguire quelli di scrittura; per quanto riguarda l'output su file, dovrai vedere se esce tutto in modo corretto.
Stessa cosa per MySQL, per il quale sono partito dalla versione 5.x. Dato che anche MySQL ha subito molti cambiamenti nel tempo, rispetto a PostgreSQL, studiarmi tutte le differenze delle versioni mi è sembrato alquanto oneroso; ad ogni modo, il driver è espandibile, e quindi se qualcuno, oppure ci sarà tempo, si potrà implementare successivamente.
- collaudo delle funzioni
- particolare collaudo delle funzionalità legate ai db:
PostgreSQL, MySQL e SQLite
- traduzioni
- scrittura del manuale utente (italiano e inglese)
DIM arr AS String[]
arr = ["luigi", "franco", "giulia", ...]
DIM arr AS Long[]
DIM v1 AS Long
DIM v2 AS Integer = 5
arr = [v1, v2]
v1 = 9
arr = [v1, CLong(v1)]
var = CalcolaElementiArray( [] )
var = CalcolaElementiArray( [1,2,3,4,5] )
var = CalcolaElementiArray( [CLong(1),2,3,4,5] )
Il fatto che il file non è visibile non dipende da pgDesigner, dato che usa l'oggetto Dialog.OpenFile() per la selezione del file di database. Non credo neanche sia un problema di Dialog, perchè non ho mai riscontrato problemi simili. L'unica cosa mi viene in mente, è che forse hai qualche impostazione dell'ambiente Gnome che limita la visualizzazione; ma la cosa è molto strana, perchè a quanto mi risulta l'unica impostazione è la possibilità di nascondere solo i file che iniziano con il punto (file nascosti), a meno che il file non abbia qualche impostazione chmod che comunque obbliga ad un comportamento anomalo.
Dialog.Filter = ["*.*", ("All files")]
- Cosa devo mettere come Type? Va bene "G"? Considera che non è un testo, perchè per inserire ad esempio un punto la sintassi è questa:
INSERT INTO t ( p ) VALUES ( POINT(1 1) )
- Devo mettere i nuovi tipi in ordine alfabetico mischiati con gli altri, oppure li metto tutti alla fine per raggrupparli? Sono 8.
- Con Parameter ti riferisci ai parametri utilizzati per creare il campo, cioè in pratica le dimensioni?
A parte le descrizioni ho lasciato tutti gli altri campi in bianco. La documentazione non fa cenno alla memoria occupata. In effetti, a parte POINT, sono tutte collezioni di oggetti e quindi immagino non sia calcolabile. Gli altri campi (massimo, minimo, risoluzione) non sono applicabili.
ME.AddDatatype(pgTypeItem.Create("GEOMETRY", "G", "", "", "", "", "", "Generic geometric object"))
ME.AddDatatype(pgTypeItem.Create("GEOMETRYCOLLECTION", "G", "", "", "", "", "", "Collection of geometric objects"))
ME.AddDatatype(pgTypeItem.Create("LINESTRING", "G", "", "", "", "", "", "Geometric line made of segments"))
ME.AddDatatype(pgTypeItem.Create("MULTILINESTRING", "G", "", "", "", "", "", "Collection of geometric linestrings"))
ME.AddDatatype(pgTypeItem.Create("MULTIPOLYGON", "G", "", "", "", "", "", "Collection of geometric polygons"))
ME.AddDatatype(pgTypeItem.Create("MULTIPOINT", "G", "", "", "", "", "", "Collection of geometric points"))
ME.AddDatatype(pgTypeItem.Create("POINT", "G", "", "", "", "", "", "Geometric 0-dimensional object"))
ME.AddDatatype(pgTypeItem.Create("POLYGON", "G", "", "", "", "", "", "Geometric polygon"))
xyz CHAR(50)
"(n)"
ME.AddDatatype(pgTypeItem.Create("CHAR", "C", "[(l)]", "", "", "", "", "Fixed-length character string"))
SELECT specific_name
, routine_catalog
, routine_schema
, routine_name
, routine_type
, dtd_identifier
, routine_body
, routine_definition
, external_name
, external_language
, parameter_style
, is_deterministic
, sql_data_access
, sql_path
, security_type
, created
, last_altered
, sql_mode
, routine_comment
, definer
FROM information_schema.routines;
$con = mysqli_init();
//options to set
$con->options(MYSQLI_OPT_CONNECT_TIMEOUT, TIMEOUT);
$con->options(MYSQLI_READ_DEFAULT_FILE, OPTIONS_FILE);
$con->options(MYSQLI_READ_DEFAULT_GROUP, OPTIONS_GROUP);
$con->options(MYSQLI_OPT_LOCAL_INFILE, false);
// options to set (flags)
if (USE_COMPRESSION)
$flags = MYSQLI_CLIENT_COMPRESS;
else
$flags = 0;
// connection
@$con->real_connect(HOST, USER, PASS, 'mysql', PORT, SOCK, $flags);
...
...
[pgDesigner2]
Type="Project"
Version="2.0.0"
# rm $HOME/.pgdesigner2/pgdesigner2.conf
pgDesigner2-alpha-build694.tar.bz2 (eliminato)
svn co https://pgdesigner.svn.sourceforge.net/svnroot/pgdesigner/pgdesigner/branches/2.0-alpha
hMenu1 = NEW Menu(hMenu)
Ti ringrazio, troppo buono... :D
Ehi se dai anche a me la stessa cifra posso scrivere cose ancora più lodevoli.... rotfl
FOR EACH oRelation IN table.GetValue("RelationsFrom")
Aggiorna database ...
Scrittura <Tipo::comparto> ...
Too many arguments
Errore processo!
Too many arguments
AEOH!!! Me vuoi fà lavorà proprio...solo un quesito.
Al momento, le istruzioni di creazione del database, sono valide solo per l'esportazione su file (sql o report).
CREATE TABLE comune(
comune_id INTEGER PRIMARY KEY AUTOINCREMENT,
comune TEXT,
provincia TEXT,
FOREIGN KEY(provincia) REFERENCES provincia(sigla)
);
PUBLIC FUNCTION isValidOption(type AS Integer) AS Boolean
CASE pgDataInfo.OBJ_DB_RELATION
FOR EACH oField IN oRelation.GetValue("Field2")
FOR EACH oField IN oRelation.GetValue("Field1")
pgHtml.HighLabel(oRelation.GetValue("Table1"), {html}) & " (" & String.Mid(f, 2) & ")" &
pgHtml.HighLabel(oRelation.GetValue("Table1").Name, {html}) & " (" & String.Mid(f, 2) & ")" &
Type mismatch: wanted String, got pgData instead
s &= pgHtml.HighCommand(" CONSTRAINT FOREIGN KEY", {html}) & " (" & String.Mid(t, 2) & ")" &
s &= pgHtml.HighCommand(" CONSTRAINT FOREIGN KEY", {html}) & " " & pgHtml.HighLabel(oRelation.Name, {html}) & " (" & String.Mid(t, 2) & ")" &
WITH .MYSQLUnionList
WITH ME.MYSQLUnionList
Ripeto, le tue modifiche sintatticamente sono ben integrate nel codice, solo che credo sia il punto meno indicato dove inserirle.Hai perfettamente ragione. Inserito lì il codice ha valore per tutti i DB, impedendo di creare relazioni in PGSQL e SQLite3
PS. pgdesigner è adesso un software gagliardo, in futuro sarà incomparabile.
mmmmmmh... stò ceskho tocca eliminarlo, è come una mosca, ma più fastidioso.. :rotfl:sti giovinastri sempre sfrontati con noi vecchietti...
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
1) la sintassi è valida per tutte le versioni MySQL, dalla 5.0 in poi?Si, comunque farò verifiche approfondite.
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.
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
OK...Citazione1) la sintassi è valida per tutte le versioni MySQL, dalla 5.0 in poi?Si, comunque farò verifiche approfondite.
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...Citazione2) è 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'istruzioneCodice: [Seleziona]istruisce MySQL di ignorare i riferimenti./*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
RETURN ME.Project.Driver.ExecuteSqlArray(ME.Project.Driver.PreSql(pgDriver.SQL_CREATE))
pgConnect.ExecArray(pgLogin.Create($type, $host, $port, $name, $login, $password), arr)
IIf(oField <> data.GetValue("Fields")[data.GetValue("Fields").Count - 1], ",", "")&
IF (NOT data.IsNull("Option")) AND IF (data.GetValue("Option") = "UNIQUE") THEN
IF (NOT oIndex.IsNull("Option")) AND IF (oIndex.GetValue("Option") = "UNIQUE") THEN
Il repository e nuovamente aggiornato. Due versioni nella stessa giornata... mò basta... :D
IF (NOT oIndex.IsNull("Option")) AND IF (oIndex.GetValue("Option") = "UNIQUE") THEN
s &= pgHtml.HighCommand(" CONSTRAINT UNIQUE INDEX", {html})
ELSE
s &= pgHtml.HighCommand(" " & IIf(NOT oIndex.IsNull("Option"), oIndex.GetValue("Option"), "") & " INDEX", {html})
END IF
l'errore era pure nelle successive... :-\...ma se non ce ne fossero io che ci sto a fare? :coder:
CASE .MYSQLPrimaryKey 'The enable the primarykey check then force enabled of check on null.
IF (.MYSQLPrimaryKey.Value) THEN
.MYSQLNull.Value = FALSE
.MYSQLNull.Enabled = FALSE
.MYSQLUnique.Value = TRUE
ELSE
.MYSQLNull.Enabled = TRUE
.MYSQLUnique.Value = FALSE
END IF
Create table ...
stgione ENUM("estate","inverno","autonno","primavera")...
diciamo che sono un pò pazzo,io toglierei un pò! ;D
Bè, l'importazione del .po l'ho fatta.
Devi attendere l'aggiornamento del repository che spero di farlo stasera...
P.S.: a parte il codice di pgDesiggner2, stò facendo esperimenti con OpenGL che, se vanno per il verso giusto, potrebbe sostituire la gestione grafica del programma... il che, oltre alla velocità, andrebbe ad arricchirne le potenzialità...
In realtà ci stavo pensando, e stavo dando un'occhiata ai sorgenti di quello fornito con l'ide di Gambas.
Avevo pensato ad un progetto del genere, richiamabile anche da pgDesigner...
Il problema è che di idee ne ho, è il tempo che manca... :'(
svn checkout https://pgdesigner.svn.sourceforge.net/svnroot/pgdesigner/pgdesigner/branches/3.0-alpha pgDesigner3
svn checkout https://pgdesigner.svn.sourceforge.net/svnroot/pgdesigner/pgdesigner/branches/2.0-G3 pgDesigner2-G3
svn checkout https://pgdesigner.svn.sourceforge.net/svnroot/pgdesigner/pgdesigner/branches/2.0
Here is the solution I propose:Confesso che i metodi speciali, e non solo quelli, sono un argomento parecchio oscuro per me, non so se tutto ciò potrebbe rappresentare un problema latente con il tuo codice
A new special method, named "_property" must be implemented if you want to
handle unknown properties.
This function takes no argument, and must return a boolean. The name of the
unknown symbol is stored in Param.Name, and the function must return if the
symbol is actually a property or not (i.e. a method).
If _property is not implemented, all unknown symbols are methods.
Public Sub _unknown(...) As Variant
If (Param.Count = 0) Then
Me.RaiseUnknownProperty(Param.Name)
Else
Me.RaiseUnknownMethod(Param.Name)
Endif
Return Null
End
With splashDialog = New PgDialogSplash As "DialogSplash"
PgFile.CreatePath(File.Dir($configPath &/ "temp/"))
Dim list As String[] = Split(path, "/", "", True)
$logManager.Write(PgLogMessage.Error(Object.Type(Last), "Unknown Method <" & {method} & ">"))
$logManager.Write(PgLogMessage.Error(Object.Type(Last), "Unknown Method: <b>" & {method} & "</b>"))
$logManager.Write(PgLogMessage.Error(Object.Type(Last), "Unknown Method: <i>" & {method} & "</i>"))
Static Private Sub _unknownMethodEvent({method} as string)
$logManager.Write(PgLogMessage.Error(Object.Type(Last), "Unknown Method: <i>" & {method} & "</i>"))
End
...
Static Private $onError As Boolean
...
...
Static Public Sub _init()
...
Catch
$onError = true
...
Static Public Sub Run()
If (Not $onError) Then
$logManager.Write(PgLogMessage.Info(Me, "Start Application"))
$timerLogging.Start()
If ($configManager.Get(PgConfigManager.CFG_AUTOSAVINGENABLE)) Then
$timerSaving.Start()
Endif
If ($configManager.Get(PgConfigManager.CFG_ANIMATIONENABLE)) Then
$timerAnimation.Start()
Endif
PgApplication.MainWindow.Show()
Endif
End
Perdona il ritardoma ti pare. Anche per me questo è un periodo critico, e poi mica hai una data di consegna per pgDesigner...
IF(dlg.ISModified ...) then
$configManager.Set(PgConfigManager.CFG_LANGUAGE, PgLanguageManager.FindDescription(Str(dlg.GetValue(PgConfigManager.CFG_LANGUAGE))).Code)
$configManager.Set(PgConfigManager.CFG_LANGUAGE, $languageManager.FindDescription(Str(dlg.GetValue(PgConfigManager.CFG_LANGUAGE))).Code)
stò pensando di stoppare temporaneamente lo sviluppo, altrimenti mi ricoveranoallo scopo di evitarti l'esaurimento, mantenendo però l'allenamento, ;D ti sottopongo due anomalie riscontrate nelle ultime prove.
With projectPanel = New PgProjectPanel($mainPanel.GetTab(index), w, h) As "ProjectPanel"
With projectPanel = New PgProjectPanel($mainPanel.SetTabIndex(index), w, h) As "ProjectPanel"
If (messageEvent.Level.IsGreater(Me.MaxLevel)) Then
Ho effettuato subito un controllo, e ho verificato che:Citazionestò pensando di stoppare temporaneamente lo sviluppo, altrimenti mi ricoveranoallo scopo di evitarti l'esaurimento, mantenendo però l'allenamento, ;D ti sottopongo due anomalie riscontrate nelle ultime prove.
- PgConfigItem.Encode()
nelle righe di verifica dei valori numerici usi la funzione IsDigit(Value), questa potrebbe darti problemi se passi come
parametro un numero negativo. Non sarebbe meglio usare IsNumber()?
- PgApplication.AddProject()
la riga:
Codice: gambas [Seleziona]With projectPanel = New PgProjectPanel($mainPanel.GetTab(index), w, h) As "ProjectPanel"
dovrebbe essere, credo,
Codice: gambas [Seleziona]With projectPanel = New PgProjectPanel($mainPanel.SetTabIndex(index), w, h) As "ProjectPanel"
inoltre l'errore UnknowMethod generato poichè il metodo GetTab non esiste nella classe PgMainPanel
non viene registrato nel log poichè nella sub PgLogFileWriter.Write() esegui il controllo:
Codice: gambas [Seleziona]If (messageEvent.Level.IsGreater(Me.MaxLevel)) Then
dove ME.MaxLevel="Info" mentre messageEvent.Level= "Error"
non so se la cosa è intenzionale in questa fase.
With $mainPanel = New PgMainPanel As "MainPanel"
...
...
hObs = New Observer($mainPanel) As "MainPanel"
La cosa anche strana è che viene segnalato due volte.Questo è sicuramente dovuto al doppio osservatore; ho provato a commentarne uno e l'evento si scatena una sola volta.
Public Function Action_Activate(sKey As String) As Boolean
Raise ActionEvent(sKey)
End
Public Sub MenuButton_Click()
Raise ActionEvent(Last.Action)
End
...modifica il formato di Timestamp da "mm/dd/yyyy hh:mm:ss" in "mm/dd/yyyy hh:nn:ss"
spariscono i menu o solo le icone?in realtà non sparisce nulla; la mia era una supposizione, ma non avevo notato che eseguendo l'applicazione dall'IDE, i menu vengono duplicati sulla barra di unity. Questo comportamento è normale e sta a significare che i menu vengono catturati correttamente.
Comunque ci sono parecchie cose che mi hai fatto notare che non mi sono piaciute
Quindi, per il momento, mantengo la sola G3 installata da rpm, e mi baserò su quella per lo sviluppo, salvo aggiornamenti futuri
forza md che l'esercizio mantiene giovani... ;D
Ciao sfaticato... ;DNon vedo la gb.libxml, ma ad ogni modo la gb.xml c'è e funziona... :-\
So che sei in altre faccende affaccendato, ma segnati pure questa nella TODO!
Da qualche versione in GB3 è stato implementato un nuovo componente gb.xml scritto completamente in gambas, che si affianca al vecchio, basato su libxml, rinominato per l'appunto in gb.libxml. Ebbene, gb.xml è tuttora in stato di test ed ovviamente ha qualche problemino. Inoltre mi pare sia un pochino cambiata la logica, non ci ho guardato a fondo; ad ogni modo, pgdesigner3 all'avvio seleziona il componente gb.xml (dal nome) e questo causa un errore di NOT AN OBJECT alla linea.
PgXmlDocument.Load.79 (Select Case oXml.Node.Type)
Per garantire il funzionamento di pgdesigner3 devi selezionare nelle proprietà progetto il componente gb.libxml
Alla prossima.
riguardo gli eventi, considerando l'automatismo con cui Gambas scatena l'evento Activate per le Action, potresti utilizzare la funzione Action_Activate nel seguente modo:Codice: gambas [Seleziona]Public Function Action_Activate(sKey As String) As Boolean
Raise ActionEvent(sKey)
End
sostituendola alla subCodice: gambas [Seleziona]Public Sub MenuButton_Click()
Raise ActionEvent(Last.Action)
End
PS: ricordati l'ora, nella rev. 496 è ancora errata.Citazione...modifica il formato di Timestamp da "mm/dd/yyyy hh:mm:ss" in "mm/dd/yyyy hh:nn:ss"
Non vedo la gb.libxml, ma ad ogni modo la gb.xml c'è e funziona... :-\xchè stai lavorando sulla 3.0 da repo. La libreria che usi in pgdesigner è stata convertita in gb.libxml dalla rev. 3.1 allorchè è stata introdotto il componente gb.xml scritto in Gambas. Purtroppo quando aggiornerai da svn, riscontrerai certamente il problema:
Riguardo agli eventi non ho ben capito cosa intendevi in questo post... :-\
Public Sub MenuButton_Click()
Raise ActionEvent(Last.Action)
End
Public Function Action_Activate(sKey As String) As Boolean
Raise ActionEvent(sKey)
End
Ciao md9327,
ho visto le modifiche e dato una occhiata alla gestione del log, bel lavoraccio...
Bisogna riconoscerti uno sforzo non indifferente nella scrittura di questa nuova versione di pgd.
A proposito di log ho notato che gli eventi relativi a:
-MainMenuBar
-MainPanel
-MainStatusBar
-MainWindow
vengono scatenati due volte, a causa delle dichiarazioni di osservatori alle righe da 265 a 268. Infatti nelle righe precedenti laddove istanzi gli oggetti associ già lo stesso osservatore. Puoi verificarlo nel file di log, dove trovi le voci ripetute degli eventi "Unknown method Action_Activate".Codice: gambas [Seleziona]With $mainPanel = New PgMainPanel As "MainPanel"
...
...
hObs = New Observer($mainPanel) As "MainPanel"
Scusami se ti segnalo le anomalie che riscontro in modo un poco disordinato, ma approfitto del tempo libero e purtroppo questo è una risorsa in esaurimento... :'(
...
Riguardo agli eventi non ho ben capito cosa intendevi in questo post... :-\
ricordi che al click su una voce di Menu si registrava nel log il messaggio "UnknownMethod 'ActionActivate'"?.
Probabilmente G3 associa in automatico l'evento Action_Activate a tutte le azioni. Di conseguenza al solo scopo di ovviare alla registrazione nel log ti consigliavo di inserire la funzione Action_activate(skey as string) dove semplicemente fai scatenare l'evento corrispondente. In pratica sostituire la sub:Codice: gambas [Seleziona]Public Sub MenuButton_Click()
Raise ActionEvent(Last.Action)
End
con la gestione delle actions:Codice: gambas [Seleziona]Public Function Action_Activate(sKey As String) As Boolean
Raise ActionEvent(sKey)
End
Return True
Probabilmente, adesso modifico il progetto e ripristino la vecchia gb.libxml.
$fifo = PgFifo(limit)
$fifo = new PgFifo(limit)
$root = PgXmlElement("root")
$root = new PgXmlElement("root")
scoperto l'inghippo: la funzione _init deve essere definita STATIC!!! (come del resto evidenziato nel wiki)
;D
In PgDesigner ci sono parecchi metodi _call(...) che sono dinamici. Buon lavoro
Ad ogni modo, nella documentazione STATIC era facoltativo, dove hai letto che ora DEVE essere STATIC ?più che altro una intuizione, dalla frase : This method can be static. Then, the class will be able to be used as a function, not the object.
Non sò se l'avevi notato, ma ora il drag&drop funziona dalla Tool, sia verso la View, sia verso la Tree.
Ho creato anche i pannelli per gli oggetti, per l'editing delle proprietà.
Nel menu, e nel popup, ora sono abilitate le voci "Object Property" e "Graphic Object".
Gli oggetti nella Tool sono visibili in base al tipo di driver del progetto.
Ho anche abilitato ed è funzionante il driver db del progetto, anche se non ancora operativo. La sua attività è ora ancora limitata alla gestione degli oggetti, e quindi non ha ancora le funzionalità di db.
Stò ancora abilitando gli eventi, i messaggi e la gestione degli errori, per la gestione unificata con il manager applicativo.
C'è da lavorare.... :'(
:D
filename = project.filename
...
Dialog.Path = filename
...
filename = Dialog.Path
Action[PgProjectManager.ACTION_PROJECT_CREATE_DOMAIN].Visible = project.Driver.IsValidObjectType(PgDataObjectType.Domain)
tableObject.Property["OnUpdate"].Value = xmlElement.AsString()
sFile = Split(aRecentList[nId], "|")[0]
.AddItem(oGroup, pgClassStringArray(pgConfig.CFG_RECENTLIST, [""]))
.AddItem(oGroup, pgClassStringArray(pgConfig.CFG_RECENTLIST, ["|"]))
Static Public Const MIN_LONG As Long = -9223372036854775807
Ad ogni modo, se non riscontri problemi con questa modifica sul Long, possiamo lasciarla così.
Agh!!!
Io ho la 5212, e pare funzionare... :-\
....evidenziati dal sig. Ambasciatore
Ho ripristinato la versione "da repository di gambas" proprio ieri sera.Ho scaricato la revisione 669 proprio oggi.
Ho dovuto eliminare la proprietà Painted sulle drawing, in quanto viene ripetutamente presentato un messaggio di warning, anche durante l'esecuzione del programma. Comunque, pare venga definitivamente rimossa con la release 3.4.
Stò quindi lavorando, si fà per dire, con gambas versione sviluppo...