*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
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;
/* 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 */
};
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.