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