@@ -1452,6 +1452,39 @@ fn execute_portal_bytes(portal_name : BytesView, max_rows : Int) -> Bytes raise
14521452 buf.to_bytes()
14531453}
14541454
1455+ ///|
1456+ priv struct EncodedParam {
1457+ format : Int
1458+ value : Bytes?
1459+ }
1460+
1461+ ///|
1462+ fn encode_param(param : &ToSql , type_ : Type ) -> EncodedParam raise {
1463+ guard param.accepts(type_) else {
1464+ raise wrong_type_error(param.moonbit_type_name(), type_)
1465+ }
1466+ let payload = @buffer.new()
1467+ let value = match param.to_sql(type_, payload) {
1468+ @proto.IsNull ::Yes => None
1469+ @proto.IsNull ::No => Some (payload.to_bytes())
1470+ }
1471+ { format: param.format(type_), value }
1472+ }
1473+
1474+ ///|
1475+ fn write_encoded_param(
1476+ param : EncodedParam ,
1477+ payload : @buffer.Buffer ,
1478+ ) -> @proto.IsNull {
1479+ match param.value {
1480+ None => @proto.IsNull ::Yes
1481+ Some (bytes) => {
1482+ payload.write_bytes(bytes)
1483+ @proto.IsNull ::No
1484+ }
1485+ }
1486+ }
1487+
14551488///|
14561489fn write_bind(
14571490 buf : @buffer.Buffer ,
@@ -1461,14 +1494,17 @@ fn write_bind(
14611494 params : Array [&ToSql ],
14621495 describe_portal : Bool ,
14631496) -> Unit raise {
1464- let formats = params.mapi((index, param) => param.format(param_types[index]))
1465- let values = params.mapi((index, param) => (param, param_types[index]))
1497+ let encoded_params : Array [EncodedParam ] = []
1498+ for index, param in params {
1499+ encoded_params.push(encode_param(param, param_types[index]))
1500+ }
1501+ let formats = encoded_params.map(param => param.format)
14661502 @frontend.bind(
14671503 portal,
14681504 statement,
14691505 formats.iter(),
1470- values .iter(),
1471- (pair , payload) => serialize_param(pair.0, pair.1 , payload),
1506+ encoded_params .iter(),
1507+ (param , payload) => write_encoded_param(param , payload),
14721508 [1].iter(),
14731509 buf,
14741510 )
@@ -1691,17 +1727,6 @@ fn join_clauses(clauses : Array[String]) -> String {
16911727 out
16921728}
16931729
1694- ///|
1695- fn serialize_param(
1696- param : &ToSql ,
1697- type_ : Type ,
1698- payload : @buffer.Buffer ,
1699- ) -> @proto.IsNull raise @proto.ProtocolError {
1700- param.to_sql(type_, payload) catch {
1701- err => raise @proto.ProtocolError ::InvalidInput (err.to_string())
1702- }
1703- }
1704-
17051730///|
17061731async fn connect_stream(config : Config ) -> Stream {
17071732 let conn = @socket.Tcp ::connect_to_host(config.host, port=config.port)
0 commit comments