use crate::easycodec::*;
use crate::sim_context::*;
const CONTRACT_METHOD_EXECUTE_QUERY_SQL: &str = "ExecuteQuery"; const CONTRACT_METHOD_EXECUTE_QUERY_ONE: &str = "ExecuteQueryOne"; const CONTRACT_METHOD_EXECUTE_QUERY_ONE_LEN: &str = "ExecuteQueryOneLen"; const CONTRACT_METHOD_ITERATOR_NEXT: &str = "RSNext"; const CONTRACT_METHOD_ITERATOR_NEXT_LEN: &str = "RSNextLen"; const CONTRACT_METHOD_ITERATOR_HAS_NEXT: &str = "RSHasNext"; const CONTRACT_METHOD_ITERATOR_CLOSE: &str = "RSClose"; const CONTRACT_METHOD_EXECUTE_UPDATE_SQL: &str = "ExecuteUpdate"; const CONTRACT_METHOD_EXECUTE_DDL_SQL: &str = "ExecuteDDL";
pub trait ResultSet {
fn next_row(&self) -> Result<EasyCodec, result_code>;
fn has_next(&self) -> bool;
fn close(&self) -> bool;
}
pub struct ResultSetSqlImpl {
pub common: CommonUtils,
pub index: i32,
}
pub struct SqlSimContextImpl {
pub common: CommonUtils,
}
pub trait SqlSimContext {
fn execute_query_one(&self, sql: &str) -> Result<EasyCodec, result_code>;
fn execute_query(&self, sql: &str) -> Result<Box<dyn ResultSet>, result_code>;
fn execute_update(&self, sql: &str) -> Result<i32, result_code>;
fn execute_ddl(&self, sql: &str) -> Result<i32, result_code>;
}
impl SqlSimContext for SqlSimContextImpl {
fn execute_query(&self, sql: &str) -> Result<Box<dyn ResultSet>, result_code> {
let ec = &mut EasyCodec::new();
ec.add_string("sql", sql);
let r = self
.common
.get_i32_from_chain(ec, CONTRACT_METHOD_EXECUTE_QUERY_SQL);
let index = match r {
Ok(index) => index,
Err(code) => {
return Err(code);
}
};
let rs = ResultSetSqlImpl::new(self.common.ctx_ptr, index);
Ok(Box::new(rs))
}
fn execute_query_one(&self, sql: &str) -> Result<EasyCodec, result_code> {
let ec = &mut EasyCodec::new();
ec.add_string("sql", sql);
let r = self.common.get_bytes_from_chain(
ec,
CONTRACT_METHOD_EXECUTE_QUERY_ONE_LEN,
CONTRACT_METHOD_EXECUTE_QUERY_ONE,
);
match r {
Ok(bytes) => return Ok(EasyCodec::new_with_bytes(&bytes)),
Err(code) => return Err(code),
}
}
fn execute_update(&self, sql: &str) -> Result<i32, result_code> {
let ec = &mut EasyCodec::new();
ec.add_string("sql", sql);
self.common
.get_i32_from_chain(ec, CONTRACT_METHOD_EXECUTE_UPDATE_SQL)
}
fn execute_ddl(&self, sql: &str) -> Result<i32, result_code> {
let ec = &mut EasyCodec::new();
ec.add_string("sql", sql);
self.common
.get_i32_from_chain(ec, CONTRACT_METHOD_EXECUTE_DDL_SQL)
}
}
impl SqlSimContextImpl {
pub fn new(ctx_ptr: i32) -> SqlSimContextImpl {
SqlSimContextImpl {
common: CommonUtils { ctx_ptr },
}
}
}
impl ResultSetSqlImpl {
pub fn new(ctx_ptr: i32, index: i32) -> ResultSetSqlImpl {
ResultSetSqlImpl {
common: CommonUtils { ctx_ptr },
index,
}
}
}
impl ResultSet for ResultSetSqlImpl {
fn next_row(&self) -> Result<EasyCodec, result_code> {
let ec = &mut EasyCodec::new();
ec.add_i32("rs_index", self.index);
let r = self.common.get_bytes_from_chain(
ec,
CONTRACT_METHOD_ITERATOR_NEXT_LEN,
CONTRACT_METHOD_ITERATOR_NEXT,
);
match r {
Ok(data) => return Ok(EasyCodec::unmarshal(&data)),
Err(code) => return Err(code),
}
}
fn has_next(&self) -> bool {
let ec = &mut EasyCodec::new();
ec.add_i32("rs_index", self.index);
let r = self
.common
.get_i32_from_chain(ec, CONTRACT_METHOD_ITERATOR_HAS_NEXT);
match r {
Ok(state) => {
if state == 0 {
return false;
} else {
return true;
}
}
_ => false,
}
}
fn close(&self) -> bool {
let ec = &mut EasyCodec::new();
ec.add_i32("rs_index", self.index);
let r = self
.common
.get_i32_from_chain(ec, CONTRACT_METHOD_ITERATOR_CLOSE);
match r {
Ok(_) => true,
_ => false,
}
}
}