From 2d602246a1b0114225c85210ae7efa019cb88fa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?= <grubba@grubba.org> Date: Wed, 22 May 2013 15:46:54 +0200 Subject: [PATCH] Sql.rsql: Implemented support for all big_query() variants. This implements support for big_typed_query(), streaming_query() and streaming_typed_query(). --- lib/modules/Sql.pmod/rsql.pike | 105 +++++++++++------- .../Tools.pmod/Standalone.pmod/rsqld.pike | 9 +- 2 files changed, 71 insertions(+), 43 deletions(-) diff --git a/lib/modules/Sql.pmod/rsql.pike b/lib/modules/Sql.pmod/rsql.pike index aaedb0a2a5..f2c1b9b798 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 b8d00ecef5..55d55a3ae9 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(); -- GitLab