Créer et utiliser une base de données avec dict
Nous allons voir comment créer et utiliser une base de données $database, dans laquelle vous pourrez définir des catégories, des sous-catégories, des sous-sous-catégories, (...) et attribuer des valeurs à des entrées.
Syntaxe :
create_entry category1 [category2 [...]] <value> : Crée une entrée et lui attribue une valeur.
delete_entry category1 [category2 [...]] : Supprime une entrée.
get_entries category1 [category2 [...]] : Affiche les entrées que contient une catégorie.
get_data category1 [category2 [...]] : Affiche la valeur d'une entrée.
incr_value category1 [category2 [...]] <increment> : Incrémente la valeur d'une entrée. L'incrément peut être une valeur négative et/ou décimale.
Procédures
###############################################################################
### Crée une entrée dans la base de données.
###############################################################################
proc create_entry {args} {
variable database
if { ![::tcl::info::exists database] } {
variable database {}
}
::tcl::dict::set database {*}$args
}
###############################################################################
### Supprime une catégorie et ses sous-catégories dans la base de données.
###############################################################################
proc delete_entry {args} {
variable database
if { ![::tcl::info::exists database] } {
return -code error "base de données vide"
} elseif { ![::tcl::dict::exists $database {*}$args] } {
return -code error "entrée inexistante"
} else {
if { [catch { ::tcl::dict::unset database {*}$args }] } {
return -code error "entrée inexistante"
}
}
}
###############################################################################
### Affiche les entrées que contiennent une catégorie dans la base de données.
###############################################################################
proc get_entries {args} {
variable database
if { ![::tcl::info::exists database] } {
return -code error "base de données vide"
} else {
if { [catch { ::tcl::dict::keys [::tcl::dict::get $database {*}$args] } result ] } {
return -code error "catégorie inexistante"
} else {
return $result
}
}
}
###############################################################################
### Affiche la valeur d'une entrée dans la base de données.
###############################################################################
proc get_data {args} {
variable database
if { ![::tcl::info::exists database] } {
return -code error "base de données vide"
} else {
if { [catch { ::tcl::dict::get $database {*}$args } result] } {
return -code error "catégorie inexistante"
} else {
return $result
}
}
}
###############################################################################
### Incrémente une entrée numérique dans la base de données.
### L'incrément peut être une valeur négative et/ou décimale.
###############################################################################
proc incr_value {args} {
if { ![::tcl::string::is double [set increment [lindex $args end]]] } {
return -code error "l'incrément doit être numérique"
} else {
set args [lreplace $args end end]
variable database
if { ![::tcl::info::exists database] } {
return -code error "base de données vide"
} else {
if { ![::tcl::dict::exists $database {*}$args] } {
return -code error "entrée inexistante"
} elseif { ![::tcl::string::is double [::tcl::dict::get $database {*}$args]] } {
return -code error "la valeur de cette entrée n'est pas numérique"
} elseif { [catch { ::tcl::dict::set database {*}$args [expr {[::tcl::dict::get $database {*}$args] + $increment}] } result] } {
return -code error "catégorie inexistante"
} else {
return $result
}
}
}
}
Utilisation
create_entry France Paris "Toto Dupont" prénom Toto
Tcl: France {Paris {{Toto Dupont} {prénom Toto}}}
create_entry France Paris "Toto Dupont" nom Dupont
Tcl: France {Paris {{Toto Dupont} {prénom Toto nom Dupont}}}
create_entry France Paris "Toto Dupont" âge 24
Tcl: France {Paris {{Toto Dupont} {prénom Toto nom Dupont âge 24}}}
create_entry France Paris "Titi Durand" prénom Titi
Tcl: France {Paris {{Toto Dupont} {prénom Toto nom Dupont âge 24} {Titi Durand} {prénom Titi}}}
create_entry France Paris "Titi Durand" nom Durand
Tcl: France {Paris {{Toto Dupont} {prénom Toto nom Dupont âge 24} {Titi Durand} {prénom Durand}}}
create_entry France Paris "Titi Durand" âge 32
Tcl: France {Paris {{Toto Dupont} {prénom Toto nom Dupont âge 24} {Titi Durand} {prénom Durand âge 32}}}
create_entry Espagne Madrid "Pedro Sanchez" prénom Pedro
Tcl: France {Paris {{Toto Dupont} {prénom Toto nom Dupont âge 24} {Titi Durand} {prénom Titi âge 32 nom Durand}}} Espagne {Madrid {{Pedro Sanchez} {prénom Pedro}}}
create_entry Espagne Madrid "Pedro Sanchez" nom Sanchez
Tcl: France {Paris {{Toto Dupont} {prénom Toto nom Dupont âge 24} {Titi Durand} {prénom Titi âge 32 nom Durand}}} Espagne {Madrid {{Pedro Sanchez} {prénom Pedro nom Sanchez}}}
create_entry Espagne Madrid "Pedro Sanchez" âge 17
Tcl: France {Paris {{Toto Dupont} {prénom Toto nom Dupont âge 24} {Titi Durand} {prénom Titi âge 32 nom Durand}}} Espagne {Madrid {{Pedro Sanchez} {prénom Pedro nom Sanchez âge 17}}}
create_entry France Grenoble "Menz Agitat" prénom Menz
Tcl: France {Paris {{Toto Dupont} {prénom Toto nom Dupont âge 24} {Titi Durand} {prénom Titi âge 32 nom Durand}} Grenoble {{Menz Agitat} {prénom Menz}}} Espagne {Madrid {{Pedro Sanchez} {prénom Pedro nom Sanchez âge 17}}}
create_entry France Grenoble "Menz Agitat" nom Agitat
Tcl: France {Paris {{Toto Dupont} {prénom Toto nom Dupont âge 24} {Titi Durand} {prénom Titi âge 32 nom Durand}} Grenoble {{Menz Agitat} {prénom Menz nom Agitat}}} Espagne {Madrid {{Pedro Sanchez} {prénom Pedro nom Sanchez âge 17}}}
get_entries
Tcl: France Espagne
get_entries France
Tcl: Paris Grenoble
get_entries France Paris
Tcl: {Toto Dupont} {Titi Durand}
get_entries France Paris "Toto Dupont"
Tcl: prénom nom âge
get_data France Paris "Toto Dupont" prénom
Tcl: Toto
get_data France Paris "Toto Dupont" nom
Tcl: Dupont
get_data France Paris "Toto Dupont" âge
Tcl: 24
delete_entry France Grenoble
Tcl: France {Paris {{Toto Dupont} {prénom Toto nom Dupont âge 24} {Titi Durand} {prénom Titi âge 32 nom Durand}}} Espagne {Madrid {{Pedro Sanchez} {prénom Pedro nom Sanchez âge 17}}}
delete_entry France Paris "Titi Durand"
Tcl: France {Paris {{Toto Dupont} {prénom Toto nom Dupont âge 24}}} Espagne {Madrid {{Pedro Sanchez} {prénom Pedro nom Sanchez âge 17}}}
incr_value France Paris "Toto Dupont" âge 2
Tcl: France {Paris {{Toto Dupont} {prénom Toto nom Dupont âge 26}}} Espagne {Madrid {{Pedro Sanchez} {prénom Pedro nom Sanchez âge 17}}}
incr_value France Paris "Toto Dupont" âge -2
Tcl: France {Paris {{Toto Dupont} {prénom Toto nom Dupont âge 24}}} Espagne {Madrid {{Pedro Sanchez} {prénom Pedro nom Sanchez âge 17}}}