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 + -
显示快捷键?