[Info-vax] VMS databases
Neil Rieck
n.rieck at bell.net
Sun Nov 19 14:26:59 EST 2023
On Sunday, November 19, 2023 at 11:50:58 AM UTC-5, Arne Vajhøj wrote:
> On 11/19/2023 4:47 AM, Neil Rieck wrote:
> > On Saturday, November 18, 2023 at 6:47:22 PM UTC-5, Arne Vajhøj wrote:
> >> On 11/18/2023 9:22 AM, Arne Vajhøj wrote:
> >>> VMS Basic is as it is and the libmysql API is what it is and
> >>> any solution is constrained by that.
> >>>
> >>> I do not have any magic solution for the problem. I would
> >>> probably have made the API differently (but differently does
> >>> not necessarily mean better).
> >> I could not resist trying.
> >>
> >> This is first attempt. But I think it is a relative clean API.
> > Could you post the included code: "b.bas"
> B.BAS is not so interesting:
>
> external integer function bmysql_open(string, integer, string, string,
> string)
> external integer function bmysql_stmt_prepare(integer, string)
> external integer function bmysql_outparam_init(integer)
> external integer function bmysql_inparam_init(integer)
> external sub bmysql_outparam_integer(integer, integer, integer)
> external sub bmysql_inparam_integer(integer, integer, integer)
> external sub bmysql_outparam_string(integer, integer, string)
> external sub bmysql_inparam_string(integer, integer, string)
> external sub bmysql_stmt_execute(integer, integer, integer)
> external integer function bmysql_stmt_fetch(integer, integer)
> external sub bmysql_outparam_free(integer)
> external sub bmysql_inparam_free(integer)
> external sub bmysql_stmt_free(integer)
> external sub bmysql_close(integer)
>
> B2C.C has the interesting stuff:
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
>
> #include <descrip.h>
> #include <lib$routines.h>
>
> #define SOCKET int
> #include <mysql.h>
>
> #define MAX_LEN 32000
>
> struct b_param
> {
> int n;
> struct dsc$descriptor_d **bstr;
> MYSQL_BIND *bind;
> };
>
> static char *cstr(struct dsc$descriptor_d *s)
> {
> char *s2 = malloc(s->dsc$w_length + 1);
> memcpy(s2, s->dsc$a_pointer, s->dsc$w_length);
> s2[s->dsc$w_length] = 0;
> return s2;
> }
>
> static void bstr(char *buf, int buflen, struct dsc$descriptor_d *d)
> {
> lib$sget1_dd(&buflen, d);
> d->dsc$b_dtype = DSC$K_DTYPE_T;
> memcpy(d->dsc$a_pointer, buf, buflen);
> }
> static MYSQL *realcon(int *con)
> {
> return (MYSQL *)(*con);
> }
>
> static MYSQL_STMT *realstmt(int *stmt)
> {
> return (MYSQL_STMT *)(*stmt);
> }
>
> static struct b_param *realparam(int *param)
> {
> return (struct b_param *)(*param);
> }
>
> int BMYSQL_OPEN(struct dsc$descriptor_d *host,
> int *port,
> struct dsc$descriptor_d *usr,
> struct dsc$descriptor_d *pwd,
> struct dsc$descriptor_d *db)
> {
> char *host2 = cstr(host);
> char *usr2 = cstr(usr);
> char *pwd2 = cstr(pwd);
> char *db2 = cstr(db);
> MYSQL *con = mysql_init(NULL);
> con = mysql_real_connect(con, host2, usr2, pwd2, db2, *port, NULL, 0);
> free(host2);
> free(usr2);
> free(pwd2);
> free(db2);
> return (int)con;
> }
>
> int BMYSQL_STMT_PREPARE(int *con, struct dsc$descriptor_d *sql)
> {
> char *sql2 = cstr(sql);
> MYSQL_STMT *stmt = mysql_stmt_init(realcon(con));
> int stat = mysql_stmt_prepare(stmt, sql2, strlen(sql2));
> if(stat != 0) printf("mysql_stmt_prepare error : %s\n",
> mysql_error(realcon(con)));
> free(sql2);
> return (int)stmt;
> }
>
> int BMYSQL_OUTPARAM_INIT(int *nparam)
> {
> struct b_param *p = malloc(sizeof(struct b_param));
> p->n = *nparam;
> p->bstr = malloc(*nparam * sizeof(struct dsc$descriptor_d));
> p->bind = malloc(*nparam * sizeof(MYSQL_BIND));
> return (int)p;
> }
>
> int BMYSQL_INPARAM_INIT(int *nparam)
> {
> struct b_param *p = malloc(sizeof(struct b_param));
> p->n = *nparam;
> p->bstr = NULL;
> p->bind = malloc(*nparam * sizeof(MYSQL_BIND));
> return (int)p;
> }
>
> void BMYSQL_OUTPARAM_INTEGER(int *param, int *ix, int *val)
> {
> struct b_param *p = realparam(param);
> p->bstr[*ix] = NULL;
> memset(&p->bind[*ix], 0, sizeof(MYSQL_BIND));
> p->bind[*ix].buffer_type = MYSQL_TYPE_LONG;
> p->bind[*ix].buffer = (char *)val;
> p->bind[*ix].buffer_length = sizeof(int);
> }
>
> void BMYSQL_INPARAM_INTEGER(int *param, int *ix, int *val)
> {
> struct b_param *p = realparam(param);
> memset(&p->bind[*ix], 0, sizeof(MYSQL_BIND));
> p->bind[*ix].buffer_type = MYSQL_TYPE_LONG;
> p->bind[*ix].buffer = (char *)val;
> p->bind[*ix].buffer_length = sizeof(int);
> }
>
> void BMYSQL_OUTPARAM_STRING(int *param, int *ix, struct dsc$descriptor_d
> *val)
> {
> struct b_param *p = realparam(param);
> memset(&p->bind[*ix], 0, sizeof(MYSQL_BIND));
> p->bstr[*ix] = val;
> p->bind[*ix].buffer_type = MYSQL_TYPE_STRING;
> p->bind[*ix].buffer = malloc(MAX_LEN);
> p->bind[*ix].buffer_length = MAX_LEN;
> p->bind[*ix].length = (unsigned long *)malloc(sizeof(unsigned long));
> }
>
> void BMYSQL_INPARAM_STRING(int *param, int *ix, struct dsc$descriptor_d
> *val)
> {
> struct b_param *p = realparam(param);
> memset(&p->bind[*ix], 0, sizeof(MYSQL_BIND));
> p->bind[*ix].buffer_type = MYSQL_TYPE_STRING;
> p->bind[*ix].buffer = val->dsc$a_pointer;
> p->bind[*ix].buffer_length = val->dsc$w_length;
> }
>
> void BMYSQL_STMT_EXECUTE(int *stmt, int *inparam, int *outparam)
> {
> int stat;
> struct b_param *pin = realparam(inparam);
> struct b_param *pout = realparam(outparam);
> if(*inparam != 0)
> {
> stat = mysql_stmt_bind_param(realstmt(stmt), pin->bind);
> if(stat != 0) printf("mysql_stmt_bind_param error : %s\n",
> mysql_stmt_error(realstmt(stmt)));
> }
> stat = mysql_stmt_execute(realstmt(stmt));
> if(stat != 0) printf("mysql_stmt_execute error : %s\n",
> mysql_stmt_error(realstmt(stmt)));
> if(*outparam != 0)
> {
> stat = mysql_stmt_bind_result(realstmt(stmt), pout->bind);
> if(stat != 0) printf("mysql_stmt_bind_result error : %s\n",
> mysql_stmt_error(realstmt(stmt)));
> }
> stat = mysql_stmt_store_result(realstmt(stmt));
> if(stat != 0) printf("mysql_stmt_store_result error : %s\n",
> mysql_stmt_error(realstmt(stmt)));
> }
>
> int BMYSQL_STMT_FETCH(int *stmt, int *param)
> {
> struct b_param *p = realparam(param);
> int stat = mysql_stmt_fetch(realstmt(stmt));
> for(int i = 0; i < p->n; i++)
> {
> if(p->bind[i].buffer_type == MYSQL_TYPE_STRING)
> {
> char *buf = (char *)p->bind[i].buffer;
> int buflen = (int)*(p->bind[i].length);
> bstr(buf, buflen, p->bstr[i]);
> }
> }
> return stat;
> }
>
> void BMYSQL_OUTPARAM_FREE(int *param)
> {
> struct b_param *p = realparam(param);
> for(int i = 0; i < p->n; i++)
> {
> if(p->bind[i].buffer_type == MYSQL_TYPE_STRING)
> {
> free(p->bind[i].buffer);
> free(p->bind[i].length);
> }
> }
> free(p->bind);
> free(p->bstr);
> free(p);
> }
>
> void BMYSQL_INPARAM_FREE(int *param)
> {
> struct b_param *p = realparam(param);
> free(p->bind);
> free(p);
> }
>
> void BMYSQL_STMT_FREE(int *stmt)
> {
> mysql_stmt_free_result(realstmt(stmt));
> }
>
> void BMYSQL_CLOSE(int *con)
> {
> mysql_close(realcon(con));
> }
>
> Arne
Thanks
Neil
More information about the Info-vax
mailing list