Problème package mysqltcl DAV34
#1
Bonjour,

j'ai un problème avec l'exemple TCL du package de DAV34, voici le code :

TCL
# -> Login
set sql(login) "root"
# -> Mot de passe
set sql(pass) "pass"
# -> Nom de la base de donnée
set sql(db) "root"
# -> L'host a l'aquelle ce connecté
set sql(host) "localhost"
# -> Localisation de fichier mysql.sock
set sql(sock) "/tmp/mysql.sock"

 
###########
# PAQUETAGE #
###########
 
catch {package require mysqltcl}

#######
# CODE #
#######

#########
# CONNECT #
#########
proc service:connect {} {
set ::mysqlink [mysqlconnect -host $::sql(host) -user $::sql(login) -password $::sql(pass) -sock $::sql(sock)]
mysqluse $::mysqlink $::sql(db)
}

 
###########
# DECONNECT #
###########
 
proc service:deconnect {} {
mysqlclose $::mysqlink; unset -nocomplain ::mysqlink
}

########
# ISAUTH #
########
 
proc isauth {arg} {
service:connect
 
return [mysqlsel $::mysqlink "select statut from access where pseudo = '$arg' and statut = 'On'"]
 
service:deconnect
}

##########
# ISSUSPEND #
##########
 
proc issuspend {arg} {
service:connect
 
return [mysqlsel $::mysqlink "select statut from access where pseudo = '$arg' and suspend = 'On'"]
 
service:deconnect
}

############
# ISVALIDUSER #
############
 
proc isvaliduser {arg} {
service:connect
 
return [mysqlsel $::mysqlink "select pseudo from access where pseudo = '$arg'"]
 
service:deconnect
}

################
# ISVALIDPASSWORD #
################
 
proc isvalidpassword {mot1 mot2} {
service:connect
 
return [mysqlsel $::mysqlink "select pseudo, pass from access where pseudo = '$mot1' and pass = '$mot2'"]
 
service:deconnect
}

########
# AUTH #
########
 
proc auth {arg} {
service:connect
 
mysqlsel $::mysqlink "UPDATE `access` SET `statut` = 'On' WHERE pseudo = '$arg'"
 
service:deconnect
}

#######
# AUTH #
#######
 
bind msg - auth msg:auth
proc msg:auth {nick host hand arg} {
set mot1 [lindex $arg 0]
set mot2 [lindex $arg 1]
if { $mot1 == "" || $mot2 == "" } { puthelp "NOTICE $nick :Commande auth : /msg $::botnick auth <pseudo> <pass>"; return 0 }
if { ![isvaliduser $mot1] } { puthelp "NOTICE $nick :$mot1 user inconnue !"; return 0 }
if { [isvalidpassword $mot1 $mot2] } {
if { [issuspend $mot1] } { puthelp "NOTICE $nick :Accés suspendu"; return 0 }
if { [isauth $mot1] } { puthelp "NOTICE $nick :Vous êtes déjà identifier !"; return 0 }
puthelp "NOTICE $nick :Félicitation, vous êtes identifier"
auth $mot1
} else {
puthelp "NOTICE $nick :Erreur, mot de passe incorrect."; return 0
}
}



En fait, ça fonctionne très bien sauf que ça me lance plusieurs processus dans phpmyadmin et au bout d'un certains temps "mysqlconnect/db server: Too many connections" normalement il ne devrait y avoir aucun process mysql qui doit rester ...

j'ai essayé plusieurs modifications et je n'ai pas réussis.

je vous remercie d'avance.

Cordialement.
Répondre Avertir
#2
Tu as peut-être d'autres choses qui font appel à MySQL (comme un site web) ou plusieurs instances du TCL de lancées...
Le script en lui-même n'est pas en cause, il referme bien les connexions.
Répondre
#3
Merci de ta réponse, mais j'ai juste un serveur IRC qui tourne avec le bot là sur mon dédié de développement.

Néanmoins à chaque fois que je fais une commande sur phpmyadmin je peux voir :

Id User Host db Command Time State Info
10 crash localhost robot Sleep 114 NULL


j'ai essayé de reboot la machine et j'ai toujours le même problème, et je pense pas avoir plusieurs instances du TCl de lancées ...

