pgtclcmds.c
来自「PostgreSQL7.4.6 for Linux」· C语言 代码 · 共 2,082 行 · 第 1/4 页
C
2,082 行
fname = PQfname(result, i); value = PQgetvalue(result, tupno, i); if (array_varname != NULL) { if (Tcl_SetVar2(interp, array_varname, fname, value, TCL_LEAVE_ERR_MSG) == NULL) return TCL_ERROR; } else { if (Tcl_SetVar(interp, fname, value, TCL_LEAVE_ERR_MSG) == NULL) return TCL_ERROR; } } return TCL_OK;}/********************************** * pg_lo_open open a large object syntax: pg_lo_open conn objOid mode where mode can be either 'r', 'w', or 'rw'**********************/intPg_lo_open(ClientData cData, Tcl_Interp *interp, int argc, CONST84 char *argv[]){ PGconn *conn; int lobjId; int mode; int fd; if (argc != 4) { Tcl_AppendResult(interp, "Wrong # of arguments\n", "pg_lo_open connection lobjOid mode", 0); return TCL_ERROR; } conn = PgGetConnectionId(interp, argv[1], (Pg_ConnectionId **) NULL); if (conn == (PGconn *) NULL) return TCL_ERROR; lobjId = atoi(argv[2]); if (strlen(argv[3]) < 1 || strlen(argv[3]) > 2) { Tcl_AppendResult(interp, "mode argument must be 'r', 'w', or 'rw'", 0); return TCL_ERROR; } switch (argv[3][0]) { case 'r': case 'R': mode = INV_READ; break; case 'w': case 'W': mode = INV_WRITE; break; default: Tcl_AppendResult(interp, "mode argument must be 'r', 'w', or 'rw'", 0); return TCL_ERROR; } switch (argv[3][1]) { case '\0': break; case 'r': case 'R': mode |= INV_READ; break; case 'w': case 'W': mode |= INV_WRITE; break; default: Tcl_AppendResult(interp, "mode argument must be 'r', 'w', or 'rw'", 0); return TCL_ERROR; } fd = lo_open(conn, lobjId, mode); sprintf(interp->result, "%d", fd); return TCL_OK;}/********************************** * pg_lo_close close a large object syntax: pg_lo_close conn fd**********************/intPg_lo_close(ClientData cData, Tcl_Interp *interp, int argc, CONST84 char *argv[]){ PGconn *conn; int fd; if (argc != 3) { Tcl_AppendResult(interp, "Wrong # of arguments\n", "pg_lo_close connection fd", 0); return TCL_ERROR; } conn = PgGetConnectionId(interp, argv[1], (Pg_ConnectionId **) NULL); if (conn == (PGconn *) NULL) return TCL_ERROR; fd = atoi(argv[2]); sprintf(interp->result, "%d", lo_close(conn, fd)); return TCL_OK;}/********************************** * pg_lo_read reads at most len bytes from a large object into a variable named bufVar syntax: pg_lo_read conn fd bufVar len bufVar is the name of a variable in which to store the contents of the read**********************/#ifdef PGTCL_USE_TCLOBJintPg_lo_read(ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]){ PGconn *conn; int fd; int nbytes = 0; char *buf; Tcl_Obj *bufVar; Tcl_Obj *bufObj; int len; int rc = TCL_OK; if (objc != 5) { Tcl_AppendResult(interp, "Wrong # of arguments\n", " pg_lo_read conn fd bufVar len", 0); return TCL_ERROR; } conn = PgGetConnectionId(interp, Tcl_GetStringFromObj(objv[1], NULL), (Pg_ConnectionId **) NULL); if (conn == (PGconn *) NULL) return TCL_ERROR; if (Tcl_GetIntFromObj(interp, objv[2], &fd) != TCL_OK) return TCL_ERROR; bufVar = objv[3]; if (Tcl_GetIntFromObj(interp, objv[4], &len) != TCL_OK) return TCL_ERROR; if (len <= 0) { Tcl_SetObjResult(interp, Tcl_NewIntObj(nbytes)); return TCL_OK; } buf = ckalloc(len + 1); nbytes = lo_read(conn, fd, buf, len); if (nbytes >= 0) {#if TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION >= 1 || TCL_MAJOR_VERSION > 8 bufObj = Tcl_NewByteArrayObj(buf, nbytes);#else bufObj = Tcl_NewStringObj(buf, nbytes);#endif if (Tcl_ObjSetVar2(interp, bufVar, NULL, bufObj, TCL_LEAVE_ERR_MSG | TCL_PARSE_PART1) == NULL) rc = TCL_ERROR; } if (rc == TCL_OK) Tcl_SetObjResult(interp, Tcl_NewIntObj(nbytes)); ckfree(buf); return rc;}#elseintPg_lo_read(ClientData cData, Tcl_Interp *interp, int argc, CONST84 char *argv[]){ PGconn *conn; int fd; int nbytes = 0; char *buf; char *bufVar; int len; if (argc != 5) { Tcl_AppendResult(interp, "Wrong # of arguments\n", " pg_lo_read conn fd bufVar len", 0); return TCL_ERROR; } conn = PgGetConnectionId(interp, argv[1], (Pg_ConnectionId **) NULL); if (conn == (PGconn *) NULL) return TCL_ERROR; fd = atoi(argv[2]); bufVar = argv[3]; len = atoi(argv[4]); if (len <= 0) { sprintf(interp->result, "%d", nbytes); return TCL_OK; } buf = ckalloc(len + 1); nbytes = lo_read(conn, fd, buf, len); if (nbytes >= 0) Tcl_SetVar(interp, bufVar, buf, TCL_LEAVE_ERR_MSG); sprintf(interp->result, "%d", nbytes); ckfree(buf); return TCL_OK;}#endif/***********************************Pg_lo_write write at most len bytes to a large object syntax: pg_lo_write conn fd buf len***********************************/#ifdef PGTCL_USE_TCLOBJintPg_lo_write(ClientData cData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]){ PGconn *conn; char *buf; int fd; int nbytes = 0; int len; if (objc != 5) { Tcl_AppendResult(interp, "Wrong # of arguments\n", "pg_lo_write conn fd buf len", 0); return TCL_ERROR; } conn = PgGetConnectionId(interp, Tcl_GetStringFromObj(objv[1], NULL), (Pg_ConnectionId **) NULL); if (conn == (PGconn *) NULL) return TCL_ERROR; if (Tcl_GetIntFromObj(interp, objv[2], &fd) != TCL_OK) return TCL_ERROR;#if TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION >= 1 || TCL_MAJOR_VERSION > 8 buf = Tcl_GetByteArrayFromObj(objv[3], &nbytes);#else buf = Tcl_GetStringFromObj(objv[3], &nbytes);#endif if (Tcl_GetIntFromObj(interp, objv[4], &len) != TCL_OK) return TCL_ERROR; if (len > nbytes) len = nbytes; if (len <= 0) { Tcl_SetObjResult(interp, Tcl_NewIntObj(0)); return TCL_OK; } nbytes = lo_write(conn, fd, buf, len); Tcl_SetObjResult(interp, Tcl_NewIntObj(nbytes)); return TCL_OK;}#elseintPg_lo_write(ClientData cData, Tcl_Interp *interp, int argc, CONST84 char *argv[]){ PGconn *conn; char *buf; int fd; int nbytes = 0; int len; if (argc != 5) { Tcl_AppendResult(interp, "Wrong # of arguments\n", "pg_lo_write conn fd buf len", 0); return TCL_ERROR; } conn = PgGetConnectionId(interp, argv[1], (Pg_ConnectionId **) NULL); if (conn == (PGconn *) NULL) return TCL_ERROR; fd = atoi(argv[2]); buf = argv[3]; len = atoi(argv[4]); if (len <= 0) { sprintf(interp->result, "%d", nbytes); return TCL_OK; } nbytes = lo_write(conn, fd, buf, len); sprintf(interp->result, "%d", nbytes); return TCL_OK;}#endif/***********************************Pg_lo_lseek seek to a certain position in a large objectsyntax pg_lo_lseek conn fd offset whencewhence can be either"SEEK_CUR", "SEEK_END", or "SEEK_SET"***********************************/intPg_lo_lseek(ClientData cData, Tcl_Interp *interp, int argc, CONST84 char *argv[]){ PGconn *conn; int fd; const char *whenceStr; int offset, whence; if (argc != 5) { Tcl_AppendResult(interp, "Wrong # of arguments\n", "pg_lo_lseek conn fd offset whence", 0); return TCL_ERROR; } conn = PgGetConnectionId(interp, argv[1], (Pg_ConnectionId **) NULL); if (conn == (PGconn *) NULL) return TCL_ERROR; fd = atoi(argv[2]); offset = atoi(argv[3]); whenceStr = argv[4]; if (strcmp(whenceStr, "SEEK_SET") == 0) whence = SEEK_SET; else if (strcmp(whenceStr, "SEEK_CUR") == 0) whence = SEEK_CUR; else if (strcmp(whenceStr, "SEEK_END") == 0) whence = SEEK_END; else { Tcl_AppendResult(interp, "the whence argument to Pg_lo_lseek must be SEEK_SET, SEEK_CUR or SEEK_END", 0); return TCL_ERROR; } sprintf(interp->result, "%d", lo_lseek(conn, fd, offset, whence)); return TCL_OK;}/***********************************Pg_lo_creat create a new large object with mode syntax: pg_lo_creat conn modemode can be any OR'ing together of INV_READ, INV_WRITE,for now, we don't support any additional storage managers.***********************************/intPg_lo_creat(ClientData cData, Tcl_Interp *interp, int argc, CONST84 char *argv[]){ PGconn *conn; char *modeStr; char *modeWord; int mode; if (argc != 3) { Tcl_AppendResult(interp, "Wrong # of arguments\n", "pg_lo_creat conn mode", 0); return TCL_ERROR; } conn = PgGetConnectionId(interp, argv[1], (Pg_ConnectionId **) NULL); if (conn == (PGconn *) NULL) return TCL_ERROR; modeStr = strdup(argv[2]); modeWord = strtok(modeStr, "|"); if (strcmp(modeWord, "INV_READ") == 0) mode = INV_READ; else if (strcmp(modeWord, "INV_WRITE") == 0) mode = INV_WRITE; else { Tcl_AppendResult(interp, "invalid mode argument to Pg_lo_creat\nmode argument must be some OR'd combination of INV_READ, and INV_WRITE", 0); free(modeStr); return TCL_ERROR; } while ((modeWord = strtok((char *) NULL, "|")) != NULL) { if (strcmp(modeWord, "INV_READ") == 0) mode |= INV_READ; else if (strcmp(modeWord, "INV_WRITE") == 0) mode |= INV_WRITE; else { Tcl_AppendResult(interp, "invalid mode argument to Pg_lo_creat\nmode argument must be some OR'd combination of INV_READ, INV_WRITE", 0); free(modeStr); return TCL_ERROR; } } sprintf(interp->result, "%d", lo_creat(conn, mode)); free(modeStr); return TCL_OK;}/***********************************Pg_lo_tell returns the current seek location of the large object syntax: pg_lo_tell conn fd***********************************/intPg_lo_tell(ClientData cData, Tcl_Interp *interp, int argc, CONST84 char *argv[]){ PGconn *conn; int fd; if (argc != 3) { Tcl_AppendResult(interp, "Wrong # of arguments\n", "pg_lo_tell conn fd", 0); return TCL_ERROR; } conn = PgGetConnectionId(interp, argv[1], (Pg_ConnectionId **) NULL); if (conn == (PGconn *) NULL) return TCL_ERROR; fd = atoi(argv[2]); sprintf(interp->result, "%d", lo_tell(conn, fd)); return TCL_OK;}/***********************************Pg_lo_unlink unlink a file based on lobject id syntax: pg_lo_unlink conn lobjId***********************************/intPg_lo_unlink(ClientData cData, Tcl_Interp *interp, int argc, CONST84 char *argv[]){ PGconn *conn; int lobjId; int retval; if (argc != 3) { Tcl_AppendResult(interp, "Wrong # of arguments\n", "pg_lo_tell conn fd", 0); return TCL_ERROR; } conn = PgGetConnectionId(interp, argv[1], (Pg_ConnectionId **) NULL); if (conn == (PGconn *) NULL) return TCL_ERROR; lobjId = atoi(argv[2]); retval = lo_unlink(conn, lobjId); if (retval == -1) {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?