diff --git a/lib/modules/Sql.pmod/rsql.pike b/lib/modules/Sql.pmod/rsql.pike index aaedb0a2a5962af7903f9c232c18a4888fb633cd..f2c1b9b7989fa74e15eabeaed5f1d848f3ce10cd 100644 --- a/lib/modules/Sql.pmod/rsql.pike +++ b/lib/modules/Sql.pmod/rsql.pike @@ -187,59 +187,82 @@ string quote(string s) return do_request('q'); } -int|object big_query(object|string q, mapping(string|int:mixed)|void bindings) +protected class RemoteResult(protected function(int,mixed:mixed) do_request, + protected mixed qid) { - if(bindings) - q=.sql_util.emulate_bindings(q,bindings,this); + void destroy() + { + do_request('Z', qid); + } - mixed qid = do_request('Q', q); - return qid && class { + int|array(string|int) fetch_row() + { + return do_request('R', qid); + } - protected function(int,mixed:mixed) do_request; - protected mixed qid; + array(mapping(string:mixed)) fetch_fields() + { + return do_request('F', qid); + } - void destroy() - { - do_request('Z', qid); - } + int num_rows() + { + return do_request('N', qid); + } - int|array(string|int) fetch_row() - { - return do_request('R', qid); - } + int num_fields() + { + return do_request('n', qid); + } - array(mapping(string:mixed)) fetch_fields() - { - return do_request('F', qid); - } + int eof() + { + return do_request('e', qid); + } - int num_rows() - { - return do_request('N', qid); - } + void seek(int skip) + { + do_request('S', ({qid,skip})); + } +} - int num_fields() - { - return do_request('n', qid); - } +int|object big_query(object|string q, mapping(string|int:mixed)|void bindings) +{ + if(bindings) + q=.sql_util.emulate_bindings(q,bindings,this); - int eof() - { - return do_request('e', qid); - } + mixed qid = do_request('Q', q); + return qid && RemoteResult(do_request, qid); +} - void seek(int skip) - { - do_request('S', ({qid,skip})); - } +int|object big_typed_query(object|string q, + mapping(string|int:mixed)|void bindings) +{ + if(bindings) + q=.sql_util.emulate_bindings(q,bindings,this); - void create(function(int,mixed:mixed) d_r, mixed i) - { - do_request = d_r; - qid = i; - } + mixed qid = do_request('Q', ({ "big_typed_query", q })); + return qid && RemoteResult(do_request, qid); +} + +int|object streaming_query(object|string q, + mapping(string|int:mixed)|void bindings) +{ + if(bindings) + q=.sql_util.emulate_bindings(q,bindings,this); + + mixed qid = do_request('Q', ({ "streaming_query", q })); + return qid && RemoteResult(do_request, qid); +} + +int|object streaming_typed_query(object|string q, + mapping(string|int:mixed)|void bindings) +{ + if(bindings) + q=.sql_util.emulate_bindings(q,bindings,this); - }(do_request, qid); + mixed qid = do_request('Q', ({ "streaming_typed_query", q })); + return qid && RemoteResult(do_request, qid); } array(mapping(string:mixed)) query(mixed ... args) diff --git a/lib/modules/Tools.pmod/Standalone.pmod/rsqld.pike b/lib/modules/Tools.pmod/Standalone.pmod/rsqld.pike index b8d00ecef5dde1ff1b7f8f10c702946acc78ac03..55d55a3ae934c74f277bcffe0ac8461d722be6f5 100644 --- a/lib/modules/Tools.pmod/Standalone.pmod/rsqld.pike +++ b/lib/modules/Tools.pmod/Standalone.pmod/rsqld.pike @@ -212,9 +212,14 @@ class Connection return sprintf("%4c%4c", qbase, qid++); } - protected string cmd_bigquery(string q) + protected string cmd_bigquery(string|array(string) q) { - object res = sqlobj->big_query(q); + object res; + if (arrayp(q)) { + res = predef::`->(sqlobj, q[0])(@q[1..]); + } else { + res = sqlobj->big_query(q); + } if(!res) return 0; string qid = make_id();