00001
00008 #ifndef INDEX_PAGE_H
00009 #define INDEX_PAGE_H
00010 #include"allg.h"
00011 #include<rpointer.h>
00012 #include"mempl.h"
00013 #include"keypage.h"
00014
00019 struct Keyentry
00020 {
00021 off_t offset;
00022 octet_t key[1];
00023 };
00024
00025 struct IndexPage : KeyPage
00026 {
00027 uint16_t keylen;
00028 Keyentry keys[1];
00029 };
00030
00031 class IndexPageAccess : public KeyPageAccess
00032 {
00033 public:
00034 IndexPageAccess():KeyPageAccess() {}
00035 IndexPageAccess(CommonPage* base):KeyPageAccess(base) {}
00036
00037 virtual Page_type_t pagetype();
00038 virtual size_t space();
00042 void init(uint16_t keylen);
00043 void init(CommonPage *base,uint16_t keylen)
00044 {
00045 RAMS::Mseg::setto((char *)base,PAGESIZE);
00046 init(keylen);
00047 }
00048
00049 int maxcount()
00050 {
00051 return (PAGESIZE-offsetof(IndexPage,keys))
00052 /(sizeof_Keyentry());
00053 }
00054
00059 int insert(const octet_t *key,size_t keylen,off_t offset);
00060 int insert(mempl_t key,off_t offset) { return insert(key.ptr,key.l,offset); }
00061 virtual mempl_t key(int i);
00062 virtual int keycmp(int i,const octet_t *other,size_t olen);
00063
00064 off_t off(int i) { return keyentry(i)->offset; }
00065 void changeoffset(mempl_t key,off_t off)
00066 {
00067 int f = find(key);
00068 keyentry(f)->offset = off;
00069 }
00070 int replacelargestkey(const octet_t *key,size_t keylen);
00071 int splitt(CommonPage *neu1,CommonPage *neu2);
00072
00073
00074 protected:
00075 IndexPage *page() { return (IndexPage *)begin(); }
00076 size_t sizeof_Keyentry() { return sizeof(off_t)+page()->keylen; }
00077 Keyentry* keyentry(int i)
00078 {
00079 return (Keyentry *)((octet_t *)(page()->keys)+i*sizeof_Keyentry());
00080 }
00081 };
00082 #endif
00083
00084
00085