78
78
zend_throw_error(NULL, "No PostgreSQL connection opened yet"); \
79
79
RETURN_THROWS(); \
80
80
}
81
- #define FETCH_DEFAULT_LINK () PGG(default_link)
81
+ #define FETCH_DEFAULT_LINK () \
82
+ (PGG(default_link) ? pgsql_link_from_obj(PGG(default_link)) : NULL)
82
83
83
84
#define CHECK_PGSQL_LINK (link_handle ) \
84
85
if (link_handle->conn == NULL) { \
@@ -283,11 +284,15 @@ static zend_string *_php_pgsql_trim_message(const char *message)
283
284
zend_string_release(msgbuf); \
284
285
} \
285
286
286
- static void php_pgsql_set_default_link (pgsql_link_handle * link )
287
+ static void php_pgsql_set_default_link (zend_object * obj )
287
288
{
288
- GC_ADDREF (res );
289
+ GC_ADDREF (obj );
289
290
290
- PGG (default_link ) = link ;
291
+ if (PGG (default_link ) != NULL ) {
292
+ GC_DELREF (obj );
293
+ }
294
+
295
+ PGG (default_link ) = obj ;
291
296
}
292
297
293
298
static void _close_pgsql_plink (zend_resource * rsrc )
@@ -715,15 +720,14 @@ static void php_pgsql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
715
720
} else { /* Non persistent connection */
716
721
zval * index_ptr , new_index_ptr ;
717
722
718
- /* first we check the hash for the hashed_details key. if it exists,
723
+ /* first we check the hash for the hashed_details key. If it exists,
719
724
* it should point us to the right offset where the actual pgsql link sits.
720
725
* if it doesn't, open a new pgsql link, add it to the resource list,
721
726
* and add a pointer to it with hashed_details as the key.
722
727
*/
723
728
if (!(connect_type & PGSQL_CONNECT_FORCE_NEW )
724
729
&& (index_ptr = zend_hash_find_ptr (& PGG (connections ), str .s )) != NULL ) {
725
- php_pgsql_set_default_link (pgsql_link_from_obj (Z_OBJ_P (index_ptr )));
726
- GC_ADDREF (Z_OBJ_P (index_ptr ));
730
+ php_pgsql_set_default_link (Z_OBJ_P (index_ptr ));
727
731
ZVAL_COPY (return_value , index_ptr );
728
732
729
733
goto cleanup ;
@@ -776,7 +780,7 @@ static void php_pgsql_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
776
780
if (! PGG (ignore_notices ) && Z_TYPE_P (return_value ) == IS_OBJECT ) {
777
781
PQsetNoticeProcessor (pgsql , _php_pgsql_notice_handler , link );
778
782
}
779
- php_pgsql_set_default_link (link );
783
+ php_pgsql_set_default_link (Z_OBJ_P ( return_value ) );
780
784
781
785
cleanup :
782
786
smart_str_free (& str );
@@ -838,7 +842,9 @@ PHP_FUNCTION(pg_close)
838
842
link = FETCH_DEFAULT_LINK ();
839
843
CHECK_DEFAULT_LINK (link );
840
844
zend_hash_del (& PGG (connections ), link -> hash );
845
+ GC_DELREF (PGG (default_link ));
841
846
PGG (default_link ) = NULL ;
847
+ pgsql_link_free (link );
842
848
RETURN_TRUE ;
843
849
}
844
850
@@ -847,6 +853,7 @@ PHP_FUNCTION(pg_close)
847
853
848
854
if (link == FETCH_DEFAULT_LINK ()) {
849
855
zend_hash_del (& PGG (connections ), link -> hash );
856
+ GC_DELREF (PGG (default_link ));
850
857
PGG (default_link ) = NULL ;
851
858
}
852
859
pgsql_link_free (link );
0 commit comments