From ec6fbb6755c53a02ff881024632436d4cc691f28 Mon Sep 17 00:00:00 2001
From: RockChinQ <1010553892@qq.com>
Date: Sat, 15 Jul 2023 03:23:25 +0000
Subject: [PATCH] =?UTF-8?q?feat(rm=5Fscan):=20=E5=AE=9E=E7=8E=B0=E9=A2=98?=
 =?UTF-8?q?=E7=9B=AE=E8=A6=81=E6=B1=82=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/record/rm_scan.cpp | 25 +++++++++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)

diff --git a/src/record/rm_scan.cpp b/src/record/rm_scan.cpp
index 41944dc..2d3aab7 100644
--- a/src/record/rm_scan.cpp
+++ b/src/record/rm_scan.cpp
@@ -18,7 +18,9 @@ See the Mulan PSL v2 for more details. */
 RmScan::RmScan(const RmFileHandle *file_handle) : file_handle_(file_handle) {
     // Todo:
     // 初始化file_handle和rid(指向第一个存放了记录的位置)
-
+    rid_.page_no = RM_FIRST_RECORD_PAGE;
+    rid_.slot_no = -1;
+    next();
 }
 
 /**
@@ -27,7 +29,24 @@ RmScan::RmScan(const RmFileHandle *file_handle) : file_handle_(file_handle) {
 void RmScan::next() {
     // Todo:
     // 找到文件中下一个存放了记录的非空闲位置,用rid_来指向这个位置
+    if (is_end()) {
+        return;
+    }
 
+    // for pages
+    for (; rid_.page_no < this->file_handle_->file_hdr_.num_pages; rid_.page_no++){
+        rid_.slot_no = Bitmap::next_bit(
+            true,
+            file_handle_->fetch_page_handle(rid_.page_no).bitmap,
+            file_handle_->file_hdr_.num_records_per_page,
+            rid_.slot_no
+        );
+        if (rid_.slot_no < file_handle_->file_hdr_.num_records_per_page) {
+            return;
+        }
+        rid_.slot_no = -1;
+    }
+    rid_.page_no = RM_NO_PAGE;
 }
 
 /**
@@ -35,7 +54,9 @@ void RmScan::next() {
  */
 bool RmScan::is_end() const {
     // Todo: 修改返回值
-
+    if (rid_.page_no == RM_NO_PAGE) {
+        return true;
+    }
     return false;
 }
 
-- 
GitLab