Je ne sais pas comment faire pour régler ce problème, je te serais très reconnaissant si tu as une bonne piste.

Merci.
Répondre Avertir
#4
Il est aussi possible que le tcl fasse des connexions trop rapides, et/ou que les autres connexions se ferment mal.
Le fait que la connexion soit en "sleep" indique qu'elle est mal fermée (abandonnée par mysql).
Il faudrait aussi connaitre les autorisations de l'utilisateur "robot" sur ton mysql, cela peut aussi venir de là.
Répondre
#5
Hum l'utilisateur est "crash" et non "robot", et les privilèges de l'user crash est en localhost ALL PRIVILEGES ... je pense pas que ça puisse avoir un impact car passé un temps j'utilisais un tcl de stats avec des timers et je n'avais pas ce genre de problème avec.
Répondre Avertir
#6
je n'ai toujours pas trouvé de solution, merci quand même de ton aide.
Répondre Avertir
#7
Bonsoir.
Je te donne un exemple.
TCL
proc issuspend {arg} {
service:connect
set reponse [mysqlsel $::mysqlink "select statut from access where pseudo = '$arg' and suspend = 'On'"]
service:deconnect
return $reponse
}




Crdlt BeussAy
Répondre Avertir
#8
Parfait beussAy Very Happy ça corrige tous mes problèmes je te remercie 1000 fois Smile
Répondre Avertir
#9
Le fait de ne pas avoir de return laisse la connexion ouverte (le recordset est toujours actif) ?
Répondre
#10
J ai pas compris ce que tu voulais dire.
Répondre Avertir
#11
Ah non, au temps pour moi, j'avais pas suivi ta correction, j'ai rien dit.

@crash: effectivement, si tu fais un return avant d'appeler le service:deconnect, il n'est jamais appelé. return fait sortir de le procédure.
Répondre
#12
Oui qq corrections au niveau du tuto de dav seraient les bienvenues. Ce tuto est il sur eggdrop.fr, j ai pas regarde ?
Comme le mysqlsel sur un update c est possible?Pour ma part j utilise mysqlexec.

Crdlt BeussAy
Répondre Avertir
#13
Oui il est ici le tuto http://www.eggdrop.fr/Paquage:mySQLTCL

En vous remerciant encore, je me disais bien que ça venait du TCL en lui même.
Répondre Avertir
#14
J'ai modifié les sources du tutorial pour qu'elles soient justes.
Répondre
#15
Enfin connecté du pc, j'en profite pour attirer ton attention sur cette proc :
TCL
bind dcc - afficher dcc:afficher
proc dcc:afficher {hand idx arg} {
	service:connect
	mysqlsel $::mysqlink "SELECT * FROM `access` ORDER BY id"
	if {[mysqlresult $::mysqlink rows] ne 0} {
		while {[set row [mysqlnext $::mysqlink]] != ""} {
                  putlog "id : [lindex $row 0]"
                  putlog "pseudo : [lindex $row 1]"
                  putlog "pass : [lindex $row 2]"
                  putlog "grade : [lindex $row 3]"
                  putlog "suspend : [lindex $row 4]"
                  putlog "statut : [lindex $row 5]"
	        }
        }
    service:deconnect
}



Je pense que le plus simple est directement de mettre ça sous forme de liste.
1 : ouverture
2 : récupération des données
3 : fermeture

Ensuite on peut tranquillement travailler sur notre liste.
Exemple :

TCL
bind dcc - afficher dcc:afficher
proc dcc:afficher {hand idx arg} {
# Recupération des informations sous forme de liste
service:connect
set res [mysqlsel $::mysqlink "SELECT * FROM `access` ORDER BY id" -list]
service:deconnect
    if { [string length $res] ne 0 } {
        foreach row $res {
            putlog "id : [lindex $row 0]"
            putlog "pseudo : [lindex $row 1]"
            putlog "pass : [lindex $row 2]"
            putlog "grade : [lindex $row 3]"
            putlog "suspend : [lindex $row 4]"
            putlog "statut : [lindex $row 5]"
        }
    }
}



Je pense que c'est un point important à connaitre lorsque l'on code un gros projet ayant pas mal de requêtes de ce style.


Crdlt
Répondre Avertir


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
Tchat 100% gratuit -Discutez en toute liberté