Parser SQL
-
- Messages : 83
- Inscription : lun. 20/sept./2004 18:21
- Localisation : derriere toi fais gaffe!
Parser SQL
Bonjour,
je ne poste pas souvent de messages sur ce forum, mais j'y passe le plus souvent possible et je dois dire que vous faites tous du très bon boulot, tant de vous même que pour la communauté PB.
Alors pour vous j'ai une petite colle....
Je voudrais programmer un parser SQL, mais z'helas je ne vois même pas par quel bout commencer.
j'ai brouilloné quelques petites choses avec des stringfields, findstring et tout et tout, mais ensuite pour effectuer des recherches dans un fichier texte (ayant une certaine structure) je ne vois vraiment pas comment faire.
Récuperer dans des variables les différents éléments d'une commande SQL ça va encore (et encore....) mais ensuite quelle structure doit posseder mon programme? quel genre de fonctions doivent etre créees pour parser efficacement le fichier contenant les données?
la je patauge, toute aide sera donc la bienvenue!
merci d'avance!
je ne poste pas souvent de messages sur ce forum, mais j'y passe le plus souvent possible et je dois dire que vous faites tous du très bon boulot, tant de vous même que pour la communauté PB.
Alors pour vous j'ai une petite colle....
Je voudrais programmer un parser SQL, mais z'helas je ne vois même pas par quel bout commencer.
j'ai brouilloné quelques petites choses avec des stringfields, findstring et tout et tout, mais ensuite pour effectuer des recherches dans un fichier texte (ayant une certaine structure) je ne vois vraiment pas comment faire.
Récuperer dans des variables les différents éléments d'une commande SQL ça va encore (et encore....) mais ensuite quelle structure doit posseder mon programme? quel genre de fonctions doivent etre créees pour parser efficacement le fichier contenant les données?
la je patauge, toute aide sera donc la bienvenue!
merci d'avance!
Asus bien? asus tres bien!
- Progi1984
- Messages : 2659
- Inscription : mar. 14/déc./2004 13:56
- Localisation : France > Rennes
- Contact :
Il faudrait une procédure qui cherche d'abord la commande principale (select, create, update),
puis d'autres pour les commandes secondaires (from, where, on, group by, order by,...) en fonction de la première commande
Aprés un Select, on cherchera le from, where, order by, etc..
Aprés un update, on cherchera le on, where, etc...
puis d'autres pour les commandes secondaires (from, where, on, group by, order by,...) en fonction de la première commande
Aprés un Select, on cherchera le from, where, order by, etc..
Aprés un update, on cherchera le on, where, etc...
Librairies & Applications : https://www.purebasic.fr/french/viewtop ... f=8&t=6220
Site Web : https://rootslabs.net
Site Web : https://rootslabs.net
- Progi1984
- Messages : 2659
- Inscription : mar. 14/déc./2004 13:56
- Localisation : France > Rennes
- Contact :
exact
Librairies & Applications : https://www.purebasic.fr/french/viewtop ... f=8&t=6220
Site Web : https://rootslabs.net
Site Web : https://rootslabs.net
-
- Messages : 83
- Inscription : lun. 20/sept./2004 18:21
- Localisation : derriere toi fais gaffe!
j'ai testé ta lib LDB (du mois je crois bien que c'est la tienne), j'ai fait des bench et même si elle fonctionne parfaitement, je trouve les opérations de recherche vraiment très lentes (1,5 seconde pour un tri sur 300 enregistrements.)
A quoi pense tu que cela est du? penses tu qu'il y a moyen de grandement augmenter cette vitesse?
A quoi pense tu que cela est du? penses tu qu'il y a moyen de grandement augmenter cette vitesse?
Asus bien? asus tres bien!
-
- Messages : 83
- Inscription : lun. 20/sept./2004 18:21
- Localisation : derriere toi fais gaffe!
j'ai isolé la part de code de la fonction LdbSortNum, car des choses me semblent curieuses:
pourquoi déclare tu premier.f et deuxieme.f dans une boucle? c'est une perte de temps non? ça bouffe des cycles de redéclarer une meme variable a chaque itération non? je n'ai pas tailbite donc je peut pas tester avec une déclaration précédement effectué.[/b]
Code : Tout sélectionner
ProcedureDLL LdbSortNum(Field)
Nb=LdbCountRecord()
If Nb>1 ; Si au moins 2 enregistrements
PointerTemp=LdbGetPointer()
For n=1 To Nb-1
For i=n+1 To Nb
LdbSetPointer(n)
premier.f=ValF(LdbRead(Field))
LdbSetPointer(i)
deuxieme.f=ValF(LdbRead(Field))
If premier.f>deuxieme.f
SelectElement(Bdd(),n)
temp.s=Bdd()
SelectElement(Bdd(),i)
temp2.s=Bdd()
Bdd()=temp
SelectElement(Bdd(),n)
Bdd()=temp2
EndIf
Next i
Next n
LdbSetPointer(PointerTemp)
EndIf
EndProcedure
Asus bien? asus tres bien!
la portée de la variable ne sera pas la boucle mais la procédure, elle ne sera donc pas redéclarée a chaque fois 
Dri

Code : Tout sélectionner
Procedure test()
i.l
For i = 1 To 10
a.f + 1.1
Next i
Debug a
EndProcedure
test()
- Progi1984
- Messages : 2659
- Inscription : mar. 14/déc./2004 13:56
- Localisation : France > Rennes
- Contact :
PS : ce n'est pas la mienne !
Librairies & Applications : https://www.purebasic.fr/french/viewtop ... f=8&t=6220
Site Web : https://rootslabs.net
Site Web : https://rootslabs.net
Peut-être que ça irait plus vite en modifiant ceci
par ceci
mais je pense que SwapElements() échange tous les champs (je suppose car je ne l'ai pas utilisé) donc si la liste chaînée a un seul champ, c'est OK, sinon ça ne correspond pas.
Il me semble que le tri est un tri à bulle, ce n'est pas Le tri le plus rapide mais je ne suis pas un spécialiste du tri. Il faudrait chercher un algorithme plus rapide.
Code : Tout sélectionner
If premier.f>deuxieme.f
SelectElement(Bdd(),n)
temp.s=Bdd()
SelectElement(Bdd(),i)
temp2.s=Bdd()
Bdd()=temp
SelectElement(Bdd(),n)
Bdd()=temp2
EndIf
Code : Tout sélectionner
If premier.f>deuxieme.f
SelectElement(Bdd(),n)
*PremierElement = @Bdd()
SelectElement(Bdd(),i)
*DeuxiemeElement = @Bdd()
SwapElements(Bdd(), *PremierElement, *DeuxiemeElement))
EndIf
Il me semble que le tri est un tri à bulle, ce n'est pas Le tri le plus rapide mais je ne suis pas un spécialiste du tri. Il faudrait chercher un algorithme plus rapide.
Dernière modification par Anonyme2 le jeu. 02/juin/2005 17:16, modifié 1 fois.
-
- Messages : 83
- Inscription : lun. 20/sept./2004 18:21
- Localisation : derriere toi fais gaffe!
il me semble que le tri le plus rapide est le "tri compteur" car il n'utilise pas de comparaison, par contre on est obligé de charger en mémoire l'integralité de ce qu'il y a à trier.
merci pour le code, je vais tacher de le changer pour voir si il y a un gain remarquable.
merci pour le code, je vais tacher de le changer pour voir si il y a un gain remarquable.
Asus bien? asus tres bien!