⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pgsql.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,								 "l", &oid_long) == SUCCESS) {		if (oid_long <= InvalidOid) {			php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Invalid OID is specified");			RETURN_FALSE;		}		oid = (Oid)oid_long;		id = PGG(default_link);		CHECK_DEFAULT_LINK(id);	}	else {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Requires 1 or 2 arguments");		RETURN_FALSE;	}	if (pgsql_link == NULL && id == -1) {		RETURN_FALSE;	}		ZEND_FETCH_RESOURCE2(pgsql, PGconn *, &pgsql_link, id, "PostgreSQL link", le_link, le_plink);	if (lo_unlink(pgsql, oid) == -1) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to delete PostgreSQL large object %u", oid);		RETURN_FALSE;	}	RETURN_TRUE;}/* }}} *//* {{{ proto resource pg_lo_open([resource connection,] int large_object_oid, string mode)   Open a large object and return fd */PHP_FUNCTION(pg_lo_open){	zval *pgsql_link = NULL;	long oid_long;	char *oid_string, *end_ptr, *mode_string;	int oid_strlen, mode_strlen;	PGconn *pgsql;	Oid oid;	int id = -1, pgsql_mode=0, pgsql_lofd;	int create=0;	pgLofp *pgsql_lofp;	int argc = ZEND_NUM_ARGS();	/* accept string type since Oid is unsigned int */	if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,								 "rss", &pgsql_link, &oid_string, &oid_strlen, &mode_string, &mode_strlen) == SUCCESS) {		oid = (Oid)strtoul(oid_string, &end_ptr, 10);		if ((oid_string+oid_strlen) != end_ptr) {			/* wrong integer format */			php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Wrong OID value passed");			RETURN_FALSE;		}	}	else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,								 "rls", &pgsql_link, &oid_long, &mode_string, &mode_strlen) == SUCCESS) {		if (oid_long <= InvalidOid) {			php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Invalid OID specified");			RETURN_FALSE;		}		oid = (Oid)oid_long;	}	else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,								 "ss", &oid_string, &oid_strlen, &mode_string, &mode_strlen) == SUCCESS) {		oid = (Oid)strtoul(oid_string, &end_ptr, 10);		if ((oid_string+oid_strlen) != end_ptr) {			/* wrong integer format */			php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Wrong OID value passed");			RETURN_FALSE;		}		id = PGG(default_link);		CHECK_DEFAULT_LINK(id);	}	else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,								 "ls", &oid_long, &mode_string, &mode_strlen) == SUCCESS) {		if (oid_long <= InvalidOid) {			php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Invalid OID specified");			RETURN_FALSE;		}		oid = (Oid)oid_long;		id = PGG(default_link);		CHECK_DEFAULT_LINK(id);	}	else {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Requires 1 or 2 arguments");		RETURN_FALSE;	}	if (pgsql_link == NULL && id == -1) {		RETURN_FALSE;	}		ZEND_FETCH_RESOURCE2(pgsql, PGconn *, &pgsql_link, id, "PostgreSQL link", le_link, le_plink);		/* r/w/+ is little bit more PHP-like than INV_READ/INV_WRITE and a lot of	   faster to type. Unfortunately, doesn't behave the same way as fopen()...	   (Jouni)	*/	if (strchr(mode_string, 'r') == mode_string) {		pgsql_mode |= INV_READ;		if (strchr(mode_string, '+') == mode_string+1) {			pgsql_mode |= INV_WRITE;		}	}	if (strchr(mode_string, 'w') == mode_string) {		pgsql_mode |= INV_WRITE;		create = 1;		if (strchr(mode_string, '+') == mode_string+1) {			pgsql_mode |= INV_READ;		}	}	pgsql_lofp = (pgLofp *) emalloc(sizeof(pgLofp));	if ((pgsql_lofd = lo_open(pgsql, oid, pgsql_mode)) == -1) {		if (create) {			if ((oid = lo_creat(pgsql, INV_READ|INV_WRITE)) == 0) {				efree(pgsql_lofp);				php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to create PostgreSQL large object");				RETURN_FALSE;			} else {				if ((pgsql_lofd = lo_open(pgsql, oid, pgsql_mode)) == -1) {					if (lo_unlink(pgsql, oid) == -1) {						efree(pgsql_lofp);						php_error_docref(NULL TSRMLS_CC, E_WARNING, "Something is really messed up! Your database is badly corrupted in a way NOT related to PHP");						RETURN_FALSE;					}					efree(pgsql_lofp);					php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to open PostgreSQL large object");					RETURN_FALSE;				} else {					pgsql_lofp->conn = pgsql;					pgsql_lofp->lofd = pgsql_lofd;					Z_LVAL_P(return_value) = zend_list_insert(pgsql_lofp, le_lofp);					Z_TYPE_P(return_value) = IS_LONG;				}			}		} else {			efree(pgsql_lofp);			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to open PostgreSQL large object");			RETURN_FALSE;		}	} else {		pgsql_lofp->conn = pgsql;		pgsql_lofp->lofd = pgsql_lofd;		ZEND_REGISTER_RESOURCE(return_value, pgsql_lofp, le_lofp);	}}/* }}} *//* {{{ proto bool pg_lo_close(resource large_object)   Close a large object */PHP_FUNCTION(pg_lo_close){	zval **pgsql_lofp;	pgLofp *pgsql;	switch(ZEND_NUM_ARGS()) {		case 1:			if (zend_get_parameters_ex(1, &pgsql_lofp)==FAILURE) {				RETURN_FALSE;			}			break;		default:			WRONG_PARAM_COUNT;			break;	}	ZEND_FETCH_RESOURCE(pgsql, pgLofp *, pgsql_lofp, -1, "PostgreSQL large object", le_lofp);		if (lo_close((PGconn *)pgsql->conn, pgsql->lofd) < 0) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to close PostgreSQL large object descriptor %d", pgsql->lofd);		RETVAL_FALSE;	} else {		RETVAL_TRUE;	}	zend_list_delete(Z_RESVAL_PP(pgsql_lofp));	return;}/* }}} */#define PGSQL_LO_READ_BUF_SIZE  8192/* {{{ proto string pg_lo_read(resource large_object [, int len])   Read a large object */PHP_FUNCTION(pg_lo_read){  	zval **pgsql_id, **len;	int buf_len = PGSQL_LO_READ_BUF_SIZE, nbytes;	char *buf;	pgLofp *pgsql;	if (ZEND_NUM_ARGS() < 1 || ZEND_NUM_ARGS() > 2 ||	    zend_get_parameters_ex(ZEND_NUM_ARGS(), &pgsql_id, &len) == FAILURE) {		WRONG_PARAM_COUNT;	}	ZEND_FETCH_RESOURCE(pgsql, pgLofp *, pgsql_id, -1, "PostgreSQL large object", le_lofp);	if (ZEND_NUM_ARGS() > 1) {		convert_to_long_ex(len);		buf_len = Z_LVAL_PP(len);	}		buf = (char *) safe_emalloc(sizeof(char), (buf_len+1), 0);	if ((nbytes = lo_read((PGconn *)pgsql->conn, pgsql->lofd, buf, buf_len))<0) {		efree(buf);		RETURN_FALSE;	}	buf[nbytes] = '\0';	RETURN_STRINGL(buf, nbytes, 0);}/* }}} *//* {{{ proto int pg_lo_write(resource large_object, string buf [, int len])   Write a large object */PHP_FUNCTION(pg_lo_write){  	zval **pgsql_id, **str, **z_len;	int nbytes;	int len;	pgLofp *pgsql;	int argc = ZEND_NUM_ARGS();	if (argc < 2 || argc > 3 ||	    zend_get_parameters_ex(argc, &pgsql_id, &str, &z_len) == FAILURE) {		WRONG_PARAM_COUNT;	}	convert_to_string_ex(str);	if (argc > 2) {		convert_to_long_ex(z_len);		if (Z_LVAL_PP(z_len) > Z_STRLEN_PP(str)) {			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot write more than buffer size %d. Tried to write %ld",							Z_STRLEN_PP(str), Z_LVAL_PP(z_len));			RETURN_FALSE;		}		if (Z_LVAL_PP(z_len) < 0) {			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Buffer size must be larger than 0, but %ld was specified", Z_LVAL_PP(z_len));			RETURN_FALSE;		}		len = Z_LVAL_PP(z_len);	}	else {		len = Z_STRLEN_PP(str);	}	ZEND_FETCH_RESOURCE(pgsql, pgLofp *, pgsql_id, -1, "PostgreSQL large object", le_lofp);	if ((nbytes = lo_write((PGconn *)pgsql->conn, pgsql->lofd, Z_STRVAL_PP(str), len)) == -1) {		RETURN_FALSE;	}	RETURN_LONG(nbytes);}/* }}} *//* {{{ proto int pg_lo_read_all(resource large_object)   Read a large object and send straight to browser */PHP_FUNCTION(pg_lo_read_all){  	zval **pgsql_id;	int tbytes;	volatile int nbytes;	char buf[PGSQL_LO_READ_BUF_SIZE];	pgLofp *pgsql;	switch(ZEND_NUM_ARGS()) {		case 1:			if (zend_get_parameters_ex(1, &pgsql_id)==FAILURE) {				RETURN_FALSE;			}			break;		default:			WRONG_PARAM_COUNT;			break;	}	ZEND_FETCH_RESOURCE(pgsql, pgLofp *, pgsql_id, -1, "PostgreSQL large object", le_lofp);	tbytes = 0;	while ((nbytes = lo_read((PGconn *)pgsql->conn, pgsql->lofd, buf, PGSQL_LO_READ_BUF_SIZE))>0) {		php_body_write(buf, nbytes TSRMLS_CC);		tbytes += nbytes;	}	RETURN_LONG(tbytes);}/* }}} *//* {{{ proto int pg_lo_import([resource connection, ] string filename)   Import large object direct from filesystem */PHP_FUNCTION(pg_lo_import){	zval *pgsql_link = NULL;	char *file_in;	int id = -1, name_len;	int argc = ZEND_NUM_ARGS();	PGconn *pgsql;	Oid oid;	if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,								 "rs", &pgsql_link, &file_in, &name_len) == SUCCESS) {		;	}	else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,									  "s", &file_in, &name_len) == SUCCESS) {		id = PGG(default_link);		CHECK_DEFAULT_LINK(id);	}	else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,									  "sr", &file_in, &name_len, &pgsql_link ) == SUCCESS) {		php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Old API is used");	}	else {		WRONG_PARAM_COUNT;	}	if (PG(safe_mode) &&(!php_checkuid(file_in, NULL, CHECKUID_CHECK_FILE_AND_DIR))) {		RETURN_FALSE;	}		if (php_check_open_basedir(file_in TSRMLS_CC)) {		RETURN_FALSE;	}		if (pgsql_link == NULL && id == -1) {		RETURN_FALSE;	}	ZEND_FETCH_RESOURCE2(pgsql, PGconn *, &pgsql_link, id, "PostgreSQL link", le_link, le_plink);	oid = lo_import(pgsql, file_in);	if (oid == InvalidOid) {		RETURN_FALSE;	}	PGSQL_RETURN_OID(oid);}/* }}} *//* {{{ proto bool pg_lo_export([resource connection, ] int objoid, string filename)   Export large object direct to filesystem */PHP_FUNCTION(pg_lo_export){	zval *pgsql_link = NULL;	char *file_out, *oid_string, *end_ptr;	int oid_strlen;	int id = -1, name_len;	long oid_long;	Oid oid;	PGconn *pgsql;	int argc = ZEND_NUM_ARGS();	/* allow string to handle large OID value correctly */	if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,								 "rls", &pgsql_link, &oid_long, &file_out, &name_len) == SUCCESS) {		if (oid_long <= InvalidOid) {			php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Invalid OID specified");			RETURN_FALSE;		}		oid = (Oid)oid_long;	}	else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,								 "rss", &pgsql_link, &oid_string, &oid_strlen, &file_out, &name_len) == SUCCESS) {		oid = (Oid)strtoul(oid_string, &end_ptr, 10);		if ((oid_string+oid_strlen) != end_ptr) {			/* wrong integer format */			php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Wrong OID value passed");			RETURN_FALSE;		}	}	else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,									  "ls",  &oid_long, &file_out, &name_len) == SUCCESS) {		if (oid_long <= InvalidOid) {			php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Invalid OID specified");			RETURN_FALSE;		}		oid = (Oid)oid_long;		id = PGG(default_link);		CHECK_DEFAULT_LINK(id);	}	else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,								 "ss", &oid_string, &oid_strlen, &file_out, &name_len) == SUCCESS) {		oid = (Oid)strtoul(oid_string, &end_ptr, 10);		if ((oid_string+oid_strlen) != end_ptr) {			/* wrong integer format */			php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Wrong OID value passed");			RETURN_FALSE;		}		id = PGG(default_link);		CHECK_DEFAULT_LINK(id);	}	else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,								 "ssr", &oid_string, &oid_strlen, &file_out, &name_len, &pgsql_link) == SUCCESS) {		oid = (Oid)strtoul(oid_string, &end_ptr, 10);		if ((oid_string+oid_strlen) != end_ptr) {			/* wrong integer format */			php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Wrong OID value passed");			RETURN_FALSE;		}	}	else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,									  "lsr", &oid_long, &file_out, &name_len, &pgsql_link) == SUCCESS) {		php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Old API is used");		if (oid_long <= InvalidOid) {			php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Invalid OID specified");			RETURN_FALSE;		}		oid = (Oid)oid_long;	}	else {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Requires 2 or 3 arguments");		RETURN_FALSE;	}	if (PG(safe_mode) &&(!php_checkuid(file_out, NULL, CHECKUID_CHECK_FILE_AND_DIR))) {		RETURN_FALSE;	}		if (php_check_open_basedir(file_out TSRMLS_CC)) {		RETURN_FALSE;	}		if (pgsql_link == NULL && id == -1) {		RETURN_FALSE;	}	ZEND_FETCH_RESOURCE2(pgsql, PGconn *, &pgsql_link, id, "PostgreSQL link", le_link, le_plink);	if (lo_export(pgsql, oid, file_out)) {		RETURN_TRUE;	} 	RETURN_FALSE;}/* }}} *//* {{{ proto bool pg_lo_seek(resource large_object, int offset [, int whence])   Seeks position of large object */PHP_FUNCTION(pg_lo_seek){	zval *pgsql_id = NULL;	long offset = 0, whence = SEEK_CUR;	pgLofp *pgsql;	int argc = ZEND_NUM_ARGS();	if (zend_parse_parameters(argc TSRMLS_CC, "rl|l", &pgsql_id, &offset, &whence) == FAILURE) {		return;	}	if (whence != SEEK_SET && whence != SEEK_CUR && whence != SEEK_END) {		php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid whence parameter");		return;	}	ZEND_FETCH_RESOURCE(pgsql, pgLofp *, &pgsql_id, -1, "PostgreSQ

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -