OSDN Git Service

Ensure that pg_largeobject references opened by lo_import() or lo_export()
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 11 Sep 2004 15:56:46 +0000 (15:56 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 11 Sep 2004 15:56:46 +0000 (15:56 +0000)
will be cleaned up at end of transaction, even when there is no other LO
operation in the transaction.  Per bug report from Daniel Schuchardt.

src/backend/libpq/be-fsstubs.c

index 23244d8..b059c05 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/libpq/be-fsstubs.c,v 1.74 2004/08/29 05:06:43 momjian Exp $
+ *       $PostgreSQL: pgsql/src/backend/libpq/be-fsstubs.c,v 1.75 2004/09/11 15:56:46 tgl Exp $
  *
  * NOTES
  *       This should be moved to a more appropriate place.  It is here
@@ -65,6 +65,16 @@ static int   cookies_size = 0;
 
 static MemoryContext fscxt = NULL;
 
+#define CreateFSContext() \
+       do { \
+               if (fscxt == NULL) \
+                       fscxt = AllocSetContextCreate(TopMemoryContext, \
+                                                                                 "Filesystem", \
+                                                                                 ALLOCSET_DEFAULT_MINSIZE, \
+                                                                                 ALLOCSET_DEFAULT_INITSIZE, \
+                                                                                 ALLOCSET_DEFAULT_MAXSIZE); \
+       } while (0)
+                        
 
 static int     newLOfd(LargeObjectDesc *lobjCookie);
 static void deleteLOfd(int fd);
@@ -87,12 +97,7 @@ lo_open(PG_FUNCTION_ARGS)
        elog(DEBUG4, "lo_open(%u,%d)", lobjId, mode);
 #endif
 
-       if (fscxt == NULL)
-               fscxt = AllocSetContextCreate(TopMemoryContext,
-                                                                         "Filesystem",
-                                                                         ALLOCSET_DEFAULT_MINSIZE,
-                                                                         ALLOCSET_DEFAULT_INITSIZE,
-                                                                         ALLOCSET_DEFAULT_MAXSIZE);
+       CreateFSContext();
 
        currentContext = MemoryContextSwitchTo(fscxt);
 
@@ -236,12 +241,7 @@ lo_creat(PG_FUNCTION_ARGS)
        MemoryContext currentContext;
        Oid                     lobjId;
 
-       if (fscxt == NULL)
-               fscxt = AllocSetContextCreate(TopMemoryContext,
-                                                                         "Filesystem",
-                                                                         ALLOCSET_DEFAULT_MINSIZE,
-                                                                         ALLOCSET_DEFAULT_INITSIZE,
-                                                                         ALLOCSET_DEFAULT_MAXSIZE);
+       CreateFSContext();
 
        currentContext = MemoryContextSwitchTo(fscxt);
 
@@ -380,6 +380,12 @@ lo_import(PG_FUNCTION_ARGS)
 #endif
 
        /*
+        * We don't actually need to switch into fscxt, but create it anyway
+        * to ensure that AtEOXact_LargeObject knows there is state to clean up
+        */
+       CreateFSContext();
+
+       /*
         * open the file to be read in
         */
        nbytes = VARSIZE(filename) - VARHDRSZ;
@@ -447,6 +453,12 @@ lo_export(PG_FUNCTION_ARGS)
 #endif
 
        /*
+        * We don't actually need to switch into fscxt, but create it anyway
+        * to ensure that AtEOXact_LargeObject knows there is state to clean up
+        */
+       CreateFSContext();
+
+       /*
         * open the inversion object (no need to test for failure)
         */
        lobj = inv_open(lobjId, INV_READ);