Here are the patches against 5.2 HEAD.
Modified API's are:
1) pg_lo_create now accepts an optional parameter (large object
id). This corresponds to lo_create() which is new in PostgreSQL 8.1.
2) new API: pg_lo_import_with_oid. Same as pg_lo_import except that it
accepts large object id. This corresponds to lo_import_with_oid()
which is new in PostgreSQL 8.4 (current).
--
Tatsuo Ishii
SRA OSS, Inc. Japan
> Hello Marcus,
>
> Thanks for guiding me. I'm going to make patches in a few days.
> BTW, the problem I'm talking about does not seem to exist in the bug
> database.
> --
> Tatsuo Ishii
> SRA OSS, Inc. Japan
>
> > Hello Tatsuo,
> >
> > first of all thanks for offering to help!
> >
> > the usual way is to provide a few patches. You can check
> > http://bugs.php.net for open bugs in your area. When we like the patches
> > we'll apply them and give you an account.
> >
> > marcus
> >
> > Monday, April 14, 2008, 1:21:47 PM, you wrote:
> >
> > > Hi,
> >
> > > I would like to contribute to ext/pgsql module. Could I have CVS
> > > account?
> >
> > > I've been working on PostgreSQL development for years. My intention
> > > is to catch up PostgreSQL develpment especially when new API is
> > > added. For example an API added to PostgreSQL 8.1 (back to 2005) is
> > > not in PHP yet.
> >
> > > I have talked to Yasuo Ohgaki (one of the pgsql module maintainers)
> > > and he seems to be happy.
> > > --
> > > Tatsuo Ishii
> > > SRA OSS, Inc. Japan
> >
> >
> >
> >
> > Best regards,
> > Marcus
> >
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>
Index: config.m4
===================================================================
RCS file: /repository/php-src/ext/pgsql/config.m4,v
retrieving revision 1.46.2.1.2.5
diff -c -r1.46.2.1.2.5 config.m4
*** config.m4 11 Jul 2007 21:51:55 -0000 1.46.2.1.2.5
--- config.m4 17 Apr 2008 14:41:04 -0000
***************
*** 92,97 ****
--- 92,99 ----
AC_CHECK_LIB(pq, PQescapeStringConn,
AC_DEFINE(HAVE_PQESCAPE_CONN,1,[PostgreSQL 8.1.4 or later]))
AC_CHECK_LIB(pq, PQescapeByteaConn,
AC_DEFINE(HAVE_PQESCAPE_BYTEA_CONN,1,[PostgreSQL 8.1.4 or later]))
AC_CHECK_LIB(pq,
pg_encoding_to_char,AC_DEFINE(HAVE_PGSQL_WITH_MULTIBYTE_SUPPORT,1,[Whether
libpq is compiled with --enable-multibyte]))
+ AC_CHECK_LIB(pq, lo_create, AC_DEFINE(HAVE_LO_CREATE,1,[PostgreSQL 8.1 or
later]))
+ AC_CHECK_LIB(pq, lo_import_with_oid,
AC_DEFINE(HAVE_LO_IMPORT_WITH_OID,1,[PostgreSQL 8.4 or later]))
LIBS=$old_LIBS
LDFLAGS=$old_LDFLAGS
Index: pgsql.c
===================================================================
RCS file: /repository/php-src/ext/pgsql/pgsql.c,v
retrieving revision 1.331.2.13.2.27
diff -c -r1.331.2.13.2.27 pgsql.c
*** pgsql.c 31 Dec 2007 07:20:10 -0000 1.331.2.13.2.27
--- pgsql.c 17 Apr 2008 14:41:06 -0000
***************
*** 188,193 ****
--- 188,196 ----
PHP_FE(pg_lo_write, NULL)
PHP_FE(pg_lo_read_all, NULL)
PHP_FE(pg_lo_import, NULL)
+ #if HAVE_LO_IMPORT_WITH_OID
+ PHP_FE(pg_lo_import_with_oid, NULL)
+ #endif
PHP_FE(pg_lo_export, NULL)
PHP_FE(pg_lo_seek, NULL)
PHP_FE(pg_lo_tell, NULL)
***************
*** 2514,2561 ****
}
/* }}} */
! /* {{{ proto int pg_lo_create([resource connection])
Create a large object */
PHP_FUNCTION(pg_lo_create)
{
! zval **pgsql_link = NULL;
PGconn *pgsql;
! Oid pgsql_oid;
int id = -1;
! switch(ZEND_NUM_ARGS()) {
! case 0:
! id = PGG(default_link);
! CHECK_DEFAULT_LINK(id);
! break;
! case 1:
! if (zend_get_parameters_ex(1, &pgsql_link)==FAILURE) {
! RETURN_FALSE;
! }
! break;
! default:
WRONG_PARAM_COUNT;
! break;
}
if (pgsql_link == NULL && id == -1) {
RETURN_FALSE;
}
! ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL
link", le_link, le_plink);
!
! /* NOTE: Archive modes not supported until I get some more data. Don't
think anybody's
! using it anyway. I believe it's also somehow related to the 'time
travel' feature of
! PostgreSQL, that's on the list of features to be removed... Create
modes not supported.
! What's the use of an object that can be only written to, but not
read from, and vice
! versa? Beats me... And the access type (r/w) must be specified again
when opening
! the object, probably (?) overrides this. (Jouni)
! */
! if ((pgsql_oid = lo_creat(pgsql, INV_READ|INV_WRITE)) == InvalidOid) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to create
PostgreSQL large object");
RETURN_FALSE;
}
! PGSQL_RETURN_OID(pgsql_oid);
}
/* }}} */
--- 2517,2617 ----
}
/* }}} */
! /* {{{ proto int pg_lo_create([resource connection,] string large_object_oid)
Create a large object */
PHP_FUNCTION(pg_lo_create)
{
! zval *pgsql_link = NULL;
! long oid_long;
! char *oid_string, *end_ptr;
! int oid_strlen;
PGconn *pgsql;
! Oid oid;
! Oid out_oid;
int id = -1;
+ int argc = ZEND_NUM_ARGS();
! #ifndef HAVE_PQ_LO_CREATE
! int newapi = 1;
! #else
! int newapi = 0;
! #endif
!
! /* accept string type since Oid type is unsigned int */
! if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,
! "rs",
&pgsql_link, &oid_string, &oid_strlen) == SUCCESS) {
! if (newapi == 0) {
WRONG_PARAM_COUNT;
! RETURN_FALSE;
! }
! 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,
! "rl",
&pgsql_link, &oid_long) == SUCCESS) {
! if (newapi == 0) {
! WRONG_PARAM_COUNT;
! RETURN_FALSE;
! }
! 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,
! "s",
&oid_string, &oid_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,
! "l",
&oid_long) == SUCCESS) {
! if (newapi == 0) {
! WRONG_PARAM_COUNT;
! RETURN_FALSE;
! }
! 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 if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc
TSRMLS_CC,
! "r",
&pgsql_link) == SUCCESS) {
! oid = InvalidOid;
! }
! 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 HAVE_PQ_LO_CREATE
! out_oid = lo_create(pgsql, oid);
! #else
! out_oid = lo_creat(pgsql, INV_READ|INV_WRITE);
! #endif
! if (out_oid == InvalidOid) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to create
PostgreSQL large object");
RETURN_FALSE;
}
! PGSQL_RETURN_OID(out_oid);
}
/* }}} */
***************
*** 2939,2948 ****
--- 2995,3106 ----
if (oid == InvalidOid) {
RETURN_FALSE;
}
+
PGSQL_RETURN_OID(oid);
}
/* }}} */
+ #if HAVE_LO_IMPORT_WITH_OID
+ /* {{{ proto int pg_lo_import_with_oid([resource connection, ] int objoid,
string filename)
+ Import large object direct from filesystem */
+ PHP_FUNCTION(pg_lo_import_with_oid)
+ {
+ zval *pgsql_link = NULL;
+ char *file_in, *oid_string, *end_ptr;
+ int oid_strlen;
+ int id = -1, name_len;
+ long oid_long;
+ Oid oid;
+ Oid out_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_in, &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_in, &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_in, &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_in, &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_in, &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_in, &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_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);
+
+ out_oid = lo_import_with_oid(pgsql, file_in, oid);
+ if (out_oid == InvalidOid) {
+ RETURN_FALSE;
+ }
+
+ PGSQL_RETURN_OID(out_oid);
+ }
+ /* }}} */
+ #endif
+
/* {{{ proto bool pg_lo_export([resource connection, ] int objoid, string
filename)
Export large object direct to filesystem */
PHP_FUNCTION(pg_lo_export)
Index: php_pgsql.h
===================================================================
RCS file: /repository/php-src/ext/pgsql/php_pgsql.h,v
retrieving revision 1.73.2.1.2.3
diff -c -r1.73.2.1.2.3 php_pgsql.h
*** php_pgsql.h 31 Dec 2007 07:20:10 -0000 1.73.2.1.2.3
--- php_pgsql.h 17 Apr 2008 14:41:06 -0000
***************
*** 150,155 ****
--- 150,156 ----
PHP_FUNCTION(pg_lo_write);
PHP_FUNCTION(pg_lo_read_all);
PHP_FUNCTION(pg_lo_import);
+ PHP_FUNCTION(pg_lo_import_with_oid);
PHP_FUNCTION(pg_lo_export);
PHP_FUNCTION(pg_lo_seek);
PHP_FUNCTION(pg_lo_tell);
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php