Update

The update functions from the API will update a field,

  • if the field name is in the field list
  • and a selectable field in the struct contains a value.

Update behaviour example

If we want to update all fields of the struct below with a field list of *, the behaviour would be


# #![allow(unused_variables)]
#fn main() {
use toql::prelude::Toql;

#   #[derive(Toql)]
#   struct Phone {
#   
#   	#[toql(key)]
#   	number: String,
#   	prepaid : Option<bool>
#   }
#
#   #[derive(Toql)]
#   struct Address {
#   	#[toql(key)]
#   	id: u64,
#   	street: Option<String>
#   }

#[derive(Toql)]
struct User {
    #[toql(key)]
    id: u64,			// Keys are never updated	

    username: String,		// Update
    realname: Option<String>, 	// Updated , if Some
    address: Option<Option<String>>, // Update NULL or String, if Some

    #[toql(preselect)]
    info: Option<String>, 	//Update NULL or String

    #[toql(join)]
    address1: Option<Address>, // Update foreign_key, if Some 

    #[toql(join)]
    address2: Option<Option<Address>>,//  Update foreign_key or NULL, if Some 

    #[toql(join)]
    address3: Address, 		// Update foreign_key

    #[toql(join, preselect)]
    address4: Option<Address>,	// Update foreign_key or NULL

    #[toql(merge)]
    phones1: Vec<Phone>,	// No effect for *

    #[toql(merge)]
    phones2: Option<Vec<Phone>> // No effect for *, 
}
#}

Notice that foreign keys of joins are included (User.address1_id, User.address2_id, ..) with the * in the field list. However merges must be explicitly mentioned.

To update all fields from User and to resize the Vec of phones1 (insert new phones + delete old phones ) the field list would be *, phones1.