Deduplicate code in LargeObjectExists and myLargeObjectExists.
authorFujii Masao <fujii@postgresql.org>
Thu, 12 Sep 2024 12:45:42 +0000 (21:45 +0900)
committerFujii Masao <fujii@postgresql.org>
Thu, 12 Sep 2024 12:45:42 +0000 (21:45 +0900)
myLargeObjectExists() and LargeObjectExists() had nearly identical code,
except for handling snapshots. This commit renames myLargeObjectExists()
to LargeObjectExistsWithSnapshot() and refactors LargeObjectExists()
to call it internally, reducing duplication.

Author: Yugo Nagata
Reviewed-by: Fujii Masao
Discussion: https://postgr.es/m/20240702163444.ab586f6075e502eb84f11b1a@sranhm.sraoss.co.jp

src/backend/catalog/pg_largeobject.c
src/backend/storage/large_object/inv_api.c
src/include/catalog/pg_largeobject.h

index e235f7c5e680ee8df7e12b7fefb70471b109bb81..5d9fdfbd4cd7bfd7ee3a1c68c572d96ecadb4450 100644 (file)
@@ -14,8 +14,6 @@
  */
 #include "postgres.h"
 
-#include "access/genam.h"
-#include "access/htup_details.h"
 #include "access/table.h"
 #include "catalog/catalog.h"
 #include "catalog/indexing.h"
@@ -153,6 +151,15 @@ LargeObjectDrop(Oid loid)
  */
 bool
 LargeObjectExists(Oid loid)
+{
+       return LargeObjectExistsWithSnapshot(loid, NULL);
+}
+
+/*
+ * Same as LargeObjectExists(), except snapshot to read with can be specified.
+ */
+bool
+LargeObjectExistsWithSnapshot(Oid loid, Snapshot snapshot)
 {
        Relation        pg_lo_meta;
        ScanKeyData skey[1];
@@ -170,7 +177,7 @@ LargeObjectExists(Oid loid)
 
        sd = systable_beginscan(pg_lo_meta,
                                                        LargeObjectMetadataOidIndexId, true,
-                                                       NULL, 1, skey);
+                                                       snapshot, 1, skey);
 
        tuple = systable_getnext(sd);
        if (HeapTupleIsValid(tuple))
index f9510833241bbdff80190c04d0f835edeeb807ea..afce51c167472dd93f9c06f87c3ed9a78280e88d 100644 (file)
@@ -41,7 +41,6 @@
 #include "catalog/indexing.h"
 #include "catalog/objectaccess.h"
 #include "catalog/pg_largeobject.h"
-#include "catalog/pg_largeobject_metadata.h"
 #include "libpq/libpq-fs.h"
 #include "miscadmin.h"
 #include "storage/large_object.h"
@@ -123,43 +122,6 @@ close_lo_relation(bool isCommit)
 }
 
 
-/*
- * Same as pg_largeobject.c's LargeObjectExists(), except snapshot to
- * read with can be specified.
- */
-static bool
-myLargeObjectExists(Oid loid, Snapshot snapshot)
-{
-       Relation        pg_lo_meta;
-       ScanKeyData skey[1];
-       SysScanDesc sd;
-       HeapTuple       tuple;
-       bool            retval = false;
-
-       ScanKeyInit(&skey[0],
-                               Anum_pg_largeobject_metadata_oid,
-                               BTEqualStrategyNumber, F_OIDEQ,
-                               ObjectIdGetDatum(loid));
-
-       pg_lo_meta = table_open(LargeObjectMetadataRelationId,
-                                                       AccessShareLock);
-
-       sd = systable_beginscan(pg_lo_meta,
-                                                       LargeObjectMetadataOidIndexId, true,
-                                                       snapshot, 1, skey);
-
-       tuple = systable_getnext(sd);
-       if (HeapTupleIsValid(tuple))
-               retval = true;
-
-       systable_endscan(sd);
-
-       table_close(pg_lo_meta, AccessShareLock);
-
-       return retval;
-}
-
-
 /*
  * Extract data field from a pg_largeobject tuple, detoasting if needed
  * and verifying that the length is sane.  Returns data pointer (a bytea *),
@@ -279,7 +241,7 @@ inv_open(Oid lobjId, int flags, MemoryContext mcxt)
                snapshot = GetActiveSnapshot();
 
        /* Can't use LargeObjectExists here because we need to specify snapshot */
-       if (!myLargeObjectExists(lobjId, snapshot))
+       if (!LargeObjectExistsWithSnapshot(lobjId, snapshot))
                ereport(ERROR,
                                (errcode(ERRCODE_UNDEFINED_OBJECT),
                                 errmsg("large object %u does not exist", lobjId)));
index b40c90b749db3a2d75cc2109f86be879f8d9fcf5..e684c58ca950d5b6b454d0f42b1f79d6265b47bf 100644 (file)
@@ -20,6 +20,7 @@
 
 #include "catalog/genbki.h"
 #include "catalog/pg_largeobject_d.h"
+#include "utils/snapshot.h"
 
 /* ----------------
  *             pg_largeobject definition.  cpp turns this into
@@ -49,5 +50,6 @@ DECLARE_UNIQUE_INDEX_PKEY(pg_largeobject_loid_pn_index, 2683, LargeObjectLOidPNI
 extern Oid     LargeObjectCreate(Oid loid);
 extern void LargeObjectDrop(Oid loid);
 extern bool LargeObjectExists(Oid loid);
+extern bool LargeObjectExistsWithSnapshot(Oid loid, Snapshot snapshot);
 
 #endif                                                 /* PG_LARGEOBJECT_H */