summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Momjian2001-01-21 03:49:14 +0000
committerBruce Momjian2001-01-21 03:49:14 +0000
commitc6559352177112e421299011ece1ceeb1a2037b5 (patch)
tree80c3733824cbdfcd5dbc88c78b3d8a5a98c32803
parent023a48b811d8e0a288e2bf999bb4f3e028f5d0c9 (diff)
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
-rw-r--r--src/backend/storage/large_object/inv_api.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/src/backend/storage/large_object/inv_api.c b/src/backend/storage/large_object/inv_api.c
index 2c8e855dda2..2af4a44c4ab 100644
--- a/src/backend/storage/large_object/inv_api.c
+++ b/src/backend/storage/large_object/inv_api.c
@@ -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);