Salutations !!
Je suis en train d'apprendre le Rust, et comme je fais en général quand j'apprends un nouveau langage je reprends des programmes écrits initialement dans d'autres langages comme le C, Perl, Assembler, C++, Java, ... et j'essaye de les porter.
Ici, je voudrais "simplement" reprendre un programme en C à l'origine qui interroge une base de données et qui affiche les résultats de la requête.
Je suis tombé malade en lisant les indications autant dans la documentation en ligne que dans les bouquins concernant la prise en charge de la gestion des bases de données en Rust :{
Voilà ce que j'ai pour l'instant, ne faites pas attention au caractère "grossier" des messages, je fais cela pour moi et ça me fait rire... enfantillages et consors.
Avec ceci je peux déterminer si la connexion s'effectue à la base de données c'est super MAIS... pour la suite c'est l'horreur... je trouve que le Perl est largement plus lisible que le Rust quand on voit ce genre de choses:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 use mysql::*; use text_colorizer::*; const DB_HOST :&str = "192.168.0.4"; const DB_USER :&str = "magicuser"; const DB_PASSWD :&str = "resucigam"; const DB_NAME :&str = "MagicArena"; #[derive(Clone)] struct TablePlayers { idplayer :u16, alias: String, couleurs: u8, victories: u16, conceded: u16, defeated: u16, draws: u16, myscore: u64, hiscore: u64, matchesdone: u16 } fn main() { println!("magicstats v0.0.1 RUST"); print!("Tentative de connexion à la base de données MagicArena..."); let errorcode = doconnect(); match errorcode { Ok(myconnexion) => { print!("...{}\n", "OK".green().bold()); // pas envie de commencer à traiter les données ici j'aimerais le faire en dehors de ce bloc... mais je n'y arrive pas }, Err(ref erreurdemerde) => { println!("{}", "ERREUR !! B**** DE M**** :{".blink().red()); println!("{} {}", "Pas moyen de se connecter parce que =>".yellow().bold(), erreurdemerde.to_string().yellow()); std::process::exit(2); } } // myconnexion est inconnue ici évidemment } fn doconnect() -> std::result::Result<PooledConn, Error> // je suis obligé à cause d'un traits provenant de PooledConn si mes souvenirs sont bons... { let url = "mysql://".to_owned()+DB_USER+":"+DB_PASSWD+"@"+DB_HOST+"/"+DB_NAME; let pool = Pool::new(&*url); let conn = pool?.get_conn(); conn }
...ou bien pire...let selected_payments = conn
.query_map(
"SELECT customer_id, amount, account_name from payment",
|(customer_id, amount, account_name)| {
Payment { customer_id, amount, account_name }
},
)?;
...je n'ai pas encore tout exploré en matière d'interface base de données pour Rust, j'espère qu'il y a quelque chose de similaire à perl-dbi en Rust parce que si je dois à chaque fois me farcir ce genre d'horreur pour effectuerlet all_persons: Vec<Person> =
pool.prep_exec("SELECT person_id, person_name from person", ())
.map(|result| {
result.map(|x| x.unwrap()).map(|row| {
let (person_id, person_name) = mysql::from_row(row);
Person {
person_id,
person_name
}
}).collect()
}).unwrap(); // Unwrap `Vec<Person>`
for person in all_persons.iter() {
println!("{}: {}", person.person_id, person.person_name);
}
...
de simples requêtes (le PDO PHP qui me fait vômir m'a finalement l'air pas si indigeste au vu de ce que je vois), ...
Questions:
Comment faire pour que la fonction doconnect retourne un objet de type PooledConn au lieu d'un Result<...> ?
Ca me gave de toujours devoir faire des match ceci et Ok(cela) Err(brol) à tout bout de champs avec, en plus, la création de "variables locales" à la portée limitée au bloc où elles sont créées :{
Créer une variable globale (mot clef static) c'est la croix et la banière, je ne trouve pas l'équivalent au mot clef "null" qui me tirerait, à mon avis d'affaire.
Existe-t-il quelque chose d'aussi simple en Rust que ceci en matière d'accès simple à une DB ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part static thisconnexion :PooledConn = std::ptr::null; // ça ne marche pas -> erreur à la compilation
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 my $statement=$DBHandler->prepare("SELECT AES_DECRYPT(UNHEX(gmailuser),734),AES_DECRYPT(UNHEX(gmailpass),734) FROM Security"); $statement->execute(); ($imaplogin,$imappass)=$statement->fetchrow_array();
Partager