aboutsummaryrefslogtreecommitdiff
path: root/pkg/xtools/catquery/cqsetcat.x
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/xtools/catquery/cqsetcat.x')
-rw-r--r--pkg/xtools/catquery/cqsetcat.x293
1 files changed, 293 insertions, 0 deletions
diff --git a/pkg/xtools/catquery/cqsetcat.x b/pkg/xtools/catquery/cqsetcat.x
new file mode 100644
index 00000000..f64ae4c3
--- /dev/null
+++ b/pkg/xtools/catquery/cqsetcat.x
@@ -0,0 +1,293 @@
+include "cqdef.h"
+include "cq.h"
+
+
+# CQ_SETCAT -- Set the current catalog by name.
+
+int procedure cq_setcat (cq, name)
+
+pointer cq #I the catalog descriptor
+char name[ARB] #I the catalog name
+
+int i, catno
+int cq_ccrquery()
+bool streq()
+
+begin
+ catno = 0
+ do i = 1, CQ_NRECS(cq) {
+ if (streq (name, CQ_NAME(cq, i)))
+ catno = i
+ }
+ if (catno == 0)
+ return (0)
+
+ # Free the previous current catalog descriptor if any.
+ call cq_ccfree (cq)
+
+ # Allocate the new descriptor.
+ call cq_ccinit (cq, catno)
+
+ # Get the new catalog parameters.
+ if (cq_ccrquery (cq) == ERR) {
+ call cq_ccfree (cq)
+ return (0)
+ }
+
+ return (catno)
+end
+
+
+# CQ_SETCATN -- Set the current catalog by number.
+
+int procedure cq_setcatn (cq, catno)
+
+pointer cq #I the catalog descriptor
+int catno #I the catalog number
+
+int cq_ccrquery()
+
+begin
+ if (catno < 1 || catno > CQ_NRECS(cq))
+ return (0)
+
+ # Free the previous current catalog descriptor if any.
+ call cq_ccfree (cq)
+
+ # Allocate the new descriptor.
+ call cq_ccinit (cq, catno)
+
+ # Get the new catalog parameters.
+ if (cq_ccrquery (cq) == ERR) {
+ call cq_ccfree (cq)
+ return (0)
+ }
+
+ return (catno)
+end
+
+
+# CQ_CCINIT -- Initialize the current catalog descriptor.
+
+procedure cq_ccinit (cq, catno)
+
+pointer cq #I the catalog database descriptor
+int catno #I the current catalog number
+
+pointer cc
+
+begin
+ if (catno < 1 || catno > CQ_NRECS(cq))
+ return
+ CQ_CATNO(cq) = catno
+ call strcpy (CQ_NAME(cq, catno), CQ_CATNAME(cq), SZ_FNAME)
+
+ call calloc (CQ_CAT(cq), CQ_LEN_CC, TY_STRUCT)
+ cc = CQ_CAT(cq)
+
+ CQ_NQPARS(cc) = 0
+ CQ_HFMT(cc) = CQ_HNONE
+
+ call calloc (CQ_PQPNAMES(cc), SZ_LINE, TY_CHAR)
+ call calloc (CQ_PQPDVALUES(cc), SZ_LINE, TY_CHAR)
+ call calloc (CQ_PQPVALUES(cc), SZ_LINE, TY_CHAR)
+ call calloc (CQ_PQPUNITS(cc), SZ_LINE, TY_CHAR)
+ call calloc (CQ_PQPFMTS(cc), SZ_LINE, TY_CHAR)
+
+ Memc[CQ_PQPNAMES(cc)] = EOS
+ Memc[CQ_PQPDVALUES(cc)] = EOS
+ Memc[CQ_PQPVALUES(cc)] = EOS
+ Memc[CQ_PQPUNITS(cc)] = EOS
+ Memc[CQ_PQPFMTS(cc)] = EOS
+
+ CQ_ADDRESS(cc) = EOS
+ CQ_QUERY(cc) = EOS
+
+end
+
+
+# CQ_CCRQUERY -- Read in the query related parameters from the catalog
+# database. May need to encode the field names at some point.
+
+int procedure cq_ccrquery (cq)
+
+pointer cq #I the catalog database descriptor
+
+pointer cc, sp, str
+int i, catno, nqpars, npars, sz1, sz2, sz3, sz4, sz5
+int op1, op2, op3, op4, op5
+int cq_dgeti(), cq_dscan(), nscan(), gstrcpy(), strdic()
+errchk cq_dgwrd(), cq_dgeti(), cq_dscan()
+
+begin
+ # If the current catalog is not defined then return.
+ if (CQ_CAT(cq) == NULL)
+ return (ERR)
+ if (CQ_CATNO(cq) < 1 || CQ_CATNO(cq) > CQ_NRECS(cq))
+ return (ERR)
+ cc = CQ_CAT(cq)
+ catno = CQ_CATNO(cq)
+
+ call smark (sp)
+ call salloc (str, 4 * (SZ_LINE + 1), TY_CHAR)
+
+ iferr {
+
+ # Get the catalog address and query string.
+ call cq_dgwrd (cq, catno, "address", CQ_ADDRESS(cc), SZ_LINE)
+ call cq_dgstr (cq, catno, "query", CQ_QUERY(cc), SZ_LINE)
+
+ # Get the protocol.
+ call cq_dgwrd (cq, catno, "protocol", Memc[str], SZ_LINE)
+ CQ_HFMT(cc) = strdic (Memc[str], Memc[str], SZ_LINE,
+ CQ_HFMTSTR)
+ if (CQ_HFMT(cc) <= 0)
+ CQ_HFMT(cc) = CQ_HNONE
+
+ # Determine the number of query parameters and position the
+ # file to the correct place.
+ nqpars = cq_dgeti (cq, catno, "nquery")
+
+ } then {
+
+ # Reinitialize and return.
+ CQ_ADDRESS(cc) = EOS
+ CQ_QUERY(cc) = EOS
+ call sfree (sp)
+ return (ERR)
+ }
+
+
+ # Open the query parameter string dictionaries.
+ sz1 = SZ_LINE; op1 = 2
+ sz2 = SZ_LINE; op2 = 2
+ sz3 = SZ_LINE; op3 = 2
+ sz4 = SZ_LINE; op4 = 2
+ sz5 = SZ_LINE; op5 = 2
+ call strcpy ("|", Memc[CQ_PQPNAMES(cc)], sz1)
+ call strcpy ("|", Memc[CQ_PQPDVALUES(cc)], sz2)
+ call strcpy ("|", Memc[CQ_PQPVALUES(cc)], sz3)
+ call strcpy ("|", Memc[CQ_PQPUNITS(cc)], sz4)
+ call strcpy ("|", Memc[CQ_PQPFMTS(cc)], sz5)
+
+ # Scan the query parameter list.
+ npars = 0
+ for (i = 1; i <= nqpars; i = i + 1) {
+ if (cq_dscan (cq) == EOF)
+ break
+
+ # Get the query parameter fields.
+ call gargwrd (Memc[str], SZ_LINE)
+ call gargwrd (Memc[str+SZ_LINE+1], SZ_LINE)
+ call gargwrd (Memc[str+2*(SZ_LINE+1)], SZ_LINE)
+ call gargwrd (Memc[str+3*(SZ_LINE+1)], SZ_LINE)
+ if (nscan() != 4)
+ break
+
+ # Get the query parameter name.
+ if ((sz1 - op1 + 1) < (CQ_SZ_QPNAME + 1)) {
+ sz1 = sz1 + SZ_LINE
+ call realloc (CQ_PQPNAMES(cc), sz1, TY_CHAR)
+ }
+ op1 = op1 + gstrcpy (Memc[str], Memc[CQ_PQPNAMES(cc)+op1-1],
+ sz1 - op1 + 1)
+ op1 = op1 + gstrcpy ("|", Memc[CQ_PQPNAMES(cc)+op1-1],
+ sz1 - op1 + 1)
+
+ # Get the default query parameter value and initialize the
+ # user query parameter string.
+ if ((sz2 - op2 + 1) < (CQ_SZ_QPVALUE + 1)) {
+ sz2 = sz2 + SZ_LINE
+ sz3 = sz3 + SZ_LINE
+ call realloc (CQ_PQPDVALUES(cc), sz2, TY_CHAR)
+ call realloc (CQ_PQPVALUES(cc), sz3, TY_CHAR)
+ }
+ op2 = op2 + gstrcpy (Memc[str+SZ_LINE+1],
+ Memc[CQ_PQPDVALUES(cc)+op2-1], sz2 - op2 + 1)
+ op2 = op2 + gstrcpy ("|", Memc[CQ_PQPDVALUES(cc)+op2-1],
+ sz2 - op2 + 1)
+ op3 = op3 + gstrcpy (Memc[str+SZ_LINE+1],
+ Memc[CQ_PQPVALUES(cc)+op3-1], sz3 - op3 + 1)
+ op3 = op3 + gstrcpy ("|", Memc[CQ_PQPVALUES(cc)+op3-1],
+ sz3 - op3 + 1)
+
+ # Get the query parameter units.
+ if ((sz4 - op4 + 1) < (CQ_SZ_QPUNITS + 1)) {
+ sz4 = sz4 + SZ_LINE
+ call realloc (CQ_PQPUNITS(cc), sz4, TY_CHAR)
+ }
+ op4 = op4 + gstrcpy (Memc[str+2*(SZ_LINE+1)],
+ Memc[CQ_PQPUNITS(cc)+op4-1], sz4 - op4 + 1)
+ op4 = op4 + gstrcpy ("|", Memc[CQ_PQPUNITS(cc)+op4-1],
+ sz4 - op4 + 1)
+
+ # Get the query parameter formats.
+ if ((sz5 - op5 + 1) < (CQ_SZ_QPFMTS + 1)) {
+ sz5 = sz5 + SZ_LINE
+ call realloc (CQ_PQPFMTS(cc), sz5, TY_CHAR)
+ }
+ op5 = op5 + gstrcpy (Memc[str+3*(SZ_LINE+1)],
+ Memc[CQ_PQPFMTS(cc)+op5-1], sz5 - op5 + 1)
+ op5 = op5 + gstrcpy ("|", Memc[CQ_PQPFMTS(cc)+op5-1],
+ sz5 - op5 + 1)
+
+ npars = npars + 1
+ }
+
+ # Return the appropriate status.
+ call sfree (sp)
+ if (npars != nqpars) {
+ CQ_NQPARS(cc) = 0
+ call realloc (CQ_PQPNAMES(cc), SZ_LINE, TY_CHAR)
+ call realloc (CQ_PQPDVALUES(cc), SZ_LINE, TY_CHAR)
+ call realloc (CQ_PQPVALUES(cc), SZ_LINE, TY_CHAR)
+ call realloc (CQ_PQPUNITS(cc), SZ_LINE, TY_CHAR)
+ call realloc (CQ_PQPFMTS(cc), SZ_LINE, TY_CHAR)
+ Memc[CQ_PQPNAMES(cc)] = EOS
+ Memc[CQ_PQPDVALUES(cc)] = EOS
+ Memc[CQ_PQPVALUES(cc)] = EOS
+ Memc[CQ_PQPUNITS(cc)] = EOS
+ Memc[CQ_PQPFMTS(cc)] = EOS
+ CQ_ADDRESS(cc) = EOS
+ CQ_QUERY(cc) = EOS
+ return (ERR)
+ } else {
+ CQ_NQPARS(cc) = npars
+ call realloc (CQ_PQPNAMES(cc), op1, TY_CHAR)
+ call realloc (CQ_PQPDVALUES(cc), op2, TY_CHAR)
+ call realloc (CQ_PQPVALUES(cc), op3, TY_CHAR)
+ call realloc (CQ_PQPUNITS(cc), op4, TY_CHAR)
+ call realloc (CQ_PQPFMTS(cc), op5, TY_CHAR)
+ Memc[CQ_PQPNAMES(cc)+op1] = EOS
+ Memc[CQ_PQPDVALUES(cc)+op2] = EOS
+ Memc[CQ_PQPVALUES(cc)+op3] = EOS
+ Memc[CQ_PQPUNITS(cc)+op4] = EOS
+ Memc[CQ_PQPFMTS(cc)+op5] = EOS
+ return (OK)
+ }
+end
+
+
+# CQ_CCFREE - Free the current catalog descriptor
+
+procedure cq_ccfree (cq)
+
+pointer cq #I the catalog database descriptor
+
+pointer cc
+
+begin
+ CQ_CATNAME(cq) = EOS
+ CQ_CATNO(cq) = 0
+
+ if (CQ_CAT(cq) != NULL) {
+ cc = CQ_CAT(cq)
+ call mfree (CQ_PQPNAMES(cc), TY_CHAR)
+ call mfree (CQ_PQPDVALUES(cc), TY_CHAR)
+ call mfree (CQ_PQPVALUES(cc), TY_CHAR)
+ call mfree (CQ_PQPUNITS(cc), TY_CHAR)
+ call mfree (CQ_PQPFMTS(cc), TY_CHAR)
+ call mfree (CQ_CAT(cq), TY_STRUCT)
+ }
+ CQ_CAT(cq) = NULL
+end