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 */