[Tuto] Les fichiers comme DB
#1
Très souvent, voire trop souvent, on demande comment utiliser un fichier comme base de données. Et trop souvent, la personne qui demande n'a pas la moindre idée de l'utilisation d'une base de données, quel que soit son format.

Donc, que l'on utilise une base de données "normale" ou des fichiers (notez le pluriel), il faut garder à l'esprit la structure des données. Autant parfois utiliser une seule table, ou un fichier "plat", s'avère logique, autant il faut parfois penser à des choses plus complexes.

Et il y a aussi la question des requêtes, de ce qui doit être chargé à l'avance ou pas. Avec des fichiers, on ne peut pas faire de jointures, donc il faut bien réfléchir à tout ça.

Le dernier cas, c'est alias_angelius qui veut faire un système de gestion de droits par utilisateur et par canal, et qui pense faire un fichier plat. Pour ma part, et parce que je travaille très souvent avec des bases de données, j'envisage tout de suite 3 sources:
- utilisateur: nick, password
- canal: canal, description, n'importe quoi...
- level: nick, canal, level

Toutes les requêtes se feront donc au moins en 2 temps:
- vérification de l'utilisateur (utilisateur existe dans le fichier, password concorde), on peut utiliser un flag user temporaire pour vérifier si l'utilisateur est authentifié. (pour ma part, je ferais ça en utilisant la userlist)
- récupération de la ligne de "level" qui contient ET nick ET canal (une bonne regexp, c'est plus rapide)
Derrière ça, on analyse le level, ou son absence, et hop.

Ce système a l'avantage de ne pas brider les bases à une et une seule utilisation, elles peuvent être étendues. Et surtout, ça permet de gérer le fait qu'un utilisateur ait des accès sur plusieurs canaux tout en gardant les contraintes d'unicité.

Très vite, un code dans le wiki pour expliquer tout ça en pratique.
Répondre
#2
merci CrazyCat pour ce tuto qui je pense va bien nous aidez Smile
[font=Times New Roman]La différence entre Linux et Windows ,c'est que Linux c'est comme une belle fille , il faut l'apprivoiser , la comprendre , la séduire tandis que Windows , c'est comme une prostitué , il faut payer et surtout bien se protéger.[/font]
Répondre Avertir
#3
Allez hop, j'ai fait http://wiki.eggdrop.fr/Fichiers_et_DB
Répondre
#4
salut,

je suis pas trop d'accors avec toi, le fait d'ouvrir/fermer le fichier à chaque invocation de la proc n'est pas trop une bonne idée, il serait plus judicieux de charger les informations du fichier dans une variable au chargement du tcl (soit une simple var, soit un array, soit un dict) et de sauvegarder de temps en temps avec un bind evnt save.

http://www.eggdrop.fr/board/Lecture-fich...ml#pid7037
C'est en reconnaissant ses erreurs que l'on progresse Wink
Répondre Avertir
#5
Oui et non.
Mon but dans ce mini-tuto était de montrer comment on peut rechercher une entrée particulière dans un fichier, pas de donner une solution miracle. Ensuite, tout charger dans une variable ou pas, ça dépend de ce qui est dans le fichier. De même que de faire un read ou de lire le fichier ligne par ligne...

Bref, c'est juste un exemple d'utilisation, pas LA règle à suivre.
Répondre
#6
Bonjour,

En faite je n’ai pas vraiment compris.

Je m'explique..
Donc le système de tuto que tu as fait sur le wiki concernant l'ouverture/fermeture ceci j'ai compris parfaitement ce que je ne comprenez pas vraiment avant.

Ensuite tu fais divers appels dans la procédure qui correspond à pseudo,chan,pass,level si je me trompe pas non ?
Ensuite ma question serait :

Si tu as level donc tu fais appel à level jusque la pas de soucis ok.
Mais ma question et si dans la ligne de niveaux.db au moment ou tu dois regardez le level qui sera par exemple 200 pour se auth.
Comment tu regarde ceci ?

C'est ça que je n'arrive pas trop à comprendre ça reste superflus encore :/
Répondre Avertir
#7
alias_angelius a écrit :Bonjour,

En faite je n’ai pas vraiment compris.

Je m'explique..
Donc le système de tuto que tu as fait sur le wiki concernant l'ouverture/fermeture ceci j'ai compris parfaitement ce que je ne comprenez pas vraiment avant.

Ensuite tu fais divers appels dans la procédure qui correspond à pseudo,chan,pass,level si je me trompe pas non ?
Ensuite ma question serait :

Si tu as level donc tu fais appel à level jusque la pas de soucis ok.
Mais ma question et si dans la ligne de niveaux.db au moment ou tu dois regardez le level qui sera par exemple 200 pour se auth.
Comment tu regarde ceci ?

C'est ça que je n'arrive pas trop à comprendre ça reste superflus encore :/

Moi je ne comprends pas ta question.
On ne va jamais chercher les utilisateurs qui ont un level de 200, on va chercher l'utilisateur d'un canal et on regarde la valeur de son level.
Si tu veux, je traduis en SQL:
Code :
-- Ce que je comprends de ton idée
SELECT nick, channel FROM niveaux WHERE level = 200;
-- Et après chercher s'il y a l'utilisateur et le canal ?
--
-- Ce que je fais
SELECT level FROM niveaux WHERE nick='machin' AND canal='#bidule'
-- Là, on connait directement le niveau, on avait déjà avant nick et canal vu que c'est dans la commande tcl
Répondre
#8
En SQL... déjà en db j'ai du mal alors SQL..

En gros tu va enregistrer un utilisateur sur #fou ont va dire que ça va donner :

alias_angelius,#fou,200

Si je veux que tel commande soi au level 200 exemple ton système qui et l'exemple le !auth.
Je dois bien regardez si la personne qui tente de tapez la commande pour s'authentifié elle à bien le level requis.

Tu vois ce que je veux dire ?
Répondre Avertir
#9
dans ce cas la, (et encore une foi), tu n as pas besoin de ré-ouvrir le fichier. lors de la procédure de auth tu utilise une variable, par exemple authed($seudo), qui contiendra entre autre le level de la personne.

édite: si tu commences à ouvrir le fichier a chaque procédures la ça deviens vraiment du gros n importe quoi
C'est en reconnaissant ses erreurs que l'on progresse Wink
Répondre Avertir
#10
Ou mieux: authed($pseudo$channel) pour qu'une personne puisse être authentifiée sur différents canaux avec des levels différents.
alias_angelius a écrit :En SQL... déjà en db j'ai du mal alors SQL..
SQL est le langage utilisé pour les requêtes en bases de données.
alias_angelius a écrit :En gros tu va enregistrer un utilisateur sur #fou ont va dire que ça va donner :

alias_angelius,#fou,200

Si je veux que tel commande soi au level 200 exemple ton système qui et l'exemple le !auth.
Je dois bien regardez si la personne qui tente de tapez la commande pour s'authentifié elle à bien le level requis.

Tu vois ce que je veux dire ?
Non. Mets les mots dans l'ordre, et les bons mots, c'est illisible et incompréhensible.
Répondre
#11
personnellement j'utiliserais dict, la variable authed($pseudo) ressemblerait a ça:
{{#salon1 200} {#salon2 250} {#salon3 400}} etc..
c est plus simple à gérer lors du changement de pseudo
C'est en reconnaissant ses erreurs que l'on progresse Wink
Répondre Avertir
#12
Bon je vais donnais un exemple pour que tu puisses comprendre CrazyCat..

Tu va coder un bind pub qui sera par exemple !alist
Ce fameux bind pub donnera la liste des personnes authentifié auprès de l'eggdrop et donc grâce au code que tu auras fait.
Mais à savoir pour tapez cette commande ainsi pour que le bot puisse t'autoriser à pouvoir voir qui et authentifié ou pas il faut un level.

Et donc ce fameux level l'eggdrop va le chercher dans le fichier niveaux.db sur la ligne ou tu as "level"
Et donc ce fameux "level" doit être remplacé par un chiffre me semble t-il non ?!

Donc exemple sur ce que j'appel "level" :

200 = opérateur par exemple.

Ce qui nous donnera si la personne na pas le "level 200" elle n'aura pas accès à la commande !alist.
Tu vois ce que je veux dire CrazyCat ?
Répondre Avertir
#13
en gros un peut comme un IriX pour la gestion des utilisateurs ...
[font=Times New Roman]La différence entre Linux et Windows ,c'est que Linux c'est comme une belle fille , il faut l'apprivoiser , la comprendre , la séduire tandis que Windows , c'est comme une prostitué , il faut payer et surtout bien se protéger.[/font]
Répondre Avertir
#14
Sa dépend de quel IriX tu parle.. Comme celui micrObe qui et en langage C il fait ce genre de chose à peut près.

Mais j'ai parlé de !alist car c'est le seul exemple stupide que j'ai trouvé sur le coup.
Répondre Avertir
#15
alias_angelius a écrit :Bon je vais donnais un exemple pour que tu puisses comprendre CrazyCat..

Tu va coder un bind pub qui sera par exemple !alist
Ce fameux bind pub donnera la liste des personnes authentifié auprès de l'eggdrop et donc grâce au code que tu auras fait.
Mais à savoir pour tapez cette commande ainsi pour que le bot puisse t'autoriser à pouvoir voir qui et authentifié ou pas il faut un level.

Et donc ce fameux level l'eggdrop va le chercher dans le fichier niveaux.db sur la ligne ou tu as "level"
Et donc ce fameux "level" doit être remplacé par un chiffre me semble t-il non ?!

Donc exemple sur ce que j'appel "level" :

200 = opérateur par exemple.

Ce qui nous donnera si la personne na pas le "level 200" elle n'aura pas accès à la commande !alist.
Tu vois ce que je veux dire CrazyCat ?

je crois que tu n'as pas compris, le fichier qui contient les accès, tu ne l ouvre qu une seule foi lors de l authentification. ensuite tu set le level dans une variable et dans ta proc de alist tu récupere le résultat de la variable.
C'est en reconnaissant ses erreurs que l'on progresse Wink
Répondre Avertir


Atteindre :


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