Expand description

This module provides a list of q message type used for IPC. The motivation to contain them in a module is to tie them up as related items rather than scattered values. Hence user should use these indicators with qmsg_type:: prefix, e.g., qmsg_type::asynchronous.

Example

use kdbplus::ipc::*;
 
// Print `K` object.
fn print(obj: &K){
  println!("{}", obj);
}
 
// Calculate something from two long arguments.
fn nonsense(arg1: i64, arg2: i64) -> i64{
  arg1 * arg2
}
 
#[tokio::main]
async fn main() -> Result<()>{
 
  // Connect to qprocess running on localhost:5000 via TCP
  let mut socket=QStream::connect(ConnectionMethod::TCP, "localhost", 5000_u16, "ideal:person").await?;
 
  // Set a function which sends back a non-response message during its execution.
  socket.send_async_message(&"complex:{neg[.z.w](`print; \"counter\"); what: .z.w (`nonsense; 1; 2); what*100}").await?;
 
  // Send a query `(`complex; ::)` without waiting for a response.
  socket.send_message(&K::new_compound_list(vec![K::new_symbol(String::from("complex")), K::new_null()]), qmsg_type::synchronous).await?;
 
  // Receive an asynchronous call from the function.
  match socket.receive_message().await{
    Ok((qmsg_type::asynchronous, message)) => {
      println!("asynchronous call: {}", message);
      let list=message.as_vec::<K>().unwrap();
      if list[0].get_symbol().unwrap() == "print"{
        print(&list[1])
      }
    },
    _ => unreachable!()
  }
 
  // Receive a synchronous call from the function.
  match socket.receive_message().await{
    Ok((qmsg_type::synchronous, message)) => {
      println!("synchronous call: {}", message);
      let list=message.as_vec::<K>().unwrap();
      if list[0].get_symbol().unwrap() == "nonsense"{
        let res=nonsense(list[1].get_long().unwrap(), list[2].get_long().unwrap());
        // Send bach a response.
        socket.send_message(&K::new_long(res), qmsg_type::response).await?;
      }
    },
    _ => unreachable!()
  }
 
  // Receive a final result.
  match socket.receive_message().await{
    Ok((qmsg_type::response, message)) => {
      println!("final: {}", message);
    },
    _ => unreachable!()
  }
 
  Ok(())
 
}

Constants

Used to send a message to q/kdb+ asynchronously.

Used by q/kdb+ to identify a response for a synchronous query.

Used to send a message to q/kdb+ synchronously.