]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Hello,
authorBruce Momjian <bruce@momjian.us>
Sun, 21 Jan 2001 03:49:14 +0000 (03:49 +0000)
committerBruce Momjian <bruce@momjian.us>
Sun, 21 Jan 2001 03:49:14 +0000 (03:49 +0000)
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

src/backend/storage/large_object/inv_api.c

index 2c8e855dda2bbd9212cb73e4dd6bd26ad9fec286..2af4a44c4ab09d8469a2c1dfc6e3ec99e2cabb4e 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/storage/large_object/inv_api.c,v 1.80 2000/11/02 23:52:06 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/storage/large_object/inv_api.c,v 1.81 2001/01/21 03:49:14 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -64,6 +64,9 @@ inv_create(int flags)
        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 @@ inv_open(Oid lobjId, int flags)
 {
        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 @@ inv_open(Oid lobjId, int flags)
 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 @@ inv_close(LargeObjectDesc *obj_desc)
 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 @@ inv_getsize(LargeObjectDesc *obj_desc)
 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 @@ inv_seek(LargeObjectDesc *obj_desc, int offset, int whence)
 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 @@ inv_read(LargeObjectDesc *obj_desc, char *buf, int nbytes)
        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);
 
@@ -415,6 +436,9 @@ inv_write(LargeObjectDesc *obj_desc, char *buf, int nbytes)
        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);