Greetings !!

Je suis en train de m'arracher les dreadlocks...

Voilà l'extrait du thread principal...
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
 
let connection = establish_connection();
let mut connection_handle = connection.unwrap();
let arc_connection = Arc::new(Mutex::new(&mut connection_handle));
 
let threadscope = thread::scope
(
	|thescope|
	{
		'connexion: loop
		{
			for stream in Listener.incoming()
			{
				match stream
				{
					Ok(saloperie) =>
						{
							let arc_stream = Arc::new(Mutex::new(saloperie));
							println!("[{:?}] Connection granted !!", Local::now());
							let rc = thescope.spawn(|| client_handler(arc_stream,&arc_connection));
							let value = rc.join().unwrap();
							if value.is_negative()
							{
								break 'connexion;
							}
						}
					Err(erreur) =>
						{
							eprintln!("Error: {}", erreur);
						}
				} // end match
				} // end for
			sleep(Duration::from_millis(80));
		} // end loop
	}
);
J'ai déjà bien galéré pour que le compilateur ne bronche plus...
Manifestement je ne maîtrise pas du tout cette boîte noire appelée "borrowing" et ça commence tout doucement à me ca**er les c...
Je pourrais taper le handler en static mutable mais je me suis dit que je pourrais faire cela sans devoir me taper des unsafe à tout bout de champs.

Du coup voilà le client_handler
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
 
pub fn client_handler(arc_stream :Arc<Mutex<TcpStream>>, arc_connect :&Arc<Mutex<&mut PooledConn>> ) -> i32
{
  ...
  let res_connection = arc_connect.lock();
  ...
}
Dans ce client handler je fais une première fois

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
let result = player_fromDB.getIDbyName(&mut res_connection.unwrap(), onePlayer.getString());
if result > 0
{
  println!("[DB] {} found !!",onePlayer.getString());
  // In this case some computing must be done... later.
}
else
{
  println!("[DB] {} not found !!",onePlayer.getString());
 // In this case the player must be inserted to the DB... later.
}
...avec une larme de joie sur la joue ça marche... je me dis "c'est bon je continue"...

...puis je fais un peu plus loin...

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
if player_fromDB.getID() > 0
{
  // update
  player_fromDB.setScore(onePlayer.getScoreP(),onePlayer.getScoreO());
  GEN_updateDB(player_fromDB,&mut res_connection.unwrap());
}
...et là mes croyances se sont effondrées :{
| let res_connection = arc_connect.lock();
| -------------- move occurs because `res_connection` has type `Result<MutexGuard<'_, &mut PooledConn>, PoisonError<...>>`, which does not implement the `Copy` trait
...
229 | let result = player_fromDB.getIDbyName(&mut res_connection.unwrap(), onePlayer.getString());
| -------------- -------- `res_connection` moved due to this method call
| |
| help: consider calling `.as_ref()` or `.as_mut()` to borrow the type's contents
...
339 | GEN_updateDB(player_fromDB,&mut res_connection.unwrap());
| ^^^^^^^^^^^^^^ value used here after move
Pas moyen de cloner, pas moyen de rien...
Je fais comment maintenant ???

C'est tellement de la merde Rust qu'il "suffisait" de taper le unwrap dans une bête variable...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
let couillonade = &mut res_connection.unwrap();