Main Page   Modules   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Related Pages  

dsBtreeOnDisk.h

Go to the documentation of this file.
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; // Actual for root item only
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

Generated on Mon May 16 18:26:57 2005 for libdms4 by doxygen1.3-rc2