00001 #ifndef dsBtreeOnDisk_h
00002 #define dsBtreeOnDisk_h
00003
00004 #include <iostream>
00005
00006 #include <dsSmartException.h>
00007 #include <dsutil.h>
00008
00009 DECLARE_EXCEPTION(dsBtreeOnDisk);
00010
00011 class dsBtreeOnDiskItem
00012 {
00013 protected:
00014 char *key;
00015 void *val;
00016 size_t vsize;
00017 size_t ksize;
00018
00019 int _deleted;
00020
00021 long _left, _right, _parent, _dup;
00022 long _offs;
00023
00024 public:
00025 dsBtreeOnDiskItem()
00026 {
00027 key = 0;
00028 val = 0;
00029 vsize = 0;
00030 ksize = 0;
00031
00032 _offs = 0;
00033 _deleted = 0;
00034 _left = 0; _right = 0; _parent = 0; _dup = 0;
00035 }
00036
00037 dsBtreeOnDiskItem(const char *xkey, void *xval, size_t size)
00038 {
00039 key = ds_strdup(xkey);
00040 val = xval;
00041 vsize = size;
00042 ksize = strlen(xkey)+1;
00043
00044 _offs = 0;
00045 _deleted = 0;
00046 _left = 0; _right = 0; _parent = 0; _dup = 0;
00047 }
00048
00049 ~dsBtreeOnDiskItem()
00050 {
00051 if (key)
00052 delete key;
00053 }
00054
00055 friend class dsBtreeOnDisk;
00056 };
00057
00058 class dsBtreeOnDiskRootItem : public dsBtreeOnDiskItem
00059 {
00060 long _last_offs;
00061
00062 dsBtreeOnDiskRootItem():
00063 dsBtreeOnDiskItem()
00064 {
00065 _last_offs = 0;
00066 key = ds_strdup("dsBtreeOnDiskOnDisk v1.002 (C) DMS 2003");
00067 ksize = strlen(key)+1;
00068 }
00069
00070
00071 friend class dsBtreeOnDisk;
00072 };
00073
00074 class dsBtreeOnDisk
00075 {
00076 std::iostream* _os;
00077 bool _allow_dup;
00078
00079 void _walk(long offs);
00080
00081 void rotate_right(dsBtreeOnDiskItem& item);
00082 void rotate_left(dsBtreeOnDiskItem& item);
00083
00084 protected:
00085 virtual void visit(char *key, void *val, size_t vsize);
00086
00087 public:
00088
00089 dsBtreeOnDiskRootItem _root;
00090 dsBtreeOnDiskItem _current;
00091
00092 void IOWriteAt(long offs, dsBtreeOnDiskItem* item);
00093 void IOReadAt (long offs, dsBtreeOnDiskItem* item);
00094 void IOError (long offs, dsBtreeOnDiskItem* item);
00095
00096 int cf(dsBtreeOnDiskItem* a, dsBtreeOnDiskItem *b);
00097
00098 dsBtreeOnDiskItem* seek(dsBtreeOnDiskItem* item);
00099 dsBtreeOnDiskItem* insert(dsBtreeOnDiskItem* item);
00100
00101 void update(dsBtreeOnDiskItem* item, void *newval, size_t size);
00102 void remove(dsBtreeOnDiskItem* item);
00103
00104 void walk();
00105
00106 dsBtreeOnDisk(std::iostream* os, bool allow_duplicates = false);
00107 };
00108
00109
00110
00111
00112 #endif