-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathIX_Manager.h
More file actions
123 lines (101 loc) · 3.93 KB
/
IX_Manager.h
File metadata and controls
123 lines (101 loc) · 3.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
//
// File: IX_Manager.h
// Desciption: An interface defination of Index File Manager
// Authors: dim dew
//
#ifndef IX_MANAGER_H_H
#define IX_MANAGER_H_H
#include "RM_Manager.h"
#include "PF_Manager.h"
const int IX_NO_MORE_BUCKET_SLOT = -1;
const int IX_USELESS_SLOTNUM = -2; // 内部节点中只需要用 pagenum,以及 DUPLICATE 的叶子节点
const int IX_NULL_CHILD = -3;
const int IX_NO_MORE_NEXT_LEAF = -4;
const int IX_NO_MORE_BUCKET_PAGE = -5;
const int IX_I_DONT_KNOW_BUCKET_SLOT = -6;
const char OCCUPIED = 'o';
const char DUP = 'd';
typedef struct{
int attrLength;
// int keyLength;
AttrType attrType;
PageNum rootPage;
PageNum first_leaf;
int order; // 一个Node中能够包含的key的数量范围为 [ (order - 1) / 2, order - 1 ]
// 一些 offset 值的保存,便于在文件中进行定位
int nodeEntryListOffset;
int bucketEntryListOffset;
int nodeKeyListOffset;
int entrysPerBucket;
} IX_FileHeader;
typedef struct{
bool bOpen;
bool isHdrDirty;
PF_FileHandle fileHandle;
IX_FileHeader fileHeader;
} IX_IndexHandle;
typedef struct {
int is_leaf; // 节点类型
int keynum; // 目前含有的 keys 的数量
// PageNum parent; // 可以有但是没有必要
PageNum sibling; // 叶子节点的兄弟节点
PageNum firstChild; // 内部节点的第一个子节点
} IX_NodePageHeader;
typedef struct {
SlotNum slotNum;
SlotNum firstValidSlot;
SlotNum firstFreeSlot;
PageNum nextBucket;
} IX_BucketPageHeader;
typedef struct {
SlotNum nextFreeSlot;
RID rid;
} IX_BucketEntry;
typedef struct {
char tag;
RID rid;
} IX_NodeEntry;
typedef struct{
bool bOpen; /*扫描是否打开 */
IX_IndexHandle *pIXIndexHandle; //指向索引文件操作的指针
CompOp compOp; /* 用于比较的操作符*/
char *value; /* 与属性行比较的值 */
// PF_PageHandle pfPageHandle; // 固定在缓冲区页面所对应的页面操作列表
PageNum pnNext; //下一个将要被读入的页面号
int ridIx;
bool inBucket;
PageNum nextBucketPage;
SlotNum nextBucketSlot;
} IX_IndexScan;
typedef struct Tree_Node{
int keyNum; //节点中包含的关键字(属性值)个数
char **keys; //节点中包含的关键字(属性值)数组
Tree_Node *parent; //父节点
Tree_Node *sibling; //右边的兄弟节点
Tree_Node *firstChild; //最左边的孩子节点
} Tree_Node; //节点数据结构
typedef struct{
AttrType attrType; //B+树对应属性的数据类型
int attrLength; //B+树对应属性值的长度
int order; //B+树的序数
Tree_Node *root; //B+树的根节点
} Tree;
RC CreateIndex(const char * fileName,AttrType attrType,int attrLength);
RC OpenIndex(const char *fileName,IX_IndexHandle *indexHandle);
RC CloseIndex(IX_IndexHandle *indexHandle);
RC InsertEntry(IX_IndexHandle *indexHandle,void *pData,const RID * rid);
RC DeleteEntry(IX_IndexHandle *indexHandle,void *pData,const RID * rid, bool ignoreRid = false);
RC SearchEntry(IX_IndexHandle* indexHandle, void* pData, PageNum* pageNum, int* idx);
RC OpenIndexScan(IX_IndexScan *indexScan,IX_IndexHandle *indexHandle,CompOp compOp,char *value);
RC IX_GetNextEntry(IX_IndexScan *indexScan,RID * rid);
RC CloseIndexScan(IX_IndexScan *indexScan);
// RC GetIndexTree(char *fileName, Tree *index);
RC CreateBucket(IX_IndexHandle *indexHandle, PageNum *pageNum);
RC InsertRIDIntoBucket(IX_IndexHandle* indexHandle, PageNum bucketPageNum, RID rid);
RC DeleteRIDFromBucket(IX_IndexHandle* indexHandle, PageNum bucketPageNum, const RID* rid, PageNum nodePage, RID* nodeRid);
RC DisposeAllBucket(IX_IndexHandle* indexHandle, PageNum bucketPageNum);
RC splitChild(IX_IndexHandle* indexHandle, PF_PageHandle* parent, int idx, PageNum child);
RC mergeChild(IX_IndexHandle* indexHandle, PF_PageHandle* parent, int lidx, int ridx, PageNum lchild, PageNum rchild);
RC printBPlusTree(IX_IndexHandle* indexHandle, PageNum node, int keyShowLen, int level);
RC printBPlusTreeSeq(IX_IndexHandle* indexHandle, PageNum node, int keyShowLen);
#endif