]> granicus.if.org Git - postgresql/commitdiff
New smgrtruncate smgr' interface func.
authorVadim B. Mikheev <vadim4o@yahoo.com>
Wed, 27 Nov 1996 07:25:52 +0000 (07:25 +0000)
committerVadim B. Mikheev <vadim4o@yahoo.com>
Wed, 27 Nov 1996 07:25:52 +0000 (07:25 +0000)
src/backend/storage/smgr/smgr.c

index 2aaa156e2599fa23227d1ae69baa860411a9589d..bf74a3b7501ba5732882ddb15df5524a885e93c4 100644 (file)
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/storage/smgr/smgr.c,v 1.4 1996/11/08 05:59:15 momjian Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/storage/smgr/smgr.c,v 1.5 1996/11/27 07:25:52 vadim Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -36,6 +36,7 @@ typedef struct f_smgr {
     int                (*smgr_flush)();
     int                (*smgr_blindwrt)();
     int                (*smgr_nblocks)();
+    int                (*smgr_truncate)();
     int                (*smgr_commit)();       /* may be NULL */
     int                (*smgr_abort)();        /* may be NULL */
 } f_smgr;
@@ -49,12 +50,14 @@ static f_smgr smgrsw[] = {
 
     /* magnetic disk */
     { mdinit, NULL, mdcreate, mdunlink, mdextend, mdopen, mdclose,
-      mdread, mdwrite, mdflush, mdblindwrt, mdnblocks, mdcommit, mdabort },
+      mdread, mdwrite, mdflush, mdblindwrt, mdnblocks, mdtruncate, 
+      mdcommit, mdabort },
 
 #ifdef MAIN_MEMORY
     /* main memory */
     { mminit, mmshutdown, mmcreate, mmunlink, mmextend, mmopen, mmclose,
-      mmread, mmwrite, mmflush, mmblindwrt, mmnblocks, mmcommit, mmabort },
+      mmread, mmwrite, mmflush, mmblindwrt, mmnblocks, NULL, 
+      mmcommit, mmabort },
 
 #endif /* MAIN_MEMORY */
 };
@@ -321,6 +324,29 @@ smgrnblocks(int16 which, Relation reln)
     return (nblocks);
 }
 
+/*
+ *  smgrtruncate() -- Truncate supplied relation to a specified number
+ *                     of blocks
+ *
+ *     Returns the number of blocks on success, aborts the current
+ *     transaction on failure.
+ */
+int
+smgrtruncate(int16 which, Relation reln, int nblocks)
+{
+    int newblks;
+    
+    newblks = nblocks;
+    if (smgrsw[which].smgr_truncate)
+    {
+       if ((newblks = (*(smgrsw[which].smgr_truncate))(reln, nblocks)) < 0)
+           elog(WARN, "cannot truncate %.*s to %d blocks",
+               NAMEDATALEN, &(reln->rd_rel->relname.data[0]), nblocks);
+    }
+
+    return (newblks);
+}
+
 /*
  *  smgrcommit(), smgrabort() -- Commit or abort changes made during the
  *                              current transaction.