-/* $Id: js_pgsql.c,v 1.10 2006/10/18 05:07:42 mmondor Exp $ */
+/* $Id: js_pgsql.c,v 1.11 2006/10/19 06:08:12 mmondor Exp $ */
/*
* Copyright (c) 2006, Matthew Mondor
/*
* XXX TODO XXX
* - Verify if JS_GetStringLength() really safe to continue using
- * - Perhaps provide simpler replacement functions for query functions
- * allowing separate parameters to be set (perhaps not necessary considering
- * that we can provide null to an array), and expand the object in JS.
- * - All functions creating doubles or strings should check if NULL is
- * returned. Verify this.
* - (maybe) make reentrant by causing optimization buffers to be part of
* generated objects instances's private data (using structures as necessary
* instead of simply wrapping around the native object's pointer
* (actually PGconn object).
- * - Large objects API
- * - Compare to PHP library to verify if missing any nice functions ideas
* - See what to do about the following functions:
* - PQgetssl() (returns an SSL object!)
*/
#include <jsapi.h>
#include <libpq-fe.h>
+#include <libpq/libpq-fs.h> /* Large Objects API */
#include <js_pgsql.h>
#include <js_file.h>
static JSBool pgconn_m_PQsetNoticeProcessor(JSContext *, JSObject *, uintN,
jsval *, jsval *);
static void notice_processor(void *, const char *);
+static JSBool pgconn_m_lo_creat(JSContext *, JSObject *, uintN, jsval *,
+ jsval *);
+static JSBool pgconn_m_lo_create(JSContext *, JSObject *, uintN, jsval *,
+ jsval *);
+static JSBool pgconn_m_lo_import(JSContext *, JSObject *, uintN, jsval *,
+ jsval *);
+static JSBool pgconn_m_lo_export(JSContext *, JSObject *, uintN, jsval *,
+ jsval *);
+static JSBool pgconn_m_lo_open(JSContext *, JSObject *, uintN, jsval *,
+ jsval *);
+static JSBool pgconn_m_lo_write(JSContext *, JSObject *, uintN, jsval *,
+ jsval *);
+static JSBool pgconn_m_lo_read(JSContext *, JSObject *, uintN, jsval *,
+ jsval *);
+static JSBool pgconn_m_lo_lseek(JSContext *, JSObject *, uintN, jsval *,
+ jsval *);
+static JSBool pgconn_m_lo_tell(JSContext *, JSObject *, uintN, jsval *,
+ jsval *);
+static JSBool pgconn_m_lo_close(JSContext *, JSObject *, uintN, jsval *,
+ jsval *);
+static JSBool pgconn_m_lo_unlink(JSContext *, JSObject *, uintN, jsval *,
+ jsval *);
static JSObject *js_InitPGresultClass(JSContext *, JSObject *);
static JSBool pgresult_constructor(JSContext *, JSObject *, uintN, jsval *,
SP(PQERRORS_TERSE),
SP(PQERRORS_DEFAULT),
SP(PQERRORS_VERBOSE),
+ SP(INV_READ),
+ SP(INV_WRITE),
+ SP(SEEK_SET),
+ SP(SEEK_CUR),
+ SP(SEEK_END),
{ NULL, 0 }
};
{ "getCopyData", pgconn_m_PQgetCopyData, 1, 0, 0 },
{ "setNoticeReceiver", pgconn_m_PQsetNoticeReceiver, 2, 0, 0 },
{ "setNoticeProcessor", pgconn_m_PQsetNoticeProcessor, 2, 0, 0 },
+ { "loCreat", pgconn_m_lo_creat, 1, 0, 0 },
+ { "loCreate", pgconn_m_lo_create, 1, 0, 0 },
+ { "loImport", pgconn_m_lo_import, 1, 0, 0 },
+ { "loExport", pgconn_m_lo_export, 2, 0, 0 },
+ { "loOpen", pgconn_m_lo_open, 2, 0, 0 },
+ { "loWrite", pgconn_m_lo_write, 2, 0, 0 },
+ { "loRead", pgconn_m_lo_read, 2, 0, 0 },
+ { "loSeek", pgconn_m_lo_lseek, 3, 0, 0 },
+ { "loTell", pgconn_m_lo_tell, 1, 0, 0 },
+ { "loClose", pgconn_m_lo_close, 1, 0, 0 },
+ { "loUnlink", pgconn_m_lo_unlink, 1, 0, 0 },
{ NULL, NULL, 0, 0, 0 }
};
QUEUE_EXCEPTION("Wrong number of arguments");
goto err;
}
- if (!JSVAL_IS_STRING(argv[0])) {
+ if (!JSVAL_IS_STRING(argv[0]) ||
+ (str = JS_GetStringBytes(JSVAL_TO_STRING(argv[0]))) == NULL) {
QUEUE_EXCEPTION("Argument not a String");
goto err;
}
- str = JS_GetStringBytes(JSVAL_TO_STRING(argv[0]));
if ((o = JS_NewObject(cx, &pgconn_class, NULL, NULL)) == NULL) {
QUEUE_EXCEPTION("Internal error!");
QUEUE_EXCEPTION("Wrong number of arguments");
goto err;
}
- if (!JSVAL_IS_STRING(argv[0])) {
+ if (!JSVAL_IS_STRING(argv[0]) ||
+ (str = JS_GetStringBytes(JSVAL_TO_STRING(argv[0]))) == NULL) {
QUEUE_EXCEPTION("Argument not a String");
goto err;
}
- str = JS_GetStringBytes(JSVAL_TO_STRING(argv[0]));
if ((o = JS_NewObject(cx, &pgconn_class, NULL, NULL)) == NULL) {
QUEUE_EXCEPTION("Internal error!");
QUEUE_EXCEPTION("Wrong number of arguments");
goto err;
}
- if (!JSVAL_IS_STRING(argv[0])) {
+ if (!JSVAL_IS_STRING(argv[0]) ||
+ (from = JS_GetStringBytes(JSVAL_TO_STRING(argv[0]))) == NULL) {
QUEUE_EXCEPTION("Argument not a String");
goto err;
}
pgc = JS_GetInstancePrivate(cx, obj, &pgconn_class, NULL);
assert(pgc != NULL);
- from = JS_GetStringBytes(JSVAL_TO_STRING(argv[0]));
-
if ((res = PQunescapeBytea(from, &reslen)) == NULL) {
QUEUE_EXCEPTION("PQescapeByteaConn()");
goto err;
pgconn_m_PQreset(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
jsval *rval)
{
- PGconn *pgc;
+ PGconn *pgc;
if (argc != 0) {
QUEUE_EXCEPTION("Function allows no arguments");
jsval *rval)
{
PGconn *pgc;
+ int ret;
if (argc != 0) {
QUEUE_EXCEPTION("Function allows no arguments");
pgc = JS_GetInstancePrivate(cx, obj, &pgconn_class, NULL);
assert(pgc != NULL);
- *rval = INT_TO_JSVAL(PQconnectPoll(pgc));
+ ret = PQresetStart(pgc);
+ *rval = INT_TO_JSVAL((int)ret);
return JS_TRUE;
}
QUEUE_EXCEPTION("Wrong number of arguments");
return JS_FALSE;
}
- if (!JSVAL_IS_STRING(argv[0])) {
+ if (!JSVAL_IS_STRING(argv[0]) ||
+ (param = JS_GetStringBytes(JSVAL_TO_STRING(argv[0]))) == NULL) {
QUEUE_EXCEPTION("Argument not a String");
return JS_FALSE;
}
- param = JS_GetStringBytes(JSVAL_TO_STRING(argv[0]));
pgc = JS_GetInstancePrivate(cx, obj, &pgconn_class, NULL);
assert(pgc != NULL);
jsval *argv, jsval *rval)
{
PGconn *pgc;
+ int v;
if (argc != 0) {
QUEUE_EXCEPTION("Function allows no arguments");
pgc = JS_GetInstancePrivate(cx, obj, &pgconn_class, NULL);
assert(pgc != NULL);
- *rval = INT_TO_JSVAL(PQprotocolVersion(pgc));
+ v = PQprotocolVersion(pgc);
+ *rval = INT_TO_JSVAL(v);
return JS_TRUE;
}
jsval *argv, jsval *rval)
{
PGconn *pgc;
+ int v;
if (argc != 0) {
QUEUE_EXCEPTION("Function allows no arguments");
pgc = JS_GetInstancePrivate(cx, obj, &pgconn_class, NULL);
assert(pgc != NULL);
- *rval = INT_TO_JSVAL(PQserverVersion(pgc));
+ v = PQserverVersion(pgc);
+ *rval = INT_TO_JSVAL(v);
return JS_TRUE;
}
jsval *rval)
{
PGconn *pgc;
+ int fd;
if (argc != 0) {
QUEUE_EXCEPTION("Function allows no arguments");
pgc = JS_GetInstancePrivate(cx, obj, &pgconn_class, NULL);
assert(pgc != NULL);
- *rval = INT_TO_JSVAL(PQsocket(pgc));
+ fd = PQsocket(pgc);
+ *rval = INT_TO_JSVAL(fd);
return JS_TRUE;
}
jsval *rval)
{
PGconn *pgc;
+ int v;
if (argc != 0) {
QUEUE_EXCEPTION("Function allows no arguments");
pgc = JS_GetInstancePrivate(cx, obj, &pgconn_class, NULL);
assert(pgc != NULL);
- *rval = INT_TO_JSVAL(PQbackendPID(pgc));
+ v = PQbackendPID(pgc);
+ *rval = INT_TO_JSVAL(v);
return JS_TRUE;
}
goto err;
}
- if (!JSVAL_IS_STRING(argv[0])) {
+ if (!JSVAL_IS_STRING(argv[0]) ||
+ (str = JS_GetStringBytes(JSVAL_TO_STRING(argv[0]))) == NULL) {
QUEUE_EXCEPTION("Argument not a String");
goto err;
}
- str = JS_GetStringBytes(JSVAL_TO_STRING(argv[0]));
pgc = JS_GetInstancePrivate(cx, obj, &pgconn_class, NULL);
assert(pgc != NULL);
{
PGconn *pgc;
char *str;
+ int v;
if (argc != 1) {
QUEUE_EXCEPTION("Wrong number of arguments");
goto err;
}
- if (!JSVAL_IS_STRING(argv[0])) {
+ if (!JSVAL_IS_STRING(argv[0]) ||
+ (str = JS_GetStringBytes(JSVAL_TO_STRING(argv[0]))) == NULL) {
QUEUE_EXCEPTION("Argument not a String");
goto err;
}
- str = JS_GetStringBytes(JSVAL_TO_STRING(argv[0]));
pgc = JS_GetInstancePrivate(cx, obj, &pgconn_class, NULL);
assert(pgc != NULL);
- *rval = INT_TO_JSVAL(PQsendQuery(pgc, str));
+ v = PQsendQuery(pgc, str);
+ *rval = INT_TO_JSVAL(v);
return JS_TRUE;
QUEUE_EXCEPTION(str);
goto err;
}
- values[i2++] = JS_GetStringBytes(
- JSVAL_TO_STRING(val));
+ if ((values[i2++] = JS_GetStringBytes(
+ JSVAL_TO_STRING(val))) == NULL) {
+ QUEUE_EXCEPTION("Internal error!");
+ goto err;
+ }
}
}
JS_DestroyIdArray(cx, a);
assert(pgc != NULL);
if (!async) {
+ char *str;
- if ((pgr = PQexecParams(pgc,
- JS_GetStringBytes(JSVAL_TO_STRING(argv[0])),
- nargs, types, (const char * const *)values, lengths,
- formats, JSVAL_TO_INT(argv[6]))) == NULL) {
+ if ((str = JS_GetStringBytes(JSVAL_TO_STRING(argv[0])))
+ == NULL) {
+ QUEUE_EXCEPTION("Internal error!");
+ goto err;
+ }
+
+ if ((pgr = PQexecParams(pgc, str, nargs, types,
+ (const char * const *)values, lengths, formats,
+ JSVAL_TO_INT(argv[6]))) == NULL) {
QUEUE_EXCEPTION("PQexecParams()");
goto err;
}
}
} else {
+ int v;
+ char *str;
- *rval = INT_TO_JSVAL(PQsendQueryParams(pgc,
- JS_GetStringBytes(JSVAL_TO_STRING(argv[0])),
- nargs, types, (const char * const *)values, lengths,
- formats, JSVAL_TO_INT(argv[6])));
+ if ((str = JS_GetStringBytes(JSVAL_TO_STRING(argv[0])))
+ == NULL) {
+ QUEUE_EXCEPTION("Internal error!");
+ goto err;
+ }
+ v = PQsendQueryParams(pgc, str, nargs, types,
+ (const char * const *)values, lengths, formats,
+ JSVAL_TO_INT(argv[6]));
+ *rval = INT_TO_JSVAL(v);
}
return JS_TRUE;
assert(pgc != NULL);
if (!async) {
+ char *str1, *str2;
- if ((pgr = PQprepare(pgc,
- JS_GetStringBytes(JSVAL_TO_STRING(argv[0])),
- JS_GetStringBytes(JSVAL_TO_STRING(argv[1])),
- nargs, types)) == NULL) {
+ if ((str1 = JS_GetStringBytes(JSVAL_TO_STRING(argv[0])))
+ == NULL || (str2 = JS_GetStringBytes(JSVAL_TO_STRING(
+ argv[1]))) == NULL) {
+ QUEUE_EXCEPTION("Internal error!");
+ goto err;
+ }
+
+ if ((pgr = PQprepare(pgc, str1, str2, nargs, types)) == NULL) {
QUEUE_EXCEPTION("PQprepare()");
goto err;
}
}
} else {
+ int v;
+ char *str1, *str2;
+
+ if ((str1 = JS_GetStringBytes(JSVAL_TO_STRING(argv[0])))
+ == NULL || (str2 = JS_GetStringBytes(JSVAL_TO_STRING(
+ argv[1]))) == NULL) {
+ QUEUE_EXCEPTION("Internal error!");
+ goto err;
+ }
- *rval = INT_TO_JSVAL(PQsendPrepare(pgc,
- JS_GetStringBytes(JSVAL_TO_STRING(argv[0])),
- JS_GetStringBytes(JSVAL_TO_STRING(argv[1])),
- nargs, types));
+ v = PQsendPrepare(pgc, str1, str2, nargs, types);
+ *rval = INT_TO_JSVAL(v);
}
QUEUE_EXCEPTION(str);
goto err;
}
- values[i2++] = JS_GetStringBytes(
- JSVAL_TO_STRING(val));
+ if ((values[i2++] = JS_GetStringBytes(
+ JSVAL_TO_STRING(val))) == NULL) {
+ QUEUE_EXCEPTION("Internal error!");
+ goto err;
+ }
}
}
JS_DestroyIdArray(cx, a);
assert(pgc != NULL);
if (!async) {
+ char *str;
- if ((pgr = PQexecPrepared(pgc,
- JS_GetStringBytes(JSVAL_TO_STRING(argv[0])),
- nargs, (const char * const *)values, lengths, formats,
+ if ((str = JS_GetStringBytes(JSVAL_TO_STRING(argv[0])))
+ == NULL) {
+ QUEUE_EXCEPTION("Internal error!");
+ goto err;
+ }
+
+ if ((pgr = PQexecPrepared(pgc, str, nargs,
+ (const char * const *)values, lengths, formats,
JSVAL_TO_INT(argv[5]))) == NULL) {
QUEUE_EXCEPTION("PQexecPrepared()");
goto err;
}
} else {
+ int v;
+ char *str;
- *rval = INT_TO_JSVAL(PQsendQueryPrepared(pgc,
- JS_GetStringBytes(JSVAL_TO_STRING(argv[0])),
- nargs, (const char * const *)values, lengths, formats,
- JSVAL_TO_INT(argv[5])));
+ if ((str = JS_GetStringBytes(JSVAL_TO_STRING(argv[0])))
+ == NULL) {
+ QUEUE_EXCEPTION("Internal error!");
+ goto err;
+ }
+ v = PQsendQueryPrepared(pgc, str, nargs,
+ (const char * const *)values, lengths, formats,
+ JSVAL_TO_INT(argv[5]));
+ *rval = INT_TO_JSVAL(v);
}
return JS_TRUE;
assert(pgc != NULL);
str = JSVAL_TO_STRING(argv[0]);
- from = JS_GetStringBytes(str);
+ if ((from = JS_GetStringBytes(str)) == NULL) {
+ QUEUE_EXCEPTION("Internal error!");
+ goto err;
+ }
len = JS_GetStringLength(str);
if (buffer_grow((len * 2) + 2) == -1) {
assert(pgc != NULL);
str = JSVAL_TO_STRING(argv[0]);
- from = JS_GetStringBytes(str);
+ if ((from = JS_GetStringBytes(str)) == NULL) {
+ QUEUE_EXCEPTION("Internal error!");
+ goto err;
+ }
fromlen = JS_GetStringLength(str);
if ((res = PQescapeByteaConn(pgc, from, fromlen, &reslen)) == NULL) {
pgconn_m_PQconsumeInput(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
jsval *rval)
{
- PGconn *pgc;
+ PGconn *pgc;
+ int v;
if (argc != 0) {
QUEUE_EXCEPTION("Function allows no arguments");
pgc = JS_GetInstancePrivate(cx, obj, &pgconn_class, NULL);
assert(pgc != NULL);
- *rval = INT_TO_JSVAL(PQconsumeInput(pgc));
+ v = PQconsumeInput(pgc);
+ *rval = INT_TO_JSVAL(v);
return JS_TRUE;
}
pgconn_m_PQisBusy(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
jsval *rval)
{
- PGconn *pgc;
+ PGconn *pgc;
+ int v;
if (argc != 0) {
QUEUE_EXCEPTION("Function allows no arguments");
pgc = JS_GetInstancePrivate(cx, obj, &pgconn_class, NULL);
assert(pgc != NULL);
- *rval = INT_TO_JSVAL(PQisBusy(pgc));
+ v = PQisBusy(pgc);
+ *rval = INT_TO_JSVAL(v);
return JS_TRUE;
}
pgconn_m_PQsetnonblocking(JSContext *cx, JSObject *obj, uintN argc,
jsval *argv, jsval *rval)
{
- PGconn *pgc;
+ PGconn *pgc;
+ int v;
if (argc != 1) {
QUEUE_EXCEPTION("Wrong number of arguments");
pgc = JS_GetInstancePrivate(cx, obj, &pgconn_class, NULL);
assert(pgc != NULL);
- *rval = INT_TO_JSVAL(PQsetnonblocking(pgc, JSVAL_TO_INT(argv[0])));
+ v = PQsetnonblocking(pgc, JSVAL_TO_INT(argv[0]));
+ *rval = INT_TO_JSVAL(v);
return JS_TRUE;
pgconn_m_PQisnonblocking(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
jsval *rval)
{
- PGconn *pgc;
+ PGconn *pgc;
+ int v;
if (argc != 0) {
QUEUE_EXCEPTION("Function allows no arguments");
pgc = JS_GetInstancePrivate(cx, obj, &pgconn_class, NULL);
assert(pgc != NULL);
- *rval = INT_TO_JSVAL(PQisnonblocking(pgc));
+ v = PQisnonblocking(pgc);
+ *rval = INT_TO_JSVAL(v);
return JS_TRUE;
}
pgconn_m_PQflush(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
jsval *rval)
{
- PGconn *pgc;
+ PGconn *pgc;
+ int v;
if (argc != 0) {
QUEUE_EXCEPTION("Function allows no arguments");
pgc = JS_GetInstancePrivate(cx, obj, &pgconn_class, NULL);
assert(pgc != NULL);
- *rval = INT_TO_JSVAL(PQflush(pgc));
+ v = PQflush(pgc);
+ *rval = INT_TO_JSVAL(v);
return JS_TRUE;
}
jsval *argv, jsval *rval)
{
PGconn *pgc;
+ int v;
if (argc != 1) {
QUEUE_EXCEPTION("Wrong number of arguments");
pgc = JS_GetInstancePrivate(cx, obj, &pgconn_class, NULL);
assert(pgc != NULL);
- *rval = INT_TO_JSVAL(PQsetErrorVerbosity(pgc, JSVAL_TO_INT(argv[0])));
+ v = PQsetErrorVerbosity(pgc, JSVAL_TO_INT(argv[0]));
+ *rval = INT_TO_JSVAL(v);
return JS_TRUE;
{
PGconn *pgc;
JSString *str;
+ char *bytes;
+ int v;
if (argc != 1) {
QUEUE_EXCEPTION("Wrong number of arguments");
assert(pgc != NULL);
str = JSVAL_TO_STRING(argv[0]);
- *rval = INT_TO_JSVAL(PQputCopyData(pgc, JS_GetStringBytes(str),
- JS_GetStringLength(str)));
+ if ((bytes = JS_GetStringBytes(str)) == NULL) {
+ QUEUE_EXCEPTION("Internal error!");
+ goto err;
+ }
+ v = PQputCopyData(pgc, bytes, JS_GetStringLength(str));
+ *rval = INT_TO_JSVAL(v);
return JS_TRUE;
pgconn_m_PQputCopyEnd(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
jsval *rval)
{
- PGconn *pgc;
+ PGconn *pgc;
+ int v;
if (argc != 1) {
QUEUE_EXCEPTION("Wrong number of arguments");
pgc = JS_GetInstancePrivate(cx, obj, &pgconn_class, NULL);
assert(pgc != NULL);
- *rval = INT_TO_JSVAL(PQputCopyEnd(pgc, (JSVAL_IS_NULL(argv[0]) ? NULL :
- JS_GetStringBytes(JSVAL_TO_STRING(argv[0])))));
+ v = PQputCopyEnd(pgc, (JSVAL_IS_NULL(argv[0]) ? NULL :
+ JS_GetStringBytes(JSVAL_TO_STRING(argv[0]))));
+ *rval = INT_TO_JSVAL(v);
return JS_TRUE;
PGconn *pgc;
/*
- * Verify if our connection object has the np_function property set,
+ * Verify if our connection object has the nr_function property set,
* in which case we set it as the return code. If it doesn't have
* any, return null.
*/
- if (!JS_GetProperty(cx, obj, "np_function", &rval[0]))
+ if (!JS_GetProperty(cx, obj, "nr_function", &rval[0]))
*rval = OBJECT_TO_JSVAL(NULL);
if (argc != 2) {
}
/*
- * Set the np_function and np_udata properties. This simplifies
+ * Set the nr_function and nr_udata properties. This simplifies
* things while ensuring that the ojects live as long as the
* connection object does. We don't make them enumerable.
*/
- if (!JS_DefineProperty(cx, obj, "np_function", argv[0], NULL, NULL,
+ if (!JS_DefineProperty(cx, obj, "nr_function", argv[0], NULL, NULL,
JSPROP_READONLY | JSPROP_PERMANENT)) {
QUEUE_EXCEPTION("Internal error!");
return JS_FALSE;
}
- if (!JS_DefineProperty(cx, obj, "np_udata", argv[1], NULL, NULL,
+ if (!JS_DefineProperty(cx, obj, "nr_udata", argv[1], NULL, NULL,
JSPROP_READONLY | JSPROP_PERMANENT)) {
QUEUE_EXCEPTION("Internal error!");
return JS_FALSE;
notice_receiver(void *udata, const PGresult *pgr)
{
omap_t *omap;
- jsval args[2], ret, pgrv, np_function, np_udata;
+ jsval args[2], ret, pgrv, nr_function, nr_udata;
omap = js_map_lookup((void *)pgr);
assert(omap != NULL);
* We get out the udata and function to call from the connection
* object.
*/
- if (!JS_DefineProperty(omap->cx, omap->udata, "np_pgresult", pgrv,
+ if (!JS_DefineProperty(omap->cx, omap->udata, "nr_pgresult", pgrv,
NULL, NULL, JSPROP_READONLY | JSPROP_PERMANENT))
return;
- if (!JS_GetProperty(omap->cx, omap->udata, "np_function",
- &np_function) || !JS_GetProperty(omap->cx, omap->udata,
- "np_udata", &np_udata))
+ if (!JS_GetProperty(omap->cx, omap->udata, "nr_function",
+ &nr_function) || !JS_GetProperty(omap->cx, omap->udata,
+ "nr_udata", &nr_udata))
goto err;
- args[0] = np_udata;
+ args[0] = nr_udata;
args[1] = pgrv;
- (void) JS_CallFunctionValue(omap->cx, omap->udata, np_function, 2,
+ (void) JS_CallFunctionValue(omap->cx, omap->udata, nr_function, 2,
args, &ret);
err:
- (void) JS_DeleteProperty(omap->cx, omap->udata, "np_pgresult");
+ (void) JS_DeleteProperty(omap->cx, omap->udata, "nr_pgresult");
}
static JSBool
(void) JS_DeleteProperty(omap->cx, omap->obj, "np_message");
}
+static JSBool
+pgconn_m_lo_creat(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
+ jsval *rval)
+{
+ PGconn *pgc;
+ Oid oid;
+
+ if (argc != 1) {
+ QUEUE_EXCEPTION("Wrong number of arguments");
+ goto err;
+ }
+ if (!JSVAL_IS_INT(argv[0])) {
+ QUEUE_EXCEPTION("Argument 1 not an Integer");
+ goto err;
+ }
+
+ pgc = JS_GetInstancePrivate(cx, obj, &pgconn_class, NULL);
+ assert(pgc != NULL);
+
+ oid = lo_creat(pgc, JSVAL_TO_INT(argv[0]));
+
+ if (!JS_NewDoubleValue(cx, (jsdouble)oid, rval)) {
+ QUEUE_EXCEPTION("Internal error!");
+ goto err;
+ }
+
+ return JS_TRUE;
+
+err:
+ *rval = OBJECT_TO_JSVAL(NULL);
+
+ return JS_FALSE;
+}
+
+static JSBool
+pgconn_m_lo_create(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
+ jsval *rval)
+{
+ PGconn *pgc;
+ Oid oid;
+ jsdouble v;
+
+ if (argc != 1) {
+ QUEUE_EXCEPTION("Wrong number of arguments");
+ goto err;
+ }
+ if (!JSVAL_IS_NUMBER(argv[0]) || !JS_ValueToNumber(cx, argv[0], &v)) {
+ QUEUE_EXCEPTION("Argument 1 not a number");
+ goto err;
+ }
+
+ pgc = JS_GetInstancePrivate(cx, obj, &pgconn_class, NULL);
+ assert(pgc != NULL);
+
+ oid = lo_create(pgc, (Oid)v);
+
+ if (!JS_NewDoubleValue(cx, (jsdouble)oid, rval)) {
+ QUEUE_EXCEPTION("Internal error!");
+ goto err;
+ }
+
+ return JS_TRUE;
+
+err:
+ *rval = OBJECT_TO_JSVAL(NULL);
+
+ return JS_FALSE;
+}
+
+static JSBool
+pgconn_m_lo_import(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
+ jsval *rval)
+{
+ PGconn *pgc;
+ Oid oid;
+ char *str;
+
+ if (argc != 1) {
+ QUEUE_EXCEPTION("Wrong number of arguments");
+ goto err;
+ }
+ if (!JSVAL_IS_STRING(argv[0]) ||
+ ((str = JS_GetStringBytes(JSVAL_TO_STRING(argv[0])))) == NULL) {
+ QUEUE_EXCEPTION("Argument 1 not a String");
+ goto err;
+ }
+
+ /* XXX Perform path/access sanity checking */
+
+ pgc = JS_GetInstancePrivate(cx, obj, &pgconn_class, NULL);
+ assert(pgc != NULL);
+
+ oid = lo_import(pgc, str);
+
+ if (!JS_NewDoubleValue(cx, (jsdouble)oid, rval)) {
+ QUEUE_EXCEPTION("Internal error!");
+ goto err;
+ }
+
+ return JS_TRUE;
+
+err:
+ *rval = OBJECT_TO_JSVAL(NULL);
+
+ return JS_FALSE;
+}
+
+static JSBool
+pgconn_m_lo_export(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
+ jsval *rval)
+{
+ PGconn *pgc;
+ jsdouble v;
+ char *str;
+ int r;
+
+ if (argc != 2) {
+ QUEUE_EXCEPTION("Wrong number of arguments");
+ goto err;
+ }
+ if (!JSVAL_IS_NUMBER(argv[0]) || !JS_ValueToNumber(cx, argv[0], &v)) {
+ QUEUE_EXCEPTION("Argument 1 not a number");
+ goto err;
+ }
+ if (!JSVAL_IS_STRING(argv[1]) ||
+ ((str = JS_GetStringBytes(JSVAL_TO_STRING(argv[1])))) == NULL) {
+ QUEUE_EXCEPTION("Argument 2 not a String");
+ goto err;
+ }
+
+ /* XXX Perform path/access sanity checking */
+
+ pgc = JS_GetInstancePrivate(cx, obj, &pgconn_class, NULL);
+ assert(pgc != NULL);
+
+ r = lo_export(pgc, (Oid)v, str);
+ *rval = INT_TO_JSVAL(r);
+
+ return JS_TRUE;
+
+err:
+ *rval = OBJECT_TO_JSVAL(NULL);
+
+ return JS_FALSE;
+}
+
+/*
+ * Unlike FD.open(), we don't wrap the provided integer descriptor into an
+ * object and define read()/write() function as object methods.
+ * This integer descriptor automatically becomes invalid once the transaction
+ * terminates and as such doesn't require automatic finalization.
+ */
+static JSBool
+pgconn_m_lo_open(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
+ jsval *rval)
+{
+ PGconn *pgc;
+ jsdouble v;
+ int r;
+
+ if (argc != 2) {
+ QUEUE_EXCEPTION("Wrong number of arguments");
+ goto err;
+ }
+ if (!JSVAL_IS_NUMBER(argv[0]) || !JS_ValueToNumber(cx, argv[0], &v)) {
+ QUEUE_EXCEPTION("Argument 1 not a number");
+ goto err;
+ }
+ if (!JSVAL_IS_INT(argv[1])) {
+ QUEUE_EXCEPTION("Argument 2 not an Integer");
+ goto err;
+ }
+
+ pgc = JS_GetInstancePrivate(cx, obj, &pgconn_class, NULL);
+ assert(pgc != NULL);
+
+ r = lo_open(pgc, (Oid)v, JSVAL_TO_INT(argv[1]));
+ *rval = INT_TO_JSVAL(r);
+
+ return JS_TRUE;
+
+err:
+ *rval = OBJECT_TO_JSVAL(NULL);
+
+ return JS_FALSE;
+}
+
+/*
+ * Unlike lo_write(), does not need a length argument, since we can obtain it
+ * using the JS string length. Moreover, we convert to a string whatever type
+ * of data was provided to us.
+ */
+static JSBool
+pgconn_m_lo_write(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
+ jsval *rval)
+{
+ PGconn *pgc;
+ JSString *str;
+ char *bytes;
+ size_t size;
+ int r;
+
+ if (argc != 2) {
+ QUEUE_EXCEPTION("Wrong number of arguments");
+ goto err;
+ }
+ if (!JSVAL_IS_INT(argv[0])) {
+ QUEUE_EXCEPTION("Argument 1 not an Integer");
+ goto err;
+ }
+
+ /* Convert argv[1] to a JSString */
+ if ((str = JS_ValueToString(cx, argv[1])) == NULL ||
+ (bytes = JS_GetStringBytes(str)) == NULL) {
+ QUEUE_EXCEPTION("Internal error!");
+ goto err;
+ }
+ size = JS_GetStringLength(str);
+
+ pgc = JS_GetInstancePrivate(cx, obj, &pgconn_class, NULL);
+ assert(pgc != NULL);
+
+ r = lo_write(pgc, JSVAL_TO_INT(argv[0]), bytes, size);
+ *rval = INT_TO_JSVAL(r);
+
+ return JS_TRUE;
+
+err:
+ *rval = OBJECT_TO_JSVAL(NULL);
+
+ return JS_FALSE;
+}
+
+/*
+ * Unlike lo_read(), returns a JS String object rather than being provided a
+ * buffer to fill.
+ */
+static JSBool
+pgconn_m_lo_read(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
+ jsval *rval)
+{
+ PGconn *pgc;
+ JSString *str;
+ uint32 size;
+ int ret;
+
+ if (argc != 2) {
+ QUEUE_EXCEPTION("Wrong number of arguments");
+ goto err;
+ }
+ if (!JSVAL_IS_INT(argv[0])) {
+ QUEUE_EXCEPTION("Argument 1 not an Integer");
+ goto err;
+ }
+ if (!JSVAL_IS_NUMBER(argv[1]) ||
+ !JS_ValueToECMAUint32(cx, argv[1], &size)) {
+ QUEUE_EXCEPTION("Argument 1 not a number");
+ goto err;
+ }
+
+ pgc = JS_GetInstancePrivate(cx, obj, &pgconn_class, NULL);
+ assert(pgc != NULL);
+
+ if (buffer_grow((size_t)size) == -1) {
+ QUEUE_EXCEPTION("Out of memory!");
+ goto err;
+ }
+
+ if ((ret = lo_read(pgc, JSVAL_TO_INT(argv[0]), buffer, (size_t)size))
+ < 0) {
+ QUEUE_EXCEPTION("lo_read()");
+ goto err;
+ }
+
+ if ((str = JS_NewStringCopyN(cx, buffer, (size_t)size)) == NULL) {
+ QUEUE_EXCEPTION("Out of memory!");
+ goto err;
+ }
+
+ *rval = STRING_TO_JSVAL(str);
+
+ return JS_TRUE;
+
+err:
+ *rval = OBJECT_TO_JSVAL(NULL);
+
+ return JS_FALSE;
+}
+
+static JSBool
+pgconn_m_lo_lseek(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
+ jsval *rval)
+{
+ PGconn *pgc;
+ int r;
+
+ if (argc != 3) {
+ QUEUE_EXCEPTION("Wrong number of arguments");
+ goto err;
+ }
+ if (!JSVAL_IS_INT(argv[0])) {
+ QUEUE_EXCEPTION("Argument 1 not an Integer");
+ goto err;
+ }
+ if (!JSVAL_IS_INT(argv[1])) {
+ QUEUE_EXCEPTION("Argument 2 not an Integer");
+ goto err;
+ }
+ if (!JSVAL_IS_INT(argv[2])) {
+ QUEUE_EXCEPTION("Argument 3 not an Integer");
+ goto err;
+ }
+
+ pgc = JS_GetInstancePrivate(cx, obj, &pgconn_class, NULL);
+ assert(pgc != NULL);
+
+ r = lo_lseek(pgc, JSVAL_TO_INT(argv[0]), JSVAL_TO_INT(argv[1]),
+ JSVAL_TO_INT(argv[2]));
+ *rval = INT_TO_JSVAL(r);
+
+ return JS_TRUE;
+
+err:
+ *rval = OBJECT_TO_JSVAL(NULL);
+
+ return JS_FALSE;
+}
+
+static JSBool
+pgconn_m_lo_tell(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
+ jsval *rval)
+{
+ PGconn *pgc;
+ int r;
+
+ if (argc != 1) {
+ QUEUE_EXCEPTION("Wrong number of arguments");
+ goto err;
+ }
+ if (!JSVAL_IS_INT(argv[0])) {
+ QUEUE_EXCEPTION("Argument 1 not an Integer");
+ goto err;
+ }
+
+ pgc = JS_GetInstancePrivate(cx, obj, &pgconn_class, NULL);
+ assert(pgc != NULL);
+
+ r = lo_tell(pgc, JSVAL_TO_INT(argv[0]));
+ *rval = INT_TO_JSVAL(r);
+
+ return JS_TRUE;
+
+err:
+ *rval = OBJECT_TO_JSVAL(NULL);
+
+ return JS_FALSE;
+}
+
+static JSBool
+pgconn_m_lo_close(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
+ jsval *rval)
+{
+ PGconn *pgc;
+ int r;
+
+ if (argc != 1) {
+ QUEUE_EXCEPTION("Wrong number of arguments");
+ goto err;
+ }
+ if (!JSVAL_IS_INT(argv[0])) {
+ QUEUE_EXCEPTION("Argument 1 not an Integer");
+ goto err;
+ }
+
+ pgc = JS_GetInstancePrivate(cx, obj, &pgconn_class, NULL);
+ assert(pgc != NULL);
+
+ r = lo_close(pgc, JSVAL_TO_INT(argv[0]));
+ *rval = INT_TO_JSVAL(r);
+
+ return JS_TRUE;
+
+err:
+ *rval = OBJECT_TO_JSVAL(NULL);
+
+ return JS_FALSE;
+}
+
+static JSBool
+pgconn_m_lo_unlink(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
+ jsval *rval)
+{
+ PGconn *pgc;
+ jsdouble v;
+ int r;
+
+ if (argc != 1) {
+ QUEUE_EXCEPTION("Wrong number of arguments");
+ goto err;
+ }
+ if (!JSVAL_IS_NUMBER(argv[0]) || !JS_ValueToNumber(cx, argv[0], &v)) {
+ QUEUE_EXCEPTION("Argument 1 not a number");
+ goto err;
+ }
+
+ pgc = JS_GetInstancePrivate(cx, obj, &pgconn_class, NULL);
+ assert(pgc != NULL);
+
+ r = lo_unlink(pgc, (Oid)v);
+ *rval = INT_TO_JSVAL(r);
+
+ return JS_TRUE;
+
+err:
+ *rval = OBJECT_TO_JSVAL(NULL);
+
+ return JS_FALSE;
+}
+
/*
* PGresult object control
jsval *rval)
{
PGresult *pgr;
+ int r;
if (argc != 0) {
QUEUE_EXCEPTION("Function allows no arguments");
pgr = JS_GetInstancePrivate(cx, obj, &pgresult_class, NULL);
assert(pgr != NULL);
- *rval = INT_TO_JSVAL(PQntuples(pgr));
+ r = PQntuples(pgr);
+ *rval = INT_TO_JSVAL(r);
return JS_TRUE;
}
jsval *rval)
{
PGresult *pgr;
+ int r;
if (argc != 0) {
QUEUE_EXCEPTION("Function allows no arguments");
pgr = JS_GetInstancePrivate(cx, obj, &pgresult_class, NULL);
assert(pgr != NULL);
- *rval = INT_TO_JSVAL(PQnfields(pgr));
+ r = PQnfields(pgr);
+ *rval = INT_TO_JSVAL(r);
return JS_TRUE;
}
{
PGresult *pgr;
char *str;
+ int r;
if (argc != 1) {
QUEUE_EXCEPTION("Wrong number of arguments");
goto err;
}
- if (!JSVAL_IS_STRING(argv[0])) {
+ if (!JSVAL_IS_STRING(argv[0]) ||
+ (str = JS_GetStringBytes(JSVAL_TO_STRING(argv[0]))) == NULL) {
QUEUE_EXCEPTION("Argument not a String");
goto err;
}
- str = JS_GetStringBytes(JSVAL_TO_STRING(argv[0]));
pgr = JS_GetInstancePrivate(cx, obj, &pgresult_class, NULL);
assert(pgr != NULL);
- *rval = INT_TO_JSVAL(PQfnumber(pgr, str));
+ r = PQfnumber(pgr, str);
+ *rval = INT_TO_JSVAL(r);
return JS_TRUE;
err:
jsval *rval)
{
PGresult *pgr;
+ int r;
if (argc != 1) {
QUEUE_EXCEPTION("Wrong number of arguments");
pgr = JS_GetInstancePrivate(cx, obj, &pgresult_class, NULL);
assert(pgr != NULL);
- *rval = INT_TO_JSVAL(PQftablecol(pgr, JSVAL_TO_INT(argv[0])));
+ r = PQftablecol(pgr, JSVAL_TO_INT(argv[0]));
+ *rval = INT_TO_JSVAL(r);
return JS_TRUE;
jsval *rval)
{
PGresult *pgr;
+ int r;
if (argc != 1) {
QUEUE_EXCEPTION("Wrong number of arguments");
pgr = JS_GetInstancePrivate(cx, obj, &pgresult_class, NULL);
assert(pgr != NULL);
- *rval = INT_TO_JSVAL(PQfformat(pgr, JSVAL_TO_INT(argv[0])));
+ r = PQfformat(pgr, JSVAL_TO_INT(argv[0]));
+ *rval = INT_TO_JSVAL(r);
return JS_TRUE;
jsval *rval)
{
PGresult *pgr;
+ int r;
if (argc != 1) {
QUEUE_EXCEPTION("Wrong number of arguments");
pgr = JS_GetInstancePrivate(cx, obj, &pgresult_class, NULL);
assert(pgr != NULL);
- *rval = INT_TO_JSVAL(PQfmod(pgr, JSVAL_TO_INT(argv[0])));
+ r = PQfmod(pgr, JSVAL_TO_INT(argv[0]));
+ *rval = INT_TO_JSVAL(r);
return JS_TRUE;
jsval *rval)
{
PGresult *pgr;
+ int r;
if (argc != 1) {
QUEUE_EXCEPTION("Wrong number of arguments");
pgr = JS_GetInstancePrivate(cx, obj, &pgresult_class, NULL);
assert(pgr != NULL);
- *rval = INT_TO_JSVAL(PQfsize(pgr, JSVAL_TO_INT(argv[0])));
+ r = PQfsize(pgr, JSVAL_TO_INT(argv[0]));
+ *rval = INT_TO_JSVAL(r);
return JS_TRUE;
jsval *argv, jsval *rval)
{
PGresult *pgr;
+ int r;
if (argc != 0) {
QUEUE_EXCEPTION("Function allows no arguments");
pgr = JS_GetInstancePrivate(cx, obj, &pgresult_class, NULL);
assert(pgr != NULL);
- *rval = INT_TO_JSVAL(PQbinaryTuples(pgr));
+ r = PQbinaryTuples(pgr);
+ *rval = INT_TO_JSVAL(r);
return JS_TRUE;
}
jsval *rval)
{
PGresult *pgr;
+ int r;
if (argc != 2) {
QUEUE_EXCEPTION("Wrong number of arguments");
pgr = JS_GetInstancePrivate(cx, obj, &pgresult_class, NULL);
assert(pgr != NULL);
- *rval = INT_TO_JSVAL(PQgetlength(pgr, JSVAL_TO_INT(argv[0]),
- JSVAL_TO_INT(argv[1])));
+ r = PQgetlength(pgr, JSVAL_TO_INT(argv[0]), JSVAL_TO_INT(argv[1]));
+ *rval = INT_TO_JSVAL(r);
return JS_TRUE;
char *str;
size_t len;
JSString *s;
+ int r;
if (argc != 1) {
QUEUE_EXCEPTION("Wrong number of arguments");
assert(pgc != NULL);
s = JSVAL_TO_STRING(argv[0]);
- str = JS_GetStringBytes(s);
+ if ((str = JS_GetStringBytes(s)) == NULL) {
+ QUEUE_EXCEPTION("Internal error!");
+ goto err;
+ }
len = JS_GetStringLength(s);
- *rval = INT_TO_JSVAL(PQcancel(pgc, str, len));
+ r = PQcancel(pgc, str, len);
+ *rval = INT_TO_JSVAL(r);
return JS_TRUE;