Sorry for delay. Here is the revised patches.

I marged pg_lo_import_with_oid() into pg_lo_import().
--
Tatsuo Ishii
SRA OSS, Inc. Japan

> > On 17.04.2008 18:50, Tatsuo Ishii wrote:
> > > Here are the patches against 5.2 HEAD.
> > 
> > First of all, please use `diff -u`, not just `diff` - unified diffs are 
> > much more readable.
> 
> Ok. I'll do it next time.
> 
> > > 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).
> > 
> > Is there a real need for a new function?
> > Can't we modify pg_lo_import() to accept one more argument?
> 
> There's no techinical reason to add lo_import_with_oid(). I just
> wanted to directly map the PostgreSQL API to PHP's API. If integrating
> to pg_lo_import() is the PHP's way, I would be happy to update my
> patches.
> --
> Tatsuo Ishii
> SRA OSS, Inc. Japan
> 
> -- 
> 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 -u -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   1 Jul 2008 15:58:25 -0000
@@ -92,6 +92,8 @@
   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.28
diff -u -r1.331.2.13.2.28 pgsql.c
--- pgsql.c     19 May 2008 15:18:39 -0000      1.331.2.13.2.28
+++ pgsql.c     1 Jul 2008 15:58:27 -0000
@@ -2514,48 +2514,101 @@
 }
 /* }}} */
 
-/* {{{ proto int pg_lo_create([resource connection])
+/* {{{ proto int pg_lo_create([resource connection,] string large_object_oid)
    Create a large object */
 PHP_FUNCTION(pg_lo_create)
 {
-       zval **pgsql_link = NULL;
+       zval *pgsql_link = NULL;
+       long oid_long;
+       char *oid_string, *end_ptr;
+       int oid_strlen;
        PGconn *pgsql;
-       Oid pgsql_oid;
+       Oid oid;
+       Oid out_oid;
        int id = -1;
+       int argc = ZEND_NUM_ARGS();
 
-       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:
+#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;
-                       break;
+                       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);
-       
-       /* 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) 
-       */
+       ZEND_FETCH_RESOURCE2(pgsql, PGconn *, &pgsql_link, id, "PostgreSQL 
link", le_link, le_plink);
 
-       if ((pgsql_oid = lo_creat(pgsql, INV_READ|INV_WRITE)) == InvalidOid) {
+#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(pgsql_oid);    
+       PGSQL_RETURN_OID(out_oid);      
 }
 /* }}} */
 
@@ -2892,16 +2945,19 @@
 }
 /* }}} */
 
-/* {{{ proto int pg_lo_import([resource connection, ] string filename)
+/* {{{ proto int pg_lo_import([resource connection, ] [ int objoid, ] string 
filename)
    Import large object direct from filesystem */
 PHP_FUNCTION(pg_lo_import)
 {
        zval *pgsql_link = NULL;
-       char *file_in;
+       char *file_in, *oid_string, *end_ptr;
+       int oid_strlen;
        int id = -1, name_len;
-       int argc = ZEND_NUM_ARGS();
+       long oid_long;
+       Oid oid = InvalidOid;
+       Oid out_oid;
        PGconn *pgsql;
-       Oid oid;
+       int argc = ZEND_NUM_ARGS();
 
        if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc TSRMLS_CC,
                                                                 "rs", 
&pgsql_link, &file_in, &name_len) == SUCCESS) {
@@ -2916,8 +2972,29 @@
                                                                          "sr", 
&file_in, &name_len, &pgsql_link ) == SUCCESS) {
                php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Old API is used");
        }
+#if HAVE_LO_IMPORT_WITH_OID
+       /* allow string to handle large OID value correctly */
+       else 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;
+               }
+       }
+#endif
        else {
-               WRONG_PARAM_COUNT;
+               php_error_docref(NULL TSRMLS_CC, E_WARNING, "Wrong arguments");
+               RETURN_FALSE;
        }
 
        if (PG(safe_mode) &&(!php_checkuid(file_in, NULL, 
CHECKUID_CHECK_FILE_AND_DIR))) {
@@ -2934,12 +3011,17 @@
 
        ZEND_FETCH_RESOURCE2(pgsql, PGconn *, &pgsql_link, id, "PostgreSQL 
link", le_link, le_plink);
 
-       oid = lo_import(pgsql, file_in);
+#if HAVE_LO_IMPORT_WITH_OID
+       out_oid = lo_import_with_oid(pgsql, file_in, oid);
+#else
+       out_oid = lo_import(pgsql, file_in);
+#endif
 
-       if (oid == InvalidOid) {
+       if (out_oid == InvalidOid) {
                RETURN_FALSE;
-       }
-       PGSQL_RETURN_OID(oid);
+       } 
+
+       PGSQL_RETURN_OID(out_oid);
 }
 /* }}} */
 

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to