00001
00002
00003
00004
00005
00006
00007
00008
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
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
00088
virtual void readRecord (std::istream & fix, std::istream & var) = 0;
00089
00090
00091
00106
virtual void writeRecord (std::ostream & fix, std::ostream & var)
const = 0;
00107
00108
00109
public:
00110
00111
00116 IBankable_t ( )
00117 {
00118
iid_m =
NULL_ID;
00119 }
00120
00121
00122
00125 IBankable_t (
const IBankable_t & source)
00126 {
00127 *
this = source;
00128 }
00129
00130
00131
00134 virtual ~IBankable_t ( )
00135 {
00136
00137 }
00138
00139
00140
00143 virtual void clear ( )
00144 {
00145
iid_m =
NULL_ID;
00146
eid_m . erase( );
00147
flags_m .
clear( );
00148 }
00149
00150
00151
00156 const std::string &
getEID ( )
const
00157
{
00158
return eid_m;
00159 }
00160
00161
00162
00167 ID_t getIID ( )
const
00168
{
00169
return iid_m;
00170 }
00171
00172
00173
00178
virtual NCode_t getNCode ( ) const = 0;
00179
00180
00181
00188 bool isRemoved ( )
const
00189
{
00190
return flags_m . is_removed;
00191 }
00192
00193
00194
00199 bool isModified ( )
const
00200
{
00201
return flags_m . is_modified;
00202 }
00203
00204
00205
00210 bool isFlagA ( )
const
00211
{
00212
return flags_m . is_flagA;
00213 }
00214
00215
00216
00221 bool isFlagB ( )
const
00222
{
00223
return flags_m . is_flagB;
00224 }
00225
00226
00227
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
00254 void setFlagA (
bool flag)
00255 {
00256
flags_m . is_flagA = flag;
00257 }
00258
00259
00260
00270 void setFlagB (
bool flag)
00271 {
00272
flags_m . is_flagB = flag;
00273 }
00274
00275
00276
00282 void setIID (
ID_t iid)
00283 {
00284
iid_m = iid;
00285 }
00286
00287 };
00288
00289
00290
00291
00292
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
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
00358
BankPartition_t (
Size_t buffer_size);
00359
00360
00361
00364
~BankPartition_t ( );
00365
00366 };
00367
00368
00369
00383
void addPartition (
bool create);
00384
00385
00386
00389
void appendBID (
IBankable_t & obj);
00390
00391
00392
00395
void fetchBID (
ID_t bid,
IBankable_t & obj);
00396
00397
00398
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
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
00436
void init ( );
00437
00438
00439
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
00467
void lockIFO ( );
00468
00469
00470
00473 BankPartition_t *
openPartition (
ID_t id);
00474
00475
00476
00479
void removeBID (
ID_t bid);
00480
00481
00482
00485
void replaceBID (
ID_t bid,
IBankable_t & obj);
00486
00487
00488
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
00526
void syncIFO (IFOMode_t mode);
00527
00528
00529
00532
void touchFile (
const std::string & path,
int mode,
bool create);
00533
00534
00535
00547
void unlockIFO ( );
00548
00549
00550
00555
Bank_t (
const Bank_t & source);
00556
00557
00558
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
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
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
00650 ~Bank_t ( )
00651 {
00652
if (
is_open_m )
00653
close( );
00654 }
00655
00656
00657
00677
void append (
IBankable_t & obj);
00678
00679
00680
00696
void assignEID (
ID_t iid,
const std::string & eid);
00697
00698
00699
00715
void assignIID (
const std::string & eid,
ID_t iid);
00716
00717
00718
00729
void clean ( );
00730
00731
00732
00744
void clear ( );
00745
00746
00747
00756
void close ( );
00757
00758
00759
00780
void concat (
Bank_t & source);
00781
00782
00783
00800
void create (
const std::string & dir,
BankMode_t mode = B_READ | B_WRITE);
00801
00802
00803
00814
void destroy ( );
00815
00816
00817
00820 bool empty ( )
const
00821
{
00822
return (
getSize( ) == 0 );
00823 }
00824
00825
00826
00836
bool exists (
const std::string & dir)
const;
00837
00838
00839
00842 bool existsEID (
const std::string & eid)
const
00843
{
00844
return (
idmap_m .
exists (eid));
00845 }
00846
00847
00848
00851 bool existsIID (
ID_t iid)
const
00852
{
00853
return (
idmap_m .
exists (iid));
00854 }
00855
00856
00857
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
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
00902 const IDMap_t &
getIDMap ( )
const
00903
{
00904
return idmap_m;
00905 }
00906
00907
00908
00917 Size_t getIDMapSize ( )
const
00918
{
00919
return idmap_m .
getSize( );
00920 }
00921
00922
00923
00939 Size_t getIndexSize ( )
const
00940
{
00941
return last_bid_m;
00942 }
00943
00944
00945
00952
ID_t getMaxIID ( ) const;
00953
00954
00955
00963 Size_t getSize ( )
const
00964
{
00965
return nbids_m;
00966 }
00967
00968
00969
00978 signed char getStatus ( )
const
00979
{
00980
return status_m;
00981 }
00982
00983
00984
00991 NCode_t getType ( )
const
00992
{
00993
return banktype_m;
00994 }
00995
00996
00997
01002 bool isOpen ( )
const
01003
{
01004
return is_open_m;
01005 }
01006
01007
01008
01014
ID_t lookupBID (
ID_t iid)
const;
01015
01016
01017
01023
ID_t lookupBID (
const std::string & eid)
const;
01024
01025
01026
01031 const std::string &
lookupEID (
ID_t iid)
const
01032
{
01033
return idmap_m .
lookupEID (iid);
01034 }
01035
01036
01037
01042 ID_t lookupIID (
const std::string & eid)
const
01043
{
01044
return idmap_m .
lookupIID (eid);
01045 }
01046
01047
01048
01067
void open (
const std::string & dir,
BankMode_t mode = B_READ | B_WRITE);
01068
01069
01070
01087 void remove (
ID_t iid)
01088 {
01089
removeBID (
lookupBID (iid));
01090
idmap_m .
remove (iid);
01091 }
01092
01093
01094
01097 void remove (
const std::string & eid)
01098 {
01099
removeBID (
lookupBID (eid));
01100
idmap_m .
remove (eid);
01101 }
01102
01103
01104
01127
void replace (
ID_t iid,
IBankable_t & obj);
01128
01129
01130
01133
void replace (
const std::string & eid,
IBankable_t & obj);
01134
01135
01136
01144 void setStatus (
signed char status)
01145 {
01146
status_m = status;
01147 }
01148
01149 };
01150
01151
01152
01162
bool BankExists (
NCode_t ncode,
const std::string & dir);
01163
01164
01165
01171
void PrintBankVersion (
const char * s);
01172
01173 }
01174
01175
#endif // #ifndef __Bank_AMOS_HH