[1830] in Moira Commits

home help back first fref pref prev next nref lref last post

/svn/moira r3977 - in trunk/moira: . clients/eunice clients/moira db include server

daemon@ATHENA.MIT.EDU (Garry Zacheiss)
Fri Feb 12 16:12:11 2010

Date: Fri, 12 Feb 2010 16:12:04 -0500
From: Garry Zacheiss <zacheiss@MIT.EDU>
Message-Id: <201002122112.o1CLC4sL026934@drugstore.mit.edu>
To: moira-commits@mit.edu
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Author: zacheiss
Date: 2010-02-12 16:12:04 -0500 (Fri, 12 Feb 2010)
New Revision: 3977

Modified:
   trunk/moira/clients/eunice/eunice.c
   trunk/moira/clients/moira/defs.h
   trunk/moira/clients/moira/printer.c
   trunk/moira/db/schema.sql
   trunk/moira/include/moira_site.h
   trunk/moira/libtool
   trunk/moira/server/qaccess.pc
   trunk/moira/server/qsetup.pc
   trunk/moira/server/queries2.c
Log:
Add new fields to printers table: booleans for duplex by default, hold jobs by default; status a la machine table; list name for receiving usage reports.

Modified: trunk/moira/clients/eunice/eunice.c
===================================================================
--- trunk/moira/clients/eunice/eunice.c	2010-02-09 19:30:24 UTC (rev 3976)
+++ trunk/moira/clients/eunice/eunice.c	2010-02-12 21:12:04 UTC (rev 3977)
@@ -38,11 +38,11 @@
 #define argis(a, b) (!strcmp(*arg + 1, a) || !strcmp(*arg + 1, b))
 
 /* flags from command line */
-int info_flag, verbose, noauth;
+int info_flag, verbose, noauth, duplex_default, hold_default;
 int create_flag, setmac, delete_flag, rename_flag, ka, banner, update_flag;
-char *lpracl, *lpcacl;
+char *lpracl, *lpcacl, *report_list;
 char *contact, *newname, *printserver, *type, *hwtype, *mac, *hostname, *queuename;
-char *duplexname, *logserver, *location, *realname;
+char *duplexname, *logserver, *location, *realname, *pr_status;
 
 char *queuename, *whoami, *testqueue;
 
@@ -57,6 +57,25 @@
 void print_query(char *query_name, int argc, char **argv);
 int CountArgs(char **info);
 
+static char *states[] = {
+  "Reserved (0)",
+  "Active (1)",
+  "None (2)",
+  "Deleted (3)"
+};
+
+static char *PrnState(int state)
+{
+  static char buf[BUFSIZ];
+  
+  if (state < 0 || state > 3)
+    {
+      sprintf(buf, "Unknown (%d)", state);
+      return buf;
+    }
+  return states[state];
+}
+
 int main(int argc, char **argv)
 {
   int status, success;
@@ -70,8 +89,9 @@
 
   /* clear all flags & lists */
   i = info_flag = verbose = noauth = 0;
-  setmac = ka = create_flag = delete_flag = update_flag = 0;
-  location = lpracl = lpcacl = NULL;
+  setmac = create_flag = delete_flag = update_flag = 0;
+  ka = duplex_default = hold_default = banner = -1;
+  location = lpracl = lpcacl = report_list = pr_status = NULL;
   logserver = duplexname = realname = newname = printserver = type = hwtype = mac = hostname = NULL;
 
 
@@ -146,9 +166,29 @@
 	      else
 		usage(argv);
 	    }
+          else if (argis("S", "status"))
+	    {
+	      if (arg - argv < argc - 1) {
+		int i;
+		int len;
+		
+		arg++;
+		update_flag++;
+		pr_status = *arg;
+		
+		len = strlen(pr_status);
+		for(i = 0; i < len; i++) {
+		  if(!isdigit(pr_status[i])) {
+		    printf("Error: status code %s is not numeric.\n", pr_status);
+		    exit(1);
+		  }
+		}
+	      } else
+		usage(argv);
+	    }
 	  else if (argis("K", "kerbauth")) 
  	    {
-	      ka++;
+	      ka = 1;
   	      update_flag++;
  	    }
 	  else if (argis("NK", "nokerbauth"))
@@ -156,6 +196,26 @@
 	      ka = 0;
   	      update_flag++;
  	    }
+	  else if (argis("DD", "duplexdefault"))
+	    {
+	      duplex_default = 1;
+	      update_flag++;
+	    }
+	  else if (argis("ND", "noduplexdefault"))
+	    {
+	      duplex_default = 0;
+	      update_flag++;
+	    }
+	  else if (argis("HD", "holddefault"))
+	    {
+	      hold_default = 1;
+	      update_flag++;
+	    }
+	  else if (argis("NH", "noholddefault"))
+	    {
+	      hold_default = 0;
+	      update_flag++;
+	    }
 	  else if (argis("H", "hostname"))
 	    {
 	      if (arg - argv < argc - 1)
@@ -214,6 +274,17 @@
 	      else
 		usage(argv);
 	    }
+	  else if (argis("rl", "reportlist"))
+	    {
+	      if (arg - argv < argc - 1)
+		{
+		  ++arg;
+		  report_list = *arg;
+		  update_flag++;
+		}
+	      else
+		usage(argv);
+	    }
 	  else if (argis("m", "mac"))
 	    {
 	      if (arg - argv < argc - 1)
@@ -285,7 +356,7 @@
     info_flag++;
 
   /* fire up Moira */
-  status = mrcl_connect(server, "eunice", 10, !noauth);
+  status = mrcl_connect(server, "eunice", 13, !noauth);
   if (status == MRCL_AUTH_ERROR)
     {
       com_err(whoami, 0, "Authentication error while working on queue %s",
@@ -354,6 +425,14 @@
 
       pargv[PRN_DUPLEXNAME] = (duplexname != NULL) ? duplexname : "";
 
+      pargv[PRN_DUPLEXDEFAULT] = (duplex_default == 1) ? "1" : "0";
+      pargv[PRN_HOLDDEFAULT] = (hold_default == 1) ? "1" : "0";
+
+      if (pr_status)
+	pargv[PRN_STATUS] = pr_status;
+      else
+	pargv[PRN_STATUS] = "1";
+
       pargv[PRN_HOSTNAME] = hostname;
       pargv[PRN_LOGHOST] = logserver;
 
@@ -396,6 +475,20 @@
       else
         pargv[PRN_LPC_ACL] = "[none]";
 
+      if (report_list != NULL)
+        {
+          status = wrap_mr_query("get_list_info", 1, &report_list,
+				 NULL, NULL);
+          if (status)
+            {
+	      com_err(whoami, status, "while getting authentication list information");
+	      exit(1);
+            }
+          pargv[PRN_REPORT_LIST] = report_list;
+        }
+      else
+        pargv[PRN_REPORT_LIST] = "[none]";
+
       pargv[PRN_BANNER] = (banner == 1) ? "1" : "0";
 
       status = wrap_mr_query("add_printer", CountArgs(pargv), pargv, NULL, NULL); 
@@ -429,6 +522,15 @@
       if (duplexname != NULL)
 	pargv[PRN_DUPLEXNAME + 1] = duplexname;
 
+      if (duplex_default != -1)
+	pargv[PRN_DUPLEXDEFAULT + 1] = duplex_default ? "1" : "0";
+
+      if (hold_default != -1)
+	pargv[PRN_HOLDDEFAULT + 1] = hold_default ? "1" : "0";
+
+      if (pr_status != NULL)
+	pargv[PRN_STATUS + 1] = pr_status;
+
       if (hostname != NULL)
 	pargv[PRN_HOSTNAME + 1] = hostname;
 
@@ -450,6 +552,8 @@
 	pargv[PRN_AC + 1] = lpracl;
       if (lpcacl != NULL)
 	pargv[PRN_LPC_ACL + 1] = lpcacl;
+      if (report_list != NULL)
+	pargv[PRN_REPORT_LIST + 1] = report_list;
       if (banner != -1)
 	pargv[PRN_BANNER + 1] = banner ? "1" : "0";
       if (location != NULL)
@@ -536,8 +640,14 @@
 	  "-b   | -banner");
   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-NK | -nokerbauth",
 	  "-nb  | -nobanner");
+  fprintf(stderr, USAGE_OPTIONS_FORMAT, "-DD | -duplexdefault",
+	  "-HD | -holddefault");
+  fprintf(stderr, USAGE_OPTIONS_FORMAT, "-ND | -noduplexdefault",
+	  "-NH | -noholddefault");
+  fprintf(stderr, USAGE_OPTIONS_FORMAT, "-S | -status status",
+	  "-rl | -reportlist list");
   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-l  | -lpcacl list",
-	  "-ac  | -lpracl contact");
+	  "-ac  | -lpracl list");
   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-d  | -duplex name",
 	  "-n   | -noauth");
   fprintf(stderr, USAGE_OPTIONS_FORMAT, "-m  | -mac hwaddr", 
@@ -573,6 +683,10 @@
 
   printf("Printer: %-18s Duplex queue: %-18s\n", pargv[PRN_NAME + 1],
           *pargv[PRN_DUPLEXNAME + 1] ? pargv[PRN_DUPLEXNAME + 1] : "[none]");
+  printf("Status: %-10s\n", PrnState(atoi(pargv[PRN_STATUS + 1])));
+  printf("Duplex by Default: %-8s Hold by Default: %-18s\n",
+	 atoi(pargv[PRN_DUPLEXDEFAULT + 1]) ? "yes" : "no",
+	 atoi(pargv[PRN_HOLDDEFAULT + 1]) ? "yes" : "no");
   printf("Type: %-10s Hardware type: %-10s Hardware address: %s\n",
           pargv[PRN_TYPE + 1], pargv[PRN_HWTYPE + 1], hwaddr);
   printf("Printer hostname: %s\n", pargv[PRN_HOSTNAME + 1]);
@@ -584,6 +698,7 @@
           atoi(pargv[PRN_KA + 1]) ? "yes" : "no", pargv[PRN_PC + 1], pargv[PRN_RQ + 1]);
   printf("Restrict list: %-23s  LPC ACL: %-23s\n",
           pargv[PRN_AC + 1], pargv[PRN_LPC_ACL + 1]);
+  printf("Report list: %-23s\n", pargv[PRN_REPORT_LIST + 1]);
   printf("Location: %s\n", pargv[PRN_LOCATION + 1]);
   printf("Contact: %s\n", pargv[PRN_CONTACT + 1]);
   printf("\n");

Modified: trunk/moira/clients/moira/defs.h
===================================================================
--- trunk/moira/clients/moira/defs.h	2010-02-09 19:30:24 UTC (rev 3976)
+++ trunk/moira/clients/moira/defs.h	2010-02-12 21:12:04 UTC (rev 3977)
@@ -50,7 +50,7 @@
 
 /* What version of the queries are we asking for? */
 
-#define QUERY_VERSION 12
+#define QUERY_VERSION 13
 
 /* This is unimplemented in the menu stuff, but would be nice. */
 

Modified: trunk/moira/clients/moira/printer.c
===================================================================
--- trunk/moira/clients/moira/printer.c	2010-02-09 19:30:24 UTC (rev 3976)
+++ trunk/moira/clients/moira/printer.c	2010-02-12 21:12:04 UTC (rev 3977)
@@ -44,6 +44,25 @@
 
 #define DEFAULT_LOGHOST "WSLOGGER.MIT.EDU"
 
+static char *states[] = {
+  "Reserved (0)",
+  "Active (1)",
+  "None (2)",
+  "Deleted (3)"
+};
+
+static char *PrnState(int state)
+{
+  static char buf[BUFSIZ];
+
+  if (state < 0 || state > 3)
+    {
+      sprintf(buf, "Unknown (%d)", state);
+      return buf;
+    }
+  return states[state];
+}
+
 int StoreHWAddr(int argc, char **argv, void *retval)
 {
   char **p = retval;
@@ -63,6 +82,9 @@
   info[PRN_TYPE] = strdup("PRIVATE");
   info[PRN_HWTYPE] = strdup("HP");
   info[PRN_DUPLEXNAME] = strdup("");
+  info[PRN_DUPLEXDEFAULT] = strdup("0");
+  info[PRN_HOLDDEFAULT] = strdup("0");
+  info[PRN_STATUS] = strdup("1");
   info[PRN_HOSTNAME] = strdup(name);
   info[PRN_LOGHOST] = strdup(DEFAULT_LOGHOST);
   info[PRN_RM] = strdup("[ANY]");
@@ -72,6 +94,7 @@
   info[PRN_PC] = strdup("10");
   info[PRN_AC] = strdup("[none]");
   info[PRN_LPC_ACL] = strdup("[none]");
+  info[PRN_REPORT_LIST] = strdup("[none]");
   info[PRN_BANNER] = strdup("1");
   info[PRN_LOCATION] = strdup("");
   info[PRN_CONTACT] = strdup("");
@@ -157,6 +180,12 @@
   sprintf(buf, "Printer: %-18s Duplex queue: %-18s", info[PRN_NAME],
 	  *info[PRN_DUPLEXNAME] ? info[PRN_DUPLEXNAME] : "[none]");
   Put_message(buf);
+  sprintf(buf, "Status: %-10s", PrnState(atoi(info[PRN_STATUS])));
+  Put_message(buf);
+  sprintf(buf, "Duplex by Default: %-8s Hold by Default: %-18s", 
+	  atoi(info[PRN_DUPLEXDEFAULT]) ? "yes" : "no",
+	  atoi(info[PRN_HOLDDEFAULT]) ? "yes" : "no");
+  Put_message(buf);
   sprintf(buf, "Type: %-10s Hardware type: %-10s Hardware address: ",
 	  info[PRN_TYPE], info[PRN_HWTYPE]);
   status = do_mr_query("get_host_hwaddr", 1, &info[PRN_HOSTNAME],
@@ -184,6 +213,8 @@
   sprintf(buf, "Restrict list: %-23s  LPC ACL: %-23s",
 	  info[PRN_AC], info[PRN_LPC_ACL]);
   Put_message(buf);
+  sprintf(buf, "Report list: %-23s", info[PRN_REPORT_LIST]);
+  Put_message(buf);
   sprintf(buf, "Location: %s", info[PRN_LOCATION]);
   Put_message(buf);
   sprintf(buf, "Contact: %s", info[PRN_CONTACT]);
@@ -235,6 +266,24 @@
   if (GetValueFromUser("Duplex spool name", &info[PRN_DUPLEXNAME]) ==
       SUB_ERROR)
     return NULL;
+  if (GetYesNoValueFromUser("Print duplex by default", &info[PRN_DUPLEXDEFAULT]) ==
+      SUB_ERROR)
+    return NULL;
+  if (GetYesNoValueFromUser("Hold jobs by default", &info[PRN_HOLDDEFAULT]) ==
+      SUB_ERROR)
+    return NULL;
+  while (1)
+    {
+      int i;
+      if (GetValueFromUser("Printer's status (? for help)",
+			   &info[PRN_STATUS]) == SUB_ERROR)
+	return NULL;
+      if (isdigit(info[PRN_STATUS][0]))
+	break;
+      Put_message("Valid status numbers:");
+      for (i = 0; i < 4; i++)
+	Put_message(states[i]);
+    }
   if (GetValueFromUser("Printer hostname (or [none])", &info[PRN_HOSTNAME]) ==
       SUB_ERROR)
     return NULL;
@@ -268,6 +317,8 @@
     }
   if (GetValueFromUser("LPC ACL", &info[PRN_LPC_ACL]) == SUB_ERROR)
     return NULL;
+  if (GetValueFromUser("Report list", &info[PRN_REPORT_LIST]) == SUB_ERROR)
+    return NULL;
   if (GetYesNoValueFromUser("Banner page", &info[PRN_BANNER]) == SUB_ERROR)
     return NULL;
   if (GetValueFromUser("Location", &info[PRN_LOCATION]) == SUB_ERROR)

Modified: trunk/moira/db/schema.sql
===================================================================
--- trunk/moira/db/schema.sql	2010-02-09 19:30:24 UTC (rev 3976)
+++ trunk/moira/db/schema.sql	2010-02-12 21:12:04 UTC (rev 3977)
@@ -331,6 +331,9 @@
 	type		VARCHAR(8)	DEFAULT CHR(0)	NOT NULL,
 	hwtype		VARCHAR(64)	DEFAULT CHR(0)	NOT NULL,
 	duplexname	VARCHAR(16) 	DEFAULT CHR(0)	NOT NULL,
+	duplexdefault	INTEGER		DEFAULT 0	NOT NULL,
+	holddefault	INTEGER		DEFAULT 0	NOT NULL,
+	status		INTEGER		DEFAULT 0	NOT NULL,
 	mach_id		INTEGER		DEFAULT 0	NOT NULL,
 	loghost		INTEGER		DEFAULT 0	NOT NULL,
 	rm		INTEGER		DEFAULT 0	NOT NULL,
@@ -341,6 +344,7 @@
 	mc		SMALLINT	DEFAULT 0	NOT NULL,
 	ac		INTEGER		DEFAULT 0	NOT NULL,
 	lpc_acl		INTEGER		DEFAULT 0	NOT NULL,
+	report_list	INTEGER		DEFAULT	0	NOT NULL,
 	banner		INTEGER		DEFAULT 0	NOT NULL,
 	location	VARCHAR(64)	DEFAULT CHR(0)	NOT NULL,
 	contact		VARCHAR(64)	DEFAULT CHR(0)	NOT NULL,

Modified: trunk/moira/include/moira_site.h
===================================================================
--- trunk/moira/include/moira_site.h	2010-02-09 19:30:24 UTC (rev 3976)
+++ trunk/moira/include/moira_site.h	2010-02-12 21:12:04 UTC (rev 3977)
@@ -206,26 +206,30 @@
 
 /* Printer queries */
 
-#define PRN_NAME	0
-#define PRN_TYPE	1
-#define PRN_HWTYPE	2
-#define PRN_DUPLEXNAME	3
-#define PRN_HOSTNAME	4
-#define PRN_LOGHOST	5
-#define PRN_RM		6
-#define PRN_RP		7
-#define PRN_RQ		8
-#define PRN_KA		9
-#define PRN_PC		10
-#define PRN_AC		11
-#define PRN_LPC_ACL	12
-#define PRN_BANNER	13
-#define PRN_LOCATION	14
-#define PRN_CONTACT	15
-#define PRN_MODTIME	16
-#define PRN_MODBY	17
-#define PRN_MODWITH	18
-#define PRN_END		19
+#define PRN_NAME		0
+#define PRN_TYPE		1
+#define PRN_HWTYPE		2
+#define PRN_DUPLEXNAME		3
+#define PRN_DUPLEXDEFAULT 	4
+#define PRN_HOLDDEFAULT 	5
+#define PRN_STATUS      	6
+#define PRN_HOSTNAME		7
+#define PRN_LOGHOST		8
+#define PRN_RM			9
+#define PRN_RP			10
+#define PRN_RQ			11
+#define PRN_KA			12
+#define PRN_PC			13
+#define PRN_AC			14
+#define PRN_LPC_ACL		15
+#define PRN_REPORT_LIST		16
+#define PRN_BANNER		17
+#define PRN_LOCATION		18
+#define PRN_CONTACT		19
+#define PRN_MODTIME		20
+#define PRN_MODBY		21
+#define PRN_MODWITH		22
+#define PRN_END			23
 
 #define PRN_BANNER_NONE  0
 #define PRN_BANNER_FIRST 1

Modified: trunk/moira/libtool
===================================================================
--- trunk/moira/libtool	2010-02-09 19:30:24 UTC (rev 3976)
+++ trunk/moira/libtool	2010-02-12 21:12:04 UTC (rev 3977)
@@ -44,7 +44,7 @@
 
 # ### BEGIN LIBTOOL CONFIG
 
-# Libtool was configured on host wrong-tool.mit.edu:
+# Libtool was configured on host this-too-shall-pass.mit.edu:
 
 # Shell to use when invoking shell scripts.
 SHELL="/bin/sh"
@@ -6769,7 +6769,7 @@
 # End:
 # ### BEGIN LIBTOOL TAG CONFIG: CXX
 
-# Libtool was configured on host wrong-tool.mit.edu:
+# Libtool was configured on host this-too-shall-pass.mit.edu:
 
 # Shell to use when invoking shell scripts.
 SHELL="/bin/sh"
@@ -7065,7 +7065,7 @@
 
 # ### BEGIN LIBTOOL TAG CONFIG: F77
 
-# Libtool was configured on host wrong-tool.mit.edu:
+# Libtool was configured on host this-too-shall-pass.mit.edu:
 
 # Shell to use when invoking shell scripts.
 SHELL="/bin/sh"

Modified: trunk/moira/server/qaccess.pc
===================================================================
--- trunk/moira/server/qaccess.pc	2010-02-09 19:30:24 UTC (rev 3976)
+++ trunk/moira/server/qaccess.pc	2010-02-12 21:12:04 UTC (rev 3977)
@@ -704,9 +704,19 @@
   char type[PRINTSERVERS_OWNER_TYPE_SIZE];
   int id, mach_id;
   EXEC SQL END DECLARE SECTION;
-  int status;
+  int status, row;
 
-  mach_id = *(int *)argv[PRN_RM];
+  /* Check for aprn or uprn. */
+  if (q->type == MR_Q_APPEND)
+    row = 0;
+  else
+    row = 1;
+
+  if (q->version < 13)
+    mach_id = *(int *)argv[6 + row];
+  else
+    mach_id = *(int *)argv[PRN_RM + row];
+
   EXEC SQL SELECT owner_type, owner_id INTO :type, :id
     FROM printservers WHERE mach_id = :mach_id;
   if (sqlca.sqlcode)

Modified: trunk/moira/server/qsetup.pc
===================================================================
--- trunk/moira/server/qsetup.pc	2010-02-09 19:30:24 UTC (rev 3976)
+++ trunk/moira/server/qsetup.pc	2010-02-12 21:12:04 UTC (rev 3977)
@@ -1328,7 +1328,7 @@
  */
 int setup_aprn(struct query *q, char **argv, client *cl)
 {
-  int best = -1, row;
+  int best = -1, row, idx = 0;
   char *p;
   EXEC SQL BEGIN DECLARE SECTION;
   int mid, usage, count;
@@ -1341,6 +1341,9 @@
   else
     row = 1;
 
+  if (q->version < 13)
+    idx = 3;
+
   name = argv[PRN_NAME + row];
   duplexname = argv[PRN_DUPLEXNAME + row];
   oldname = argv[0];
@@ -1389,7 +1392,7 @@
   if (!strcmp(name, duplexname))
     return MR_NOT_UNIQUE;
 
-  mid = *(int *)argv[PRN_RM + row];
+  mid = *(int *)argv[PRN_RM + row + idx];
   if (mid == -1)
     {
       EXEC SQL DECLARE csr_rm CURSOR FOR
@@ -1420,7 +1423,7 @@
 		  if (best < 0 || usage < best)
 		    {
 		      best = usage;
-		      *(int *)argv[PRN_RM + row] = mid;
+		      *(int *)argv[PRN_RM + row + idx] = mid;
 		      break;
 		    }
 		}

Modified: trunk/moira/server/queries2.c
===================================================================
--- trunk/moira/server/queries2.c	2010-02-09 19:30:24 UTC (rev 3976)
+++ trunk/moira/server/queries2.c	2010-02-12 21:12:04 UTC (rev 3977)
@@ -3344,62 +3344,119 @@
   0,
 };
 
-static char *gprn_fields[] = {
+static char *gprn2_fields[] = {
   "name",
   "name", "type", "hwtype", "duplexname", "hostname",
   "loghost", "rm", "rp", "rq", "ka", "pc", "ac", "lpc_acl",
   "banner", "location", "contact", "modtime", "modby", "modwith"
 };
 
-static char *gpbd_fields[] = {
+static char *gpbd2_fields[] = {
   "duplexname",
   "name", "type", "hwtype", "duplexname", "hostname",
   "loghost", "rm", "rp", "rq", "ka", "pc", "ac", "lpc_acl",
   "banner", "location", "contact", "modtime", "modby", "modwith"
 };
 
-static char *gpbe_fields[] = {
+static char *gpbe2_fields[] = {
   "hwaddr",
   "name", "type", "hwtype", "duplexname", "hostname",
   "loghost", "rm", "rp", "rq", "ka", "pc", "ac", "lpc_acl",
   "banner", "location", "contact", "modtime", "modby", "modwith"
 };
 
-static char *gpbh_fields[] = {
+static char *gpbh2_fields[] = {
   "hostname",
   "name", "type", "hwtype", "duplexname", "hostname",
   "loghost", "rm", "rp", "rq", "ka", "pc", "ac", "lpc_acl",
   "banner", "location", "contact", "modtime", "modby", "modwith"
 };
 
-static char *gpbr_fields[] = {
+static char *gpbr2_fields[] = {
   "rm",
   "name", "type", "hwtype", "duplexname", "hostname",
   "loghost", "rm", "rp", "rq", "ka", "pc", "ac", "lpc_acl",
   "banner", "location", "contact", "modtime", "modby", "modwith"
 };
 
-static char *gpbl_fields[] = {
+static char *gpbl2_fields[] = {
   "location",
   "name", "type", "hwtype", "duplexname", "hostname",
   "loghost", "rm", "rp", "rq", "ka", "pc", "ac", "lpc_acl",
   "banner", "location", "contact", "modtime", "modby", "modwith"
 };
 
-static char *gpbc_fields[] = {
+static char *gpbc2_fields[] = {
   "contact",
   "name", "type", "hwtype", "duplexname", "hostname",
   "loghost", "rm", "rp", "rq", "ka", "pc", "ac", "lpc_acl",
   "banner", "location", "contact", "modtime", "modby", "modwith"
 };
 
-static char *aprn_fields[] = {
+static char *gprn_fields[] = {
+  "name",
+  "name", "type", "hwtype", "duplexname", "duplexdefault",
+  "holddefault", "status", "hostname", "loghost", "rm", "rp", 
+  "rq", "ka", "pc", "ac", "lpc_acl", "report_list",  "banner", 
+  "location", "contact", "modtime", "modby", "modwith"
+};
+
+static char *gpbd_fields[] = {
+  "duplexname",
+  "name", "type", "hwtype", "duplexname", "duplexdefault",
+  "holddefault", "status", "hostname", "loghost", "rm", "rp",
+  "rq", "ka", "pc", "ac", "lpc_acl", "report_list",  "banner",
+  "location", "contact", "modtime", "modby", "modwith"
+};
+
+static char *gpbe_fields[] = {
+  "hwaddr",
+  "name", "type", "hwtype", "duplexname", "duplexdefault",
+  "holddefault", "status", "hostname", "loghost", "rm", "rp",
+  "rq", "ka", "pc", "ac", "lpc_acl", "report_list",  "banner",
+  "location", "contact", "modtime", "modby", "modwith"
+};
+
+static char *gpbh_fields[] = {
+  "hostname",
+  "name", "type", "hwtype", "duplexname", "duplexdefault",
+  "holddefault", "status", "hostname", "loghost", "rm", "rp",
+  "rq", "ka", "pc", "ac", "lpc_acl", "report_list",  "banner",
+  "location", "contact", "modtime", "modby", "modwith"
+};
+
+static char *gpbr_fields[] = {
+  "rm",
+  "name", "type", "hwtype", "duplexname", "duplexdefault",
+  "holddefault", "status", "hostname", "loghost", "rm", "rp",
+  "rq", "ka", "pc", "ac", "lpc_acl", "report_list",  "banner",
+  "location", "contact", "modtime", "modby", "modwith"
+};
+
+static char *gpbl_fields[] = {
+  "location",
+  "name", "type", "hwtype", "duplexname", "duplexdefault",
+  "holddefault", "status", "hostname", "loghost", "rm", "rp",
+  "rq", "ka", "pc", "ac", "lpc_acl", "report_list",  "banner",
+  "location", "contact", "modtime", "modby", "modwith"
+
+};
+
+static char *gpbc_fields[] = {
+  "contact",
+  "name", "type", "hwtype", "duplexname", "duplexdefault",
+  "holddefault", "status", "hostname", "loghost", "rm", "rp",
+  "rq", "ka", "pc", "ac", "lpc_acl", "report_list",  "banner",
+  "location", "contact", "modtime", "modby", "modwith"
+};
+
+static char *aprn2_fields[] = {
   "printer", "type", "hwtype", "duplexname", "hostname",
   "loghost", "rm", "rp", "rq", "ka", "pc", "ac", "lpc_acl",
   "banner", "location", "contact",
 };
 
-static struct valobj aprn_valobj[] = {
+static struct valobj aprn2_valobj[] = {
   {V_CHAR, 0, PRINTERS_TABLE, "name"},
   {V_TYPE, 1, 0, "printertype", 0, MR_TYPE},
   {V_TYPE, 2, 0, "printerhwtype", 0, MR_TYPE},
@@ -3418,9 +3475,51 @@
   {V_CHAR, 15, PRINTERS_TABLE, "contact"},
 };
 
+static struct validate aprn2_validate = {
+  aprn2_valobj,
+  16,
+  "name",
+  "name = '%s'",
+  1,
+  0,
+  access_printer,
+  setup_aprn,
+  set_modtime,
+};
+
+static char *aprn_fields[] = {
+  "printer", "type", "hwtype", "duplexname", "duplexdefault",
+  "holddefault", "status", "hostname", "loghost", "rm", "rp",
+  "rq", "ka", "pc", "ac", "lpc_acl", "report_list", "banner",
+  "location", "contact",
+};
+
+static struct valobj aprn_valobj[] = {
+  {V_CHAR, 0, PRINTERS_TABLE, "name"},
+  {V_TYPE, 1, 0, "printertype", 0, MR_TYPE},
+  {V_TYPE, 2, 0, "printerhwtype", 0, MR_TYPE},
+  {V_CHAR, 3, PRINTERS_TABLE, "duplexname"},
+  {V_NUM, 4},
+  {V_NUM, 5},
+  {V_NUM, 6},
+  {V_ID, 7, MACHINE_TABLE, "name", "mach_id", MR_MACHINE},
+  {V_ID, 8, MACHINE_TABLE, "name", "mach_id", MR_MACHINE},
+  {V_ID, 9, MACHINE_TABLE, "name", "mach_id", MR_MACHINE},
+  {V_CHAR, 10, PRINTERS_TABLE, "rp"},
+  {V_ID, 11, MACHINE_TABLE, "name", "mach_id", MR_MACHINE},
+  {V_NUM, 12},
+  {V_NUM, 13},
+  {V_ID, 14, LIST_TABLE, "name", "list_id", MR_LIST},
+  {V_ID, 15, LIST_TABLE, "name", "list_id", MR_LIST},
+  {V_ID, 16, LIST_TABLE, "name", "list_id", MR_LIST},
+  {V_NUM, 17},
+  {V_CHAR, 18, PRINTERS_TABLE, "location"},
+  {V_CHAR, 19, PRINTERS_TABLE, "contact"},
+};
+
 static struct validate aprn_validate = {
   aprn_valobj,
-  16,
+  20,
   "name",
   "name = '%s'",
   1,
@@ -3430,14 +3529,14 @@
   set_modtime,
 };
 
-static char *uprn_fields[] = {
+static char *uprn2_fields[] = {
   "printer",
   "printer", "type", "hwtype", "duplexname", "hostname",
   "loghost", "rm", "rp", "rq", "ka", "pc", "ac", "lpc_acl",
   "banner", "location", "contact",
 };
 
-static struct valobj uprn_valobj[] = {
+static struct valobj uprn2_valobj[] = {
   {V_CHAR, 0, PRINTERS_TABLE, "name"},
   {V_CHAR, 1, PRINTERS_TABLE, "name"},
   {V_TYPE, 2, 0, "printertype", 0, MR_TYPE},
@@ -3457,9 +3556,53 @@
   {V_CHAR, 16, PRINTERS_TABLE, "contact"},
 };
 
+static struct validate uprn2_validate = {
+  uprn2_valobj,
+  16,
+  "name",
+  "name = '%s'",
+  1,
+  0,
+  access_printer,
+  setup_aprn,
+  set_modtime,
+};
+
+static char *uprn_fields[] = {
+  "printer",
+  "printer", "type", "hwtype", "duplexname", "duplexdefault",
+  "holddefault", "status", "hostname", "loghost", "rm", "rp",
+  "rq", "ka", "pc", "ac", "lpc_acl", "report_list", "banner",
+  "location", "contact",
+};
+
+static struct valobj uprn_valobj[] = {
+  {V_CHAR, 0, PRINTERS_TABLE, "name"},
+  {V_CHAR, 1, PRINTERS_TABLE, "name"},
+  {V_TYPE, 2, 0, "printertype", 0, MR_TYPE},
+  {V_TYPE, 3, 0, "printerhwtype", 0, MR_TYPE},
+  {V_CHAR, 4, PRINTERS_TABLE, "duplexname"},
+  {V_NUM, 5},
+  {V_NUM, 6},
+  {V_NUM, 7},
+  {V_ID, 8, MACHINE_TABLE, "name", "mach_id", MR_MACHINE},
+  {V_ID, 9, MACHINE_TABLE, "name", "mach_id", MR_MACHINE},
+  {V_ID, 10, MACHINE_TABLE, "name", "mach_id", MR_MACHINE},
+  {V_CHAR, 11, PRINTERS_TABLE, "rp"},
+  {V_ID, 12, MACHINE_TABLE, "name", "mach_id", MR_MACHINE},
+  {V_NUM, 13},
+  {V_NUM, 14},
+  {V_ID, 15, LIST_TABLE, "name", "list_id", MR_LIST},
+  {V_ID, 16, LIST_TABLE, "name", "list_id", MR_LIST},
+  {V_ID, 17, LIST_TABLE, "name", "list_id", MR_LIST},
+  {V_NUM, 18},
+  {V_CHAR, 19, PRINTERS_TABLE, "location"},
+  {V_CHAR, 20, PRINTERS_TABLE, "contact"},
+};
+
 static struct validate uprn_validate = {
   uprn_valobj,
-  16,
+  20,
   "name",
   "name = '%s'",
   1,
@@ -7304,7 +7447,7 @@
   },
 
   {
-    /* Q_GPRN - GET_PRINTER */
+    /* Q_GPRN - GET_PRINTER, v2 */
     "get_printer",
     "gprn",
     2,
@@ -7312,7 +7455,7 @@
     "pr",
     PRINTERS_TABLE,
     "pr.name, pr.type, pr.hwtype, pr.duplexname, m1.name, m2.name, m3.name, pr.rp, m4.name, pr.ka, pr.pc, l1.name, l2.name, pr.banner, pr.location, pr.contact, TO_CHAR(pr.modtime, 'DD-mon-YYYY HH24:MI:SS'), pr.modby, pr.modwith FROM printers pr, machine m1, machine m2, machine m3, machine m4, list l1, list l2",
-    gprn_fields,
+    gprn2_fields,
     19,
     "pr.name LIKE '%s' AND m1.mach_id = pr.mach_id AND m2.mach_id = pr.loghost AND m3.mach_id = pr.rm AND m4.mach_id = pr.rq AND l1.list_id = pr.ac AND l2.list_id = pr.lpc_acl",
     1,
@@ -7321,7 +7464,25 @@
   },
 
   {
-    /* Q_GPBD - GET_PRINTER_BY_DUPLEXNAME */
+    /* Q_GPRN - GET_PRINTER, v13 */
+    "get_printer",
+    "gprn",
+    13,
+    MR_Q_RETRIEVE,
+    "pr",
+    PRINTERS_TABLE,
+    "pr.name, pr.type, pr.hwtype, pr.duplexname, pr.duplexdefault, pr.holddefault, pr.status, m1.name, m2.name, m3.name, pr.rp, m4.name, pr.ka, pr.pc, l1.name, l2.name, l3.name, pr.banner, pr.location, pr.contact, TO_CHAR(pr.modtime, 'DD-mon-YYYY HH24:MI:SS'), pr.modby, pr.modwith FROM printers pr, machine m1, machine m2, machine m3, machine m4, list l1, list l2, list l3",
+    gprn_fields,
+    23,
+    "pr.name LIKE '%s' AND m1.mach_id = pr.mach_id AND m2.mach_id = pr.loghost AND m3.mach_id = pr.rm AND m4.mach_id = pr.rq AND l1.list_id = pr.ac AND l2.list_id = pr.lpc_acl AND l3.list_id = pr.report_list",
+    1,
+    "pr.name",
+    &VDfix_modby,
+  },
+
+
+  {
+    /* Q_GPBD - GET_PRINTER_BY_DUPLEXNAME, v2 */
     "get_printer_by_duplexname",
     "gpbd",
     2,
@@ -7329,7 +7490,7 @@
     "pr",
     PRINTERS_TABLE,
     "pr.name, pr.type, pr.hwtype, pr.duplexname, m1.name, m2.name, m3.name, pr.rp, m4.name, pr.ka, pr.pc, l1.name, l2.name, pr.banner, pr.location, pr.contact, TO_CHAR(pr.modtime, 'DD-mon-YYYY HH24:MI:SS'), pr.modby, pr.modwith FROM printers pr, machine m1, machine m2, machine m3, machine m4, list l1, list l2",
-    gpbd_fields,
+    gpbd2_fields,
     19,
     "pr.duplexname LIKE '%s' AND m1.mach_id = pr.mach_id AND m2.mach_id = pr.loghost AND m3.mach_id = pr.rm AND m4.mach_id = pr.rq AND l1.list_id = pr.ac AND l2.list_id = pr.lpc_acl",
     1,
@@ -7338,7 +7499,24 @@
   },
 
   {
-    /* Q_GPBE - GET_PRINTER_BY_ETHERNET */
+    /* Q_GPBD - GET_PRINTER_BY_DUPLEXNAME, v13 */
+    "get_printer_by_duplexname",
+    "gpbd",
+    13,
+    MR_Q_RETRIEVE,
+    "pr",
+    PRINTERS_TABLE,
+    "pr.name, pr.type, pr.hwtype, pr.duplexname, pr.duplexdefault, pr.holddefault, pr.status, m1.name, m2.name, m3.name, pr.rp, m4.name, pr.ka, pr.pc, l1.name, l2.name, l3.name, pr.banner, pr.location, pr.contact, TO_CHAR(pr.modtime, 'DD-mon-YYYY HH24:MI:SS'), pr.modby, pr.modwith FROM printers pr, machine m1, machine m2, machine m3, machine m4, list l1, list l2, list l3",
+    gpbd_fields,
+   23,
+    "pr.duplexname LIKE '%s' AND m1.mach_id = pr.mach_id AND m2.mach_id = pr.loghost AND m3.mach_id = pr.rm AND m4.mach_id = pr.rq AND l1.list_id = pr.ac AND l2.list_id = pr.lpc_acl AND l3.list_id = pr.report_list",
+    1,
+    "pr.name",
+    &VDfix_modby,
+  },
+
+  {
+    /* Q_GPBE - GET_PRINTER_BY_ETHERNET, v2 */
     "get_printer_by_ethernet",
     "gpbe",
     2,
@@ -7346,7 +7524,7 @@
     "pr",
     PRINTERS_TABLE,
     "pr.name, pr.type, pr.hwtype, pr.duplexname, m1.name, m2.name, m3.name, pr.rp, m4.name, pr.ka, pr.pc, l1.name, l2.name, pr.banner, pr.location, pr.contact, TO_CHAR(pr.modtime, 'DD-mon-YYYY HH24:MI:SS'), pr.modby, pr.modwith FROM printers pr, machine m1, machine m2, machine m3, machine m4, list l1, list l2",
-    gpbd_fields,
+    gpbd2_fields,
     19,
     "m1.hwaddr LIKE LOWER('%s') AND m1.mach_id = pr.mach_id AND m2.mach_id = pr.loghost AND m3.mach_id = pr.rm AND m4.mach_id = pr.rq AND l1.list_id = pr.ac AND l2.list_id = pr.lpc_acl",
     1,
@@ -7355,7 +7533,24 @@
   },
 
   {
-    /* Q_GPBH - GET_PRINTER_BY_HOSTNAME */
+    /* Q_GPBE - GET_PRINTER_BY_ETHERNET, v13 */
+    "get_printer_by_ethernet",
+    "gpbe",
+    13,
+    MR_Q_RETRIEVE,
+    "pr",
+    PRINTERS_TABLE,
+    "pr.name, pr.type, pr.hwtype, pr.duplexname, pr.duplexdefault, pr.holddefault, pr.status, m1.name, m2.name, m3.name, pr.rp, m4.name, pr.ka, pr.pc, l1.name, l2.name, l3.name, pr.banner, pr.location, pr.contact, TO_CHAR(pr.modtime, 'DD-mon-YYYY HH24:MI:SS'), pr.modby, pr.modwith FROM printers pr, machine m1, machine m2, machine m3, machine m4, list l1, list l2, list l3",
+    gpbd_fields,
+    23,
+    "m1.hwaddr LIKE LOWER('%s') AND m1.mach_id = pr.mach_id AND m2.mach_id = pr.loghost AND m3.mach_id = pr.rm AND m4.mach_id = pr.rq AND l1.list_id = pr.ac AND l2.list_id = pr.lpc_acl AND l3.list_id = pr.report_list",
+    1,
+    "pr.name",
+    &VDfix_modby,
+  },
+
+  {
+    /* Q_GPBH - GET_PRINTER_BY_HOSTNAME, v2 */
     "get_printer_by_hostname",
     "gpbh",
     2,
@@ -7363,7 +7558,7 @@
     "pr",
     PRINTERS_TABLE,
     "pr.name, pr.type, pr.hwtype, pr.duplexname, m1.name, m2.name, m3.name, pr.rp, m4.name, pr.ka, pr.pc, l1.name, l2.name, pr.banner, pr.location, pr.contact, TO_CHAR(pr.modtime, 'DD-mon-YYYY HH24:MI:SS'), pr.modby, pr.modwith FROM printers pr, machine m1, machine m2, machine m3, machine m4, list l1, list l2",
-    gpbh_fields,
+    gpbh2_fields,
     19,
     "m1.name LIKE UPPER('%s') AND m1.mach_id = pr.mach_id AND m2.mach_id = pr.loghost AND m3.mach_id = pr.rm AND m4.mach_id = pr.rq AND l1.list_id = pr.ac AND l2.list_id = pr.lpc_acl",
     1,
@@ -7371,8 +7566,25 @@
     &VDfix_modby,
   },
 
+  { 
+    /* Q_GPBH - GET_PRINTER_BY_HOSTNAME, v13 */
+    "get_printer_by_hostname",
+    "gpbh",
+    13,
+    MR_Q_RETRIEVE,
+    "pr",
+    PRINTERS_TABLE,
+    "pr.name, pr.type, pr.hwtype, pr.duplexname, pr.duplexdefault, pr.holddefault, pr.status, m1.name, m2.name, m3.name, pr.rp, m4.name, pr.ka, pr.pc, l1.name, l2.name, l3.name, pr.banner, pr.location, pr.contact, TO_CHAR(pr.modtime, 'DD-mon-YYYY HH24:MI:SS'), pr.modby, pr.modwith FROM printers pr, machine m1, machine m2, machinem3, machine m4, list l1, list l2, list l3",
+    gpbh_fields,
+    23,
+    "m1.name LIKE UPPER('%s') AND m1.mach_id = pr.mach_id AND m2.mach_id = pr.loghost AND m3.mach_id = pr.rm AND m4.mach_id = pr.rq AND l1.list_id = pr.ac AND l2.list_id = pr.lpc_acl AND l3.list_id = pr.report_list",
+    1,
+    "pr.name",
+    &VDfix_modby,
+  },
+
   {
-    /* Q_GPBR - GET_PRINTER_BY_RM */
+    /* Q_GPBR - GET_PRINTER_BY_RM, v2 */
     "get_printer_by_rm",
     "gpbr",
     2,
@@ -7380,7 +7592,7 @@
     "pr",
     PRINTERS_TABLE,
     "pr.name, pr.type, pr.hwtype, pr.duplexname, m1.name, m2.name, m3.name, pr.rp, m4.name, pr.ka, pr.pc, l1.name, l2.name, pr.banner, pr.location, pr.contact, TO_CHAR(pr.modtime, 'DD-mon-YYYY HH24:MI:SS'), pr.modby, pr.modwith FROM printers pr, machine m1, machine m2, machine m3, machine m4, list l1, list l2",
-    gpbr_fields,
+    gpbr2_fields,
     19,
     "m3.name LIKE UPPER('%s') AND m1.mach_id = pr.mach_id AND m2.mach_id = pr.loghost AND m3.mach_id = pr.rm AND m4.mach_id = pr.rq AND l1.list_id = pr.ac AND l2.list_id = pr.lpc_acl",
     1,
@@ -7388,8 +7600,25 @@
     &VDfix_modby,
   },
 
+  { 
+    /* Q_GPBR - GET_PRINTER_BY_RM, v13 */
+    "get_printer_by_rm",
+    "gpbr",
+    13,
+    MR_Q_RETRIEVE,
+    "pr",
+    PRINTERS_TABLE,
+    "pr.name, pr.type, pr.hwtype, pr.duplexname, pr.duplexdefault, pr.holddefault, pr.status, m1.name, m2.name, m3.name, pr.rp, m4.name, pr.ka, pr.pc, l1.name, l2.name, l3.name, pr.banner, pr.location, pr.contact, TO_CHAR(pr.modtime, 'DD-mon-YYYY HH24:MI:SS'), pr.modby, pr.modwith FROM printers pr, machine m1, machine m2, machinem3, machine m4, list l1, list l2, list l3",
+    gpbr_fields,
+    23,
+    "m3.name LIKE UPPER('%s') AND m1.mach_id = pr.mach_id AND m2.mach_id = pr.loghost AND m3.mach_id = pr.rm AND m4.mach_id = pr.rq AND l1.list_id = pr.ac AND l2.list_id = pr.lpc_acl AND l3.list_id = pr.report_list",
+    1,
+    "pr.name",
+    &VDfix_modby,
+  },
+
   {
-    /* Q_GPBL - GET_PRINTER_BY_LOCATION */
+    /* Q_GPBL - GET_PRINTER_BY_LOCATION, v2 */
     "get_printer_by_location",
     "gpbl",
     2,
@@ -7397,7 +7626,7 @@
     "pr",
     PRINTERS_TABLE,
     "pr.name, pr.type, pr.hwtype, pr.duplexname, m1.name, m2.name, m3.name, pr.rp, m4.name, pr.ka, pr.pc, l1.name, l2.name, pr.banner, pr.location, pr.contact, TO_CHAR(pr.modtime, 'DD-mon-YYYY HH24:MI:SS'), pr.modby, pr.modwith FROM printers pr, machine m1, machine m2, machine m3, machine m4, list l1, list l2",
-    gpbl_fields,
+    gpbl2_fields,
     19,
     "UPPER(pr.location) LIKE UPPER('%s') AND m1.mach_id = pr.mach_id AND m2.mach_id = pr.loghost AND m3.mach_id = pr.rm AND m4.mach_id = pr.rq AND l1.list_id = pr.ac AND l2.list_id = pr.lpc_acl",
     1,
@@ -7405,8 +7634,25 @@
     &VDfix_modby,
   },
 
+  { 
+    /* Q_GPBL - GET_PRINTER_BY_LOCATION, v13 */
+    "get_printer_by_location",
+    "gpbl",
+    13,
+    MR_Q_RETRIEVE,
+    "pr",
+    PRINTERS_TABLE,
+    "pr.name, pr.type, pr.hwtype, pr.duplexname, pr.duplexdefault, pr.holddefault, pr.status, m1.name, m2.name, m3.name, pr.rp, m4.name, pr.ka, pr.pc, l1.name, l2.name, l3.name, pr.banner, pr.location, pr.contact, TO_CHAR(pr.modtime, 'DD-mon-YYYY HH24:MI:SS'), pr.modby, pr.modwith FROM printers pr, machine m1, machine m2, machinem3, machine m4, list l1, list l2, list l3",
+    gpbl_fields,
+    23,
+    "UPPER(pr.location) LIKE UPPER('%s') AND m1.mach_id = pr.mach_id AND m2.mach_id = pr.loghost AND m3.mach_id = pr.rm AND m4.mach_id = pr.rq AND l1.list_id = pr.ac AND l2.list_id = pr.lpc_acl AND l3.list_id = pr.report_list",
+    1,
+    "pr.name",
+    &VDfix_modby,
+  },
+
   {
-    /* Q_GPBC - GET_PRINTER_BY_CONTACT */
+    /* Q_GPBC - GET_PRINTER_BY_CONTACT, v2 */
     "get_printer_by_contact",
     "gpbc",
     2,
@@ -7414,7 +7660,7 @@
     "pr",
     PRINTERS_TABLE,
     "pr.name, pr.type, pr.hwtype, pr.duplexname, m1.name, m2.name, m3.name, pr.rp, m4.name, pr.ka, pr.pc, l1.name, l2.name, pr.banner, pr.location, pr.contact, TO_CHAR(pr.modtime, 'DD-mon-YYYY HH24:MI:SS'), pr.modby, pr.modwith FROM printers pr, machine m1, machine m2, machine m3, machine m4, list l1, list l2",
-    gpbc_fields,
+    gpbc2_fields,
     19,
     "UPPER(pr.contact) LIKE UPPER('%s') AND m1.mach_id = pr.mach_id AND m2.mach_id = pr.loghost AND m3.mach_id = pr.rm AND m4.mach_id = pr.rq AND l1.list_id = pr.ac AND l2.list_id = pr.lpc_acl",
     1,
@@ -7423,7 +7669,24 @@
   },
 
   {
-    /* Q_APRN - ADD_PRINTER */
+    /* Q_GPBC - GET_PRINTER_BY_CONTACT, v13 */
+    "get_printer_by_contact",
+    "gpbc",
+    13,
+    MR_Q_RETRIEVE,
+    "pr",
+    PRINTERS_TABLE,
+    "pr.name, pr.type, pr.hwtype, pr.duplexname, pr.duplexdefault, pr.holddefault, pr.status, m1.name, m2.name, m3.name, pr.rp, m4.name, pr.ka, pr.pc, l1.name, l2.name, l3.name, pr.banner, pr.location, pr.contact, TO_CHAR(pr.modtime, 'DD-mon-YYYY HH24:MI:SS'), pr.modby, pr.modwith FROM printers pr, machine m1, machine m2, machinem3, machine m4, list l1, list l2, list l3",
+    gpbc_fields,
+    23,
+    "UPPER(pr.contact) LIKE UPPER('%s') AND m1.mach_id = pr.mach_id AND m2.mach_id = pr.loghost AND m3.mach_id = pr.rm AND m4.mach_id = pr.rq AND l1.list_id = pr.ac AND l2.list_id = pr.lpc_acl AND l3.list_id = pr.report_list",
+    1,
+    "pr.name",
+    &VDfix_modby,
+  },
+
+  {
+    /* Q_APRN - ADD_PRINTER, v2 */
     "add_printer",
     "aprn",
     2,
@@ -7431,16 +7694,33 @@
     "pr",
     PRINTERS_TABLE,
     "INTO printers (name, type, hwtype, duplexname, mach_id, loghost, rm, rp, rq, ka, pc, ac, lpc_acl, banner, location, contact) VALUES ('%s', '%s', '%s', NVL('%s', CHR(0)), %d, %d, %d, NVL('%s', CHR(0)), %d, %s, %s, %d, %d, %s, NVL('%s', CHR(0)), NVL('%s', CHR(0)))",
-    aprn_fields,
+    aprn2_fields,
     16,
     0,
     0,
     NULL,
+    &aprn2_validate,
+  },
+
+  {
+    /* Q_APRN - ADD_PRINTER, v13 */
+    "add_printer",
+    "aprn",
+    13,
+    MR_Q_APPEND,
+    "pr",
+    PRINTERS_TABLE,
+    "INTO printers (name, type, hwtype, duplexname, duplexdefault, holddefault, status, mach_id, loghost, rm, rp, rq, ka, pc, ac, lpc_acl, report_list, banner, location, contact) VALUES ('%s', '%s', '%s', NVL('%s', CHR(0)), %s, %s, %s, %d, %d, %d, NVL('%s', CHR(0)), %d, %s, %s, %d, %d, %d, %s, NVL('%s', CHR(0)), NVL('%s', CHR(0)))",
+    aprn_fields,
+    20,
+    0,
+    0,
+    NULL,
     &aprn_validate,
   },
 
   {
-    /* Q_UPRN - UPDATE_PRINTER */
+    /* Q_UPRN - UPDATE_PRINTER, v2 */
     "update_printer",
     "uprn",
     2,
@@ -7448,11 +7728,28 @@
     "pr",
     PRINTERS_TABLE,
     "printers SET name = '%s', type = '%s', hwtype = '%s', duplexname = NVL('%s', CHR(0)), mach_id = %d, loghost = %d, rm = %d, rp = NVL('%s', CHR(0)), rq = %d, ka = %s, pc = %s, ac = %d, lpc_acl = %d, banner = %s, location = NVL('%s', CHR(0)), contact = NVL('%s', CHR(0))",
-    uprn_fields,
+    uprn2_fields,
     16,
     "name = '%s'",
     1,
     NULL,
+    &uprn2_validate,
+  },
+
+  { 
+    /* Q_UPRN - UPDATE_PRINTER, v13 */
+    "update_printer",
+    "uprn",
+    13,
+    MR_Q_UPDATE,
+    "pr",
+    PRINTERS_TABLE,
+    "printers SET name = '%s', type = '%s', hwtype = '%s', duplexname = NVL('%s', CHR(0)), duplexdefault = %s, holddefault = %s, status = %s, mach_id = %d, loghost = %d, rm = %d, rp = NVL('%s', CHR(0)), rq = %d, ka = %s, pc = %s, ac = %d, lpc_acl = %d, report_list = %d, banner = %s, location = NVL('%s', CHR(0)), contact = NVL('%s', CHR(0))",
+    uprn_fields,
+    20,
+    "name = '%s'",
+    1,
+    NULL,
     &uprn_validate,
   },
 


home help back first fref pref prev next nref lref last post