Communauté Eggdrop
Problème package mysqltcl DAV34 - Version imprimable

+- Communauté Eggdrop (https://forum.eggdrop.fr)
+-- Forum : Eggdrop et TCL (https://forum.eggdrop.fr/forumdisplay.php?fid=8)
+--- Forum : Scripts TCL (https://forum.eggdrop.fr/forumdisplay.php?fid=4)
+--- Sujet : Problème package mysqltcl DAV34 (/showthread.php?tid=332)

Pages : 1 2


Problème package mysqltcl DAV34 - crash - 30/01/2009

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.


RE: Problème package mysqltcl DAV34 - CrazyCat - 30/01/2009

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.


RE: Problème package mysqltcl DAV34 - crash - 31/01/2009

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.


RE: Problème package mysqltcl DAV34 - CrazyCat - 31/01/2009

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à.


RE: Problème package mysqltcl DAV34 - crash - 31/01/2009

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.


RE: Problème package mysqltcl DAV34 - crash - 01/02/2009

je n'ai toujours pas trouvé de solution, merci quand même de ton aide.


RE: Problème package mysqltcl DAV34 - BeussAy - 01/02/2009

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


RE: Problème package mysqltcl DAV34 - crash - 01/02/2009

Parfait beussAy Very Happy ça corrige tous mes problèmes je te remercie 1000 fois Smile


RE: Problème package mysqltcl DAV34 - CrazyCat - 02/02/2009

Le fait de ne pas avoir de return laisse la connexion ouverte (le recordset est toujours actif) ?


RE: Problème package mysqltcl DAV34 - BeussAy - 02/02/2009

J ai pas compris ce que tu voulais dire.


RE: Problème package mysqltcl DAV34 - CrazyCat - 02/02/2009

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.


RE: Problème package mysqltcl DAV34 - BeussAy - 02/02/2009

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


RE: Problème package mysqltcl DAV34 - crash - 02/02/2009

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.


RE: Problème package mysqltcl DAV34 - CrazyCat - 02/02/2009

J'ai modifié les sources du tutorial pour qu'elles soient justes.


RE: Problème package mysqltcl DAV34 - BeussAy - 02/02/2009

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