]> andersk Git - moira.git/commitdiff
Move max_row_count into do_for_all_rows so that we can stop fetching data
authordanw <danw>
Sat, 30 May 1998 18:17:21 +0000 (18:17 +0000)
committerdanw <danw>
Sat, 30 May 1998 18:17:21 +0000 (18:17 +0000)
as soon as we've decided there's too much. (Otherwise the server can suck
up huge amounts of memory.)

server/mr_scall.c
server/qrtn.pc

index b3d3f2c4ecb4df5887fa4d4c3c3beb2e8ea04b99..4a800efb39686a92f6bbb99a871bb60fb9d68e61 100644 (file)
@@ -40,9 +40,6 @@ void do_retr(client *cl, mr_params req);
 void do_access(client *cl, mr_params req);
 void get_motd(client *cl);
 
-/* Put this in a variable so that we can patch it if necessary */
-int max_row_count = 4096;
-
 char *procnames[] = {
   "noop",
   "auth",
@@ -139,12 +136,6 @@ void client_return_tuple(client *cl, int argc, char **argv)
   if (cl->done || dbms_errno)
     return;
 
-  if (cl->ntuples == max_row_count)
-    {
-      dbms_errno = mr_errcode = MR_NO_MEM;
-      return;
-    }
-
   if (cl->ntuples == cl->tuplessize - 1)
     {
       int newsize = (cl->tuplessize + 4) * 2;
@@ -220,12 +211,6 @@ void do_retr(client *cl, mr_params req)
 
   client_reply(cl, status);
 
-  if (cl->ntuples >= max_row_count)
-    {
-      critical_alert("moirad", "attempted query %s with too many rows\n",
-                    queryname);
-    }
-
   com_err(whoami, 0, "Query complete.");
 }
 
index 303bdc8f1c8d393830d8ad27e8f3de9e17cb4590..912a8cf1a2a60e2ac28c6205843012b371eb0423 100644 (file)
@@ -41,6 +41,9 @@ EXEC SQL END DECLARE SECTION;
 extern char *whoami;
 extern FILE *journal;
 
+/* Put this in a variable so that we can patch it if necessary */
+int max_row_count = 4096;
+
 int mr_verify_query(client *cl, struct query *q, int argc, char *argv_ro[]);
 int do_retrieve(struct query *q, char *pqual,
                int (*action)(int, char *[], void *), void *actarg);
@@ -216,6 +219,15 @@ int mr_process_query(client *cl, char *name, int argc, char *argv_ro[],
              status = do_retrieve(q, qual, sq_save_args, sq);
              if (status != MR_SUCCESS)
                {
+                 char **argv;
+                 int i;
+
+                 while (sq_get_data(sq, &argv))
+                   {
+                     for (i = 0; i < q->vcnt; i++)
+                       free(argv[i]);
+                     free(argv);
+                   }
                  sq_destroy(sq);
                  break;
                }
@@ -944,7 +956,7 @@ int do_for_all_rows(char *query, int count,
       mr_sqlda->L[i] = MAX_FIELD_WIDTH;
     }
 
-  while (1)
+  while (rowcount < max_row_count)
     {
       EXEC SQL FETCH curs USING DESCRIPTOR mr_sqlda;
       if (sqlca.sqlcode)
@@ -956,7 +968,15 @@ int do_for_all_rows(char *query, int count,
 
   if (mr_errcode)
     return mr_errcode;
-  return (rowcount == 0) ? MR_NO_MATCH : MR_SUCCESS;
+  if (rowcount == max_row_count)
+    {
+      critical_alert("moirad", "attempted query with too many rows");
+      return MR_NO_MEM;
+    }
+  else if (rowcount == 0)
+    return MR_NO_MATCH;
+  else
+    return MR_SUCCESS;
 }
 
 
This page took 0.078554 seconds and 5 git commands to generate.