On 2020-Jan-27, Alvaro Herrera wrote:

> Actually looking again, getRecordTimestamp is looking pretty strange.
> It looks much more natural by using nested switch/case blocks, as with
> this diff.  I think the compiler does a better job this way too.

I hadn't noticed I forgot to attach the diff here :-(

-- 
Álvaro Herrera                https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 0bc3d8cec5..1a165701ae 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -5566,33 +5566,43 @@ exitArchiveRecovery(TimeLineID endTLI, XLogRecPtr endOfLog)
 static bool
 getRecordTimestamp(XLogReaderState *record, TimestampTz *recordXtime)
 {
-	uint8		info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
-	uint8		xact_info = info & XLOG_XACT_OPMASK;
-	uint8		rmid = XLogRecGetRmid(record);
+	RmgrId		rmid = XLogRecGetRmid(record);
+	uint8		info;
 
-	if (rmid == RM_XLOG_ID && info == XLOG_RESTORE_POINT)
+	switch (rmid)
 	{
-		*recordXtime = ((xl_restore_point *) XLogRecGetData(record))->rp_time;
-		return true;
-	}
-	if (rmid == RM_XLOG_ID && (info == XLOG_CHECKPOINT_ONLINE ||
-							   info == XLOG_CHECKPOINT_SHUTDOWN))
-	{
-		*recordXtime =
-			time_t_to_timestamptz(((CheckPoint *) XLogRecGetData(record))->time);
-		return true;
-	}
-	if (rmid == RM_XACT_ID && (xact_info == XLOG_XACT_COMMIT ||
-							   xact_info == XLOG_XACT_COMMIT_PREPARED))
-	{
-		*recordXtime = ((xl_xact_commit *) XLogRecGetData(record))->xact_time;
-		return true;
-	}
-	if (rmid == RM_XACT_ID && (xact_info == XLOG_XACT_ABORT ||
-							   xact_info == XLOG_XACT_ABORT_PREPARED))
-	{
-		*recordXtime = ((xl_xact_abort *) XLogRecGetData(record))->xact_time;
-		return true;
+		case RM_XLOG_ID:
+			info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
+
+			switch (info)
+			{
+				case XLOG_RESTORE_POINT:
+					*recordXtime = ((xl_restore_point *) XLogRecGetData(record))->rp_time;
+					return true;
+				case XLOG_CHECKPOINT_ONLINE:
+				case XLOG_CHECKPOINT_SHUTDOWN:
+					*recordXtime =
+						time_t_to_timestamptz(((CheckPoint *) XLogRecGetData(record))->time);
+					return true;
+			}
+			break;
+
+		case RM_XACT_ID:
+			info = XLogRecGetInfo(record) & XLOG_XACT_OPMASK;
+
+			switch (info)
+			{
+				case XLOG_XACT_COMMIT:
+				case XLOG_XACT_COMMIT_PREPARED:
+					*recordXtime = ((xl_xact_commit *) XLogRecGetData(record))->xact_time;
+					return true;
+
+				case XLOG_XACT_ABORT:
+				case XLOG_XACT_ABORT_PREPARED:
+					*recordXtime = ((xl_xact_abort *) XLogRecGetData(record))->xact_time;
+					return true;
+			}
+			break;
 	}
 	return false;
 }

Reply via email to