diff options
Diffstat (limited to 'pkg/xtools/catquery/cqsqpars.x')
-rw-r--r-- | pkg/xtools/catquery/cqsqpars.x | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/pkg/xtools/catquery/cqsqpars.x b/pkg/xtools/catquery/cqsqpars.x new file mode 100644 index 00000000..e2ab9c3c --- /dev/null +++ b/pkg/xtools/catquery/cqsqpars.x @@ -0,0 +1,135 @@ +include "cqdef.h" +include "cq.h" + + +# CQ_SQPAR -- Set the value of a query parameter by name. + +int procedure cq_sqpar (cq, name, valuestr) + +pointer cq #I the catalog descriptor +char name[ARB] #I the input query parameter name +char valuestr[ARB] #I the parameter value string + +pointer cc, sp, pname, tmpdic, pvalue +int i, parno, sz1, op1 +int strdic(), strlen(), cq_wrdstr(), gstrcpy() + +begin + # Check that the current catalog is defined. + if (CQ_CAT(cq) == NULL) + return (0) + if (CQ_CATNO(cq) < 1 || CQ_CATNO(cq) > CQ_NRECS(cq)) + return (0) + cc = CQ_CAT(cq) + + + # Allocate temporary space. + call smark (sp) + call salloc (pname, CQ_SZ_QPNAME, TY_CHAR) + call salloc (pvalue, CQ_SZ_QPVALUE, TY_CHAR) + + # Locate the parameter. + parno = strdic (name, Memc[pname], CQ_SZ_QPNAME, Memc[CQ_PQPNAMES(cc)]) + if (parno <= 0) { + call sfree (sp) + return (0) + } + + # Initalize the temporary string. + sz1 = strlen (Memc[CQ_PQPVALUES(cc)]) + CQ_SZ_QPVALUE + call malloc (tmpdic, sz1, TY_CHAR) + call strcpy ("|", Memc[tmpdic], sz1) + op1 = 2 + + + # Reformat the values string. + do i = 1, CQ_NQPARS(cc) { + if ((sz1 - op1 + 1) < (CQ_SZ_QPVALUE + 1)) { + sz1 = sz1 + SZ_LINE + call realloc (tmpdic, sz1, TY_CHAR) + } + if (i == parno) { + op1 = op1 + gstrcpy (valuestr, Memc[tmpdic+op1-1], + sz1 - op1 + 1) + op1 = op1 + gstrcpy ("|", Memc[tmpdic+op1-1], sz1 - op1 + 1) + } else if (cq_wrdstr (i, Memc[pvalue], CQ_SZ_QPNAME, + Memc[CQ_PQPVALUES(cc)]) > 0) { + op1 = op1 + gstrcpy (Memc[pvalue], Memc[tmpdic+op1-1], + sz1 - op1 + 1) + op1 = op1 + gstrcpy ("|", Memc[tmpdic+op1-1], sz1 - op1 + 1) + } + } + + # Update the values string. Leave as temp length for now. + call realloc (CQ_PQPVALUES(cc), op1 - 1, TY_CHAR) + call strcpy (Memc[tmpdic], Memc[CQ_PQPVALUES(cc)], op1 - 1) + + call mfree (tmpdic, TY_CHAR) + call sfree (sp) + + return (parno) +end + + +# CQ_SQPARN -- Set the value of a query parameter by number. + +int procedure cq_sqparn (cq, parno, valuestr) + +pointer cq #I the catalog descriptor +int parno #I the query parameter number +char valuestr[ARB] #I the parameter value string + +pointer cc, sp, pname, tmpdic, pvalue +int i, sz1, op1 +int strlen(), cq_wrdstr(), gstrcpy() + +begin + # Check that the current catalog is defined. + if (CQ_CAT(cq) == NULL) + return (0) + if (CQ_CATNO(cq) < 1 || CQ_CATNO(cq) > CQ_NRECS(cq)) + return (0) + cc = CQ_CAT(cq) + + if (parno < 1 || parno > CQ_NQPARS(cc)) + return (0) + + # Get some working space. + call smark (sp) + call salloc (pname, CQ_SZ_QPNAME, TY_CHAR) + call salloc (pvalue, CQ_SZ_QPVALUE, TY_CHAR) + + # Initialize the new dictionary. + sz1 = strlen (Memc[CQ_PQPVALUES(cc)]) + CQ_SZ_QPVALUE + call calloc (tmpdic, sz1, TY_CHAR) + call strcpy ("|", Memc[tmpdic], sz1) + op1 = 2 + + # Reformat the values string. + do i = 1, CQ_NQPARS(cc) { + if ((sz1 - op1 + 1) < (CQ_SZ_QPVALUE + 1)) { + sz1 = sz1 + SZ_LINE + call realloc (tmpdic, sz1, TY_CHAR) + } + if (i == parno) { + op1 = op1 + gstrcpy (valuestr, Memc[tmpdic+op1-1], + sz1 - op1 + 1) + op1 = op1 + gstrcpy ("|", Memc[tmpdic+op1-1], sz1 - op1 + 1) + } else if (cq_wrdstr (i, Memc[pvalue], CQ_SZ_QPNAME, + Memc[CQ_PQPVALUES(cc)]) > 0) { + op1 = op1 + gstrcpy (Memc[pvalue], Memc[tmpdic+op1-1], + sz1 - op1 + 1) + op1 = op1 + gstrcpy ("|", Memc[tmpdic+op1-1], sz1 - op1 + 1) + } + } + + # Update the values string. + call realloc (CQ_PQPVALUES(cc), op1, TY_CHAR) + call strcpy (Memc[tmpdic], Memc[CQ_PQPVALUES(cc)], op1 - 1) + + # Free memory. + call mfree (tmpdic, TY_CHAR) + call sfree (sp) + + return (parno) +end |