Re: Re: [PATCHES] Patch to support transactions with BLOBs for current CVS - Mailing list pgsql-hackers

From Bruce Momjian
Subject Re: Re: [PATCHES] Patch to support transactions with BLOBs for current CVS
Date
Msg-id 200101210351.WAA02843@candle.pha.pa.us
Whole thread Raw
Responses Re: Re: [PATCHES] Patch to support transactions with BLOBs for current CVS  (Bruce Momjian <pgman@candle.pha.pa.us>)
Re: Re: [PATCHES] Patch to support transactions with BLOBs for current CVS  (Denis Perchine <dyp@perchine.com>)
List pgsql-hackers
[ Charset KOI8-R unsupported, converting... ]
> On Saturday 20 January 2001 10:05, you wrote:
> > I just wanted to confirm that this patch was applied.
>
> Yes, it is. But the following patch is not applied. But I sure that it is
> neccessary, otherwise we will get really strange errors (see discussion in
> the thread).
>
> http://www.postgresql.org/mhonarc/pgsql-patches/2000-11/msg00013.html

Can people comment on the following patch that Dennis says is needed?
It prevents BLOB operations outside transactions.  Dennis, can you
explain why BLOB operations have to be done inside transactions?

---------------------------------------------------------------------------
Hello,

here is the patch attached which do check in each BLOB operation, if we are
in transaction, and raise an error otherwise. This will prevent such
mistakes.

--
Sincerely Yours,
Denis Perchine

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026
<!-- MHonArc v2.4.7 -->
<!--X-Subject: Patch to check whether we are in TX when to lo_* -->
<!--X-From-R13: Rravf Brepuvar <qlcNcrepuvar.pbz> -->
<!--X-Date: Fri, 3 Nov 2000 11:59:39 -0500 (EST)(envelope-from dyp@perchine.com) -->
<!--X-Message-Id: 0011032159470B.00541@dyp.perchine.com -->
<!--X-Content-Type: multipart/mixed -->
<!--X-Head-End-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML//EN">
<HTML>
<HEAD>
<META NAME="robots" CONTENT="all">
<TITLE>Patch to check whether we are in TX when to lo_*</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFDEC">
<CENTER><A HREF="http://ads.pgsql.com/cgi-bin/redirect.cgi"><IMG SRC="http://ads.pgsql.com/cgi-bin/display_image.cgi"
BORDER=0HEIGHT=60 WIDTH=468></A></CENTER> 
<P><HR WIDTH=40% SIZE=3 NOSHADE><P>
<!--X-Body-Begin-->
<!--X-User-Header-->
<!--X-User-Header-End-->
<!--X-TopPNI-->
<p>

<!--X-TopPNI-End-->
<!--X-MsgBody-->
<!--X-Subject-Header-Begin-->
<h2>Patch to check whether we are in TX when to lo_*</h2>
<HR SIZE=3 WIDTH=40% NOSHADE>
<!--X-Subject-Header-End-->
<!--X-Head-of-Message-->
<ul>
<li><strong>From</strong>: <strong>Denis Perchine <<A
HREF="mailto:dyp@perchine.com">dyp@perchine.com</A>></strong></li>
<li><strong>To</strong>: <strong><A
HREF="mailto:pgsql-patches@postgresql.org">pgsql-patches@postgresql.org</A></strong></li>
<li><strong>Subject</strong>: <strong>Patch to check whether we are in TX when to lo_*</strong></li>
<li>Date: Fri, 3 Nov 2000 21:59:47 +0600</li>
</ul>
<!--X-Head-of-Message-End-->
<!--X-Head-Body-Sep-Begin-->
<hr>
<!--X-Head-Body-Sep-End-->
<!--X-Body-of-Message-->
<PRE>
Hello,

here is the patch attached which do check in each BLOB operation, if we are
in transaction, and raise an error otherwise. This will prevent such mistakes.

--
Sincerely Yours,
Denis Perchine

----------------------------------
E-Mail: dyp@perchine.com
HomePage: <A  HREF="http://www.perchine.com/dyp/">http://www.perchine.com/dyp/</A>
FidoNet: 2:5000/120.5
----------------------------------
</PRE>
<PRE>
Index: inv_api.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/backend/storage/large_object/inv_api.c,v
retrieving revision 1.80
diff -u -r1.80 inv_api.c
--- inv_api.c    2000/11/02 23:52:06    1.80
+++ inv_api.c    2000/11/03 16:57:57
@@ -64,6 +64,9 @@
     Oid            file_oid;
     LargeObjectDesc *retval;

+    if (!IsTransactionBlock())
+        elog(ERROR, "inv_create: Not in transaction. BLOBs should be used inside transaction.");
+
     /*
      * Allocate an OID to be the LO's identifier.
      */
@@ -117,6 +120,9 @@
 {
     LargeObjectDesc *retval;

+    if (!IsTransactionBlock())
+        elog(ERROR, "inv_open: Not in transaction. BLOBs should be used inside transaction.");
+
     if (! LargeObjectExists(lobjId))
         elog(ERROR, "inv_open: large object %u not found", lobjId);

@@ -145,6 +151,9 @@
 void
 inv_close(LargeObjectDesc *obj_desc)
 {
+    if (!IsTransactionBlock())
+        elog(ERROR, "inv_close: Not in transaction. BLOBs should be used inside transaction.");
+
     Assert(PointerIsValid(obj_desc));

     if (obj_desc->flags & IFS_WRLOCK)
@@ -164,6 +173,9 @@
 int
 inv_drop(Oid lobjId)
 {
+    if (!IsTransactionBlock())
+        elog(ERROR, "inv_drop: Not in transaction. BLOBs should be used inside transaction.");
+
     LargeObjectDrop(lobjId);

     /*
@@ -248,6 +260,9 @@
 int
 inv_seek(LargeObjectDesc *obj_desc, int offset, int whence)
 {
+    if (!IsTransactionBlock())
+        elog(ERROR, "inv_seek: Not in transaction. BLOBs should be used inside transaction.");
+
     Assert(PointerIsValid(obj_desc));

     switch (whence)
@@ -280,6 +295,9 @@
 int
 inv_tell(LargeObjectDesc *obj_desc)
 {
+    if (!IsTransactionBlock())
+        elog(ERROR, "inv_tell: Not in transaction. BLOBs should be used inside transaction.");
+
     Assert(PointerIsValid(obj_desc));

     return obj_desc->offset;
@@ -303,6 +321,9 @@
     bytea           *datafield;
     bool            pfreeit;

+    if (!IsTransactionBlock())
+        elog(ERROR, "inv_read: Not in transaction. BLOBs should be used inside transaction.");
+
     Assert(PointerIsValid(obj_desc));
     Assert(buf != NULL);

@@ -414,6 +435,9 @@
     char            replace[Natts_pg_largeobject];
     bool            write_indices;
     Relation        idescs[Num_pg_largeobject_indices];
+
+    if (!IsTransactionBlock())
+        elog(ERROR, "inv_write: Not in transaction. BLOBs should be used inside transaction.");

     Assert(PointerIsValid(obj_desc));
     Assert(buf != NULL);
</PRE>

<!--X-Body-of-Message-End-->
<!--X-MsgBody-End-->
<!--X-Follow-Ups-->
<hr>
<!--X-Follow-Ups-End-->
<!--X-References-->
<!--X-References-End-->
<!--X-BotPNI-->
<ul>
<li>Prev by Date:
<strong><a href="msg00012.html">Re: Small fix for inv_getsize</a></strong>
</li>
<li>Next by Date:
<strong><a href="msg00014.html">Re: Patch to check whether we are in TX when to lo_*</a></strong>
</li>
<li>Prev by thread:
<strong><a href="msg00018.html">Re: Inherited column patches</a></strong>
</li>
<li>Next by thread:
<strong><a href="msg00014.html">Re: Patch to check whether we are in TX when to lo_*</a></strong>
</li>
<li>Index(es):
<ul>
<li><a href="index.html#00013"><strong>Date</strong></a></li>
<li><a href="threads.html#00013"><strong>Thread</strong></a></li>
</ul>
</li>
</ul>

<!--X-BotPNI-End-->
<!--X-User-Footer-->
<strong>
<a href="http://www.postgresql.org/mhonarc/">Home</a> |
<a href="index.html">Main Index</a> |
<a href="threads.html">Thread Index</a>
</strong>
<!--X-User-Footer-End-->
</body>
</html>

pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: like and optimization
Next
From: Bruce Momjian
Date:
Subject: Re: Re: [PATCHES] Patch to support transactions with BLOBs for current CVS