Main Page | Namespace List | Class Hierarchy | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

Bank_AMOS.hh

Go to the documentation of this file.
00001 00002 00003 00004 00005 00006 00007 00008 //-- IMPORTANT DEVELOPERS NOTE 00018 00019 #ifndef __Bank_AMOS_HH 00020 #define __Bank_AMOS_HH 1 00021 00022 #include "utility_AMOS.hh" 00023 #include "IDMap_AMOS.hh" 00024 #include <cstdlib> 00025 #include <string> 00026 #include <fstream> 00027 #include <vector> 00028 #include <deque> 00029 00030 00031 00032 namespace AMOS { 00033 00034 typedef uint8_t BankMode_t; 00035 const BankMode_t B_READ = 0x1; 00036 const BankMode_t B_WRITE = 0x2; 00037 const BankMode_t B_SPY = 0x4; 00039 00040 00041 00042 //================================================ IBankable_t ================= 00055 //============================================================================== 00056 class IBankable_t 00057 { 00058 friend class Bank_t; 00059 friend class BankStream_t; 00060 00061 00062 protected: 00063 00064 ID_t iid_m; 00065 00066 std::string eid_m; 00067 00068 BankFlags_t flags_m; 00069 00070 00071 //--------------------------------------------------- readRecord ------------- 00088 virtual void readRecord (std::istream & fix, std::istream & var) = 0; 00089 00090 00091 //--------------------------------------------------- writeRecord ------------ 00106 virtual void writeRecord (std::ostream & fix, std::ostream & var) const = 0; 00107 00108 00109 public: 00110 00111 //--------------------------------------------------- IBankable_t ------------ 00116 IBankable_t ( ) 00117 { 00118 iid_m = NULL_ID; 00119 } 00120 00121 00122 //--------------------------------------------------- IBankable_t ------------ 00125 IBankable_t (const IBankable_t & source) 00126 { 00127 *this = source; 00128 } 00129 00130 00131 //--------------------------------------------------- ~IBankable_t ----------- 00134 virtual ~IBankable_t ( ) 00135 { 00136 00137 } 00138 00139 00140 //--------------------------------------------------- clear ------------------ 00143 virtual void clear ( ) 00144 { 00145 iid_m = NULL_ID; 00146 eid_m . erase( ); 00147 flags_m . clear( ); 00148 } 00149 00150 00151 //--------------------------------------------------- getEID ----------------- 00156 const std::string & getEID ( ) const 00157 { 00158 return eid_m; 00159 } 00160 00161 00162 //--------------------------------------------------- getIID ----------------- 00167 ID_t getIID ( ) const 00168 { 00169 return iid_m; 00170 } 00171 00172 00173 //--------------------------------------------------- getNCode --------------- 00178 virtual NCode_t getNCode ( ) const = 0; 00179 00180 00181 //--------------------------------------------------- isRemoved -------------- 00188 bool isRemoved ( ) const 00189 { 00190 return flags_m . is_removed; 00191 } 00192 00193 00194 //--------------------------------------------------- isModified ------------- 00199 bool isModified ( ) const 00200 { 00201 return flags_m . is_modified; 00202 } 00203 00204 00205 //--------------------------------------------------- isFlagA ---------------- 00210 bool isFlagA ( ) const 00211 { 00212 return flags_m . is_flagA; 00213 } 00214 00215 00216 //--------------------------------------------------- isFlagB ---------------- 00221 bool isFlagB ( ) const 00222 { 00223 return flags_m . is_flagB; 00224 } 00225 00226 00227 //--------------------------------------------------- setEID ----------------- 00234 void setEID (const std::string & eid) 00235 { 00236 std::string::size_type s = eid . find (NL_CHAR); 00237 if (s == std::string::npos ) 00238 eid_m = eid; 00239 else 00240 eid_m . assign (eid, 0, s); 00241 } 00242 00243 00244 //--------------------------------------------------- setFlagA --------------- 00254 void setFlagA (bool flag) 00255 { 00256 flags_m . is_flagA = flag; 00257 } 00258 00259 00260 //--------------------------------------------------- setFlagB --------------- 00270 void setFlagB (bool flag) 00271 { 00272 flags_m . is_flagB = flag; 00273 } 00274 00275 00276 //--------------------------------------------------- setIID ----------------- 00282 void setIID (ID_t iid) 00283 { 00284 iid_m = iid; 00285 } 00286 00287 }; 00288 00289 00290 00291 00292 //================================================ Bank_t ====================== 00314 //============================================================================== 00315 class Bank_t 00316 { 00317 00318 protected: 00319 00320 static const Size_t DEFAULT_BUFFER_SIZE; 00321 static const Size_t DEFAULT_PARTITION_SIZE; 00322 static const Size_t MAX_OPEN_PARTITIONS; 00323 00324 enum IFOMode_t 00325 { 00326 I_OPEN, 00327 I_CREATE, 00328 I_CLOSE, 00329 }; 00330 00331 00332 //================================================ BankPartition_t =========== 00338 //============================================================================ 00339 class BankPartition_t 00340 { 00341 00342 private: 00343 00344 char * fix_buff; 00345 char * var_buff; 00346 00347 00348 public: 00349 00350 std::string fix_name; 00351 std::string var_name; 00352 std::fstream fix; 00353 std::fstream var; 00354 00355 //------------------------------------------------- BankPartition_t -------- 00358 BankPartition_t (Size_t buffer_size); 00359 00360 00361 //------------------------------------------------- BankPartition_t -------- 00364 ~BankPartition_t ( ); 00365 00366 }; 00367 00368 00369 //--------------------------------------------------- addPartition ----------- 00383 void addPartition (bool create); 00384 00385 00386 //--------------------------------------------------- appendBID -------------- 00389 void appendBID (IBankable_t & obj); 00390 00391 00392 //--------------------------------------------------- fetchBID --------------- 00395 void fetchBID (ID_t bid, IBankable_t & obj); 00396 00397 00398 //--------------------------------------------------- getPartition ----------- 00412 BankPartition_t * getPartition (ID_t id) 00413 { 00414 if ( partitions_m [id] -> fix . is_open( ) ) 00415 return partitions_m [id]; 00416 else 00417 return openPartition (id); 00418 } 00419 00420 00421 //--------------------------------------------------- getLastPartition ------- 00424 BankPartition_t * getLastPartition ( ) 00425 { 00426 if ( partitions_m . back( ) -> fix . is_open( ) ) 00427 return partitions_m . back( ); 00428 else 00429 return openPartition (npartitions_m - 1); 00430 } 00431 00432 00433 //--------------------------------------------------- init ------------------- 00436 void init ( ); 00437 00438 00439 //--------------------------------------------------- localizeBID ------------ 00447 BankPartition_t * localizeBID (ID_t & bid) 00448 { 00449 ID_t pid = (-- bid) / partition_size_m; 00450 bid -= pid * partition_size_m; 00451 return getPartition (pid); 00452 } 00453 00454 00455 //--------------------------------------------------- lockIFO ---------------- 00467 void lockIFO ( ); 00468 00469 00470 //--------------------------------------------------- openPartition ---------- 00473 BankPartition_t * openPartition (ID_t id); 00474 00475 00476 //--------------------------------------------------- removeBID -------------- 00479 void removeBID (ID_t bid); 00480 00481 00482 //--------------------------------------------------- replaceBID ------------- 00485 void replaceBID (ID_t bid, IBankable_t & obj); 00486 00487 00488 //----------------------------------------------------- setMode -------------- 00496 void setMode (BankMode_t mode) 00497 { 00498 if ( mode & ~(B_READ | B_WRITE | B_SPY) ) 00499 AMOS_THROW_ARGUMENT ("Invalid BankMode: unknown mode"); 00500 00501 if ( ! mode & (B_READ | B_WRITE | B_SPY) ) 00502 AMOS_THROW_ARGUMENT ("Invalid BankMode: mode not specified"); 00503 00504 if ( mode & B_SPY ) 00505 mode = B_SPY | B_READ; 00506 00507 mode_m = mode; 00508 } 00509 00510 00511 //----------------------------------------------------- syncIFO -------------- 00526 void syncIFO (IFOMode_t mode); 00527 00528 00529 //--------------------------------------------------- touchFile -------------- 00532 void touchFile (const std::string & path, int mode, bool create); 00533 00534 00535 //--------------------------------------------------- unlockIFO -------------- 00547 void unlockIFO ( ); 00548 00549 00550 //--------------------------------------------------- Bank_t ----------------- 00555 Bank_t (const Bank_t & source); 00556 00557 00558 //--------------------------------------------------- operator= -------------- 00563 Bank_t & operator= (const Bank_t & source); 00564 00565 00566 NCode_t banktype_m; 00567 00568 Size_t buffer_size_m; 00569 Size_t max_partitions_m; 00570 00571 bool is_open_m; 00572 signed char status_m; 00573 BankMode_t mode_m; 00574 00575 std::string store_dir_m; 00576 std::string store_pfx_m; 00577 Size_t fix_size_m; 00578 Size_t partition_size_m; 00579 00580 ID_t last_bid_m; 00581 ID_t max_bid_m; 00582 ID_t nbids_m; 00583 Size_t npartitions_m; 00584 std::deque <BankPartition_t *> opened_m; 00585 std::vector<BankPartition_t *> partitions_m; 00586 00587 IDMap_t idmap_m; 00588 00589 00590 public: 00591 00592 typedef int64_t bankstreamoff; 00593 00594 static const std::string BANK_VERSION; 00595 00596 static const std::string IFO_STORE_SUFFIX; 00597 static const std::string MAP_STORE_SUFFIX; 00598 static const std::string LCK_STORE_SUFFIX; 00599 00600 static const std::string FIX_STORE_SUFFIX; 00601 static const std::string VAR_STORE_SUFFIX; 00602 00603 static const std::string TMP_STORE_SUFFIX; 00604 00605 static const char WRITE_LOCK_CHAR; 00606 static const char READ_LOCK_CHAR; 00607 00608 00609 //--------------------------------------------------- Bank_t ----------------- 00624 Bank_t (NCode_t type) 00625 : banktype_m (type), 00626 buffer_size_m (DEFAULT_BUFFER_SIZE), 00627 max_partitions_m (MAX_OPEN_PARTITIONS) 00628 { 00629 init( ); 00630 status_m = 0; 00631 } 00632 00633 00634 //--------------------------------------------------- Bank_t ----------------- 00635 Bank_t (const std::string & type) 00636 : banktype_m (Encode(type)), 00637 buffer_size_m (DEFAULT_BUFFER_SIZE), 00638 max_partitions_m (MAX_OPEN_PARTITIONS) 00639 { 00640 init( ); 00641 status_m = 0; 00642 } 00643 00644 00645 //--------------------------------------------------- ~Bank_t ---------------- 00650 ~Bank_t ( ) 00651 { 00652 if ( is_open_m ) 00653 close( ); 00654 } 00655 00656 00657 //--------------------------------------------------- append ----------------- 00677 void append (IBankable_t & obj); 00678 00679 00680 //--------------------------------------------------- assignEID -------------- 00696 void assignEID (ID_t iid, const std::string & eid); 00697 00698 00699 //--------------------------------------------------- assignIID -------------- 00715 void assignIID (const std::string & eid, ID_t iid); 00716 00717 00718 //--------------------------------------------------- clean ------------------ 00729 void clean ( ); 00730 00731 00732 //--------------------------------------------------- clear ------------------ 00744 void clear ( ); 00745 00746 00747 //--------------------------------------------------- close ------------------ 00756 void close ( ); 00757 00758 00759 //--------------------------------------------------- concat ----------------- 00780 void concat (Bank_t & source); 00781 00782 00783 //--------------------------------------------------- create ----------------- 00800 void create (const std::string & dir, BankMode_t mode = B_READ | B_WRITE); 00801 00802 00803 //--------------------------------------------------- destroy ---------------- 00814 void destroy ( ); 00815 00816 00817 //--------------------------------------------------- empty ------------------ 00820 bool empty ( ) const 00821 { 00822 return ( getSize( ) == 0 ); 00823 } 00824 00825 00826 //--------------------------------------------------- exists ----------------- 00836 bool exists (const std::string & dir) const; 00837 00838 00839 //--------------------------------------------------- existsEID -------------- 00842 bool existsEID (const std::string & eid) const 00843 { 00844 return (idmap_m . exists (eid)); 00845 } 00846 00847 00848 //--------------------------------------------------- existsIID -------------- 00851 bool existsIID (ID_t iid) const 00852 { 00853 return (idmap_m . exists (iid)); 00854 } 00855 00856 00857 //--------------------------------------------------- fetch ------------------ 00873 void fetch (ID_t iid, IBankable_t & obj) 00874 { 00875 fetchBID (lookupBID (iid), obj); 00876 obj . iid_m = iid; 00877 obj . eid_m . assign (idmap_m . lookupEID (iid)); 00878 } 00879 00880 00881 //--------------------------------------------------- fetch ------------------ 00884 void fetch (const std::string & eid, IBankable_t & obj) 00885 { 00886 fetchBID (lookupBID (eid), obj); 00887 obj . iid_m = idmap_m . lookupIID (eid); 00888 obj . eid_m . assign (eid); 00889 } 00890 00891 00892 //--------------------------------------------------- getIDMap --------------- 00902 const IDMap_t & getIDMap ( ) const 00903 { 00904 return idmap_m; 00905 } 00906 00907 00908 //--------------------------------------------------- getIDMapSize ----------- 00917 Size_t getIDMapSize ( ) const 00918 { 00919 return idmap_m . getSize( ); 00920 } 00921 00922 00923 //--------------------------------------------------- getIndexSize ----------- 00939 Size_t getIndexSize ( ) const 00940 { 00941 return last_bid_m; 00942 } 00943 00944 00945 //--------------------------------------------------- getMaxIID -------------- 00952 ID_t getMaxIID ( ) const; 00953 00954 00955 //--------------------------------------------------- getSize ---------------- 00963 Size_t getSize ( ) const 00964 { 00965 return nbids_m; 00966 } 00967 00968 00969 //--------------------------------------------------- getStatus -------------- 00978 signed char getStatus ( ) const 00979 { 00980 return status_m; 00981 } 00982 00983 00984 //--------------------------------------------------- getType ---------------- 00991 NCode_t getType ( ) const 00992 { 00993 return banktype_m; 00994 } 00995 00996 00997 //--------------------------------------------------- isOpen ----------------- 01002 bool isOpen ( ) const 01003 { 01004 return is_open_m; 01005 } 01006 01007 01008 //--------------------------------------------------- lookupBID -------------- 01014 ID_t lookupBID (ID_t iid) const; 01015 01016 01017 //--------------------------------------------------- lookupBID -------------- 01023 ID_t lookupBID (const std::string & eid) const; 01024 01025 01026 //--------------------------------------------------- lookupEID -------------- 01031 const std::string & lookupEID (ID_t iid) const 01032 { 01033 return idmap_m . lookupEID (iid); 01034 } 01035 01036 01037 //--------------------------------------------------- lookupIID -------------- 01042 ID_t lookupIID (const std::string & eid) const 01043 { 01044 return idmap_m . lookupIID (eid); 01045 } 01046 01047 01048 //--------------------------------------------------- open ------------------- 01067 void open (const std::string & dir, BankMode_t mode = B_READ | B_WRITE); 01068 01069 01070 //--------------------------------------------------- remove ----------------- 01087 void remove (ID_t iid) 01088 { 01089 removeBID (lookupBID (iid)); 01090 idmap_m . remove (iid); 01091 } 01092 01093 01094 //--------------------------------------------------- remove ----------------- 01097 void remove (const std::string & eid) 01098 { 01099 removeBID (lookupBID (eid)); 01100 idmap_m . remove (eid); 01101 } 01102 01103 01104 //--------------------------------------------------- replace ---------------- 01127 void replace (ID_t iid, IBankable_t & obj); 01128 01129 01130 //--------------------------------------------------- replace ---------------- 01133 void replace (const std::string & eid, IBankable_t & obj); 01134 01135 01136 //--------------------------------------------------- setStatus -------------- 01144 void setStatus (signed char status) 01145 { 01146 status_m = status; 01147 } 01148 01149 }; 01150 01151 01152 //--------------------------------------------------- BankExists --------------- 01162 bool BankExists (NCode_t ncode, const std::string & dir); 01163 01164 01165 //--------------------------------------------------- PrintBankVersion --------- 01171 void PrintBankVersion (const char * s); 01172 01173 } // namespace AMOS 01174 01175 #endif // #ifndef __Bank_AMOS_HH

Generated on Tue May 17 15:19:01 2005 for libAMOS by doxygen 1.3.8