AMPS C/C++ Client Class Reference
AMPS C/C++ Client Version 5.3.3.1
PublishStore.hpp
Go to the documentation of this file.
1 //
3 // Copyright (c) 2010-2021 60East Technologies Inc., All Rights Reserved.
4 //
5 // This computer software is owned by 60East Technologies Inc. and is
6 // protected by U.S. copyright laws and other laws and by international
7 // treaties. This computer software is furnished by 60East Technologies
8 // Inc. pursuant to a written license agreement and may be used, copied,
9 // transmitted, and stored only in accordance with the terms of such
10 // license agreement and with the inclusion of the above copyright notice.
11 // This computer software or any other copies thereof may not be provided
12 // or otherwise made available to any other person.
13 //
14 // U.S. Government Restricted Rights. This computer software: (a) was
15 // developed at private expense and is in all respects the proprietary
16 // information of 60East Technologies Inc.; (b) was not developed with
17 // government funds; (c) is a trade secret of 60East Technologies Inc.
18 // for all purposes of the Freedom of Information Act; and (d) is a
19 // commercial item and thus, pursuant to Section 12.212 of the Federal
20 // Acquisition Regulations (FAR) and DFAR Supplement Section 227.7202,
21 // Government's use, duplication or disclosure of the computer software
22 // is subject to the restrictions set forth by 60East Technologies Inc..
23 //
25 
26 #ifndef _PUBLISHSTORE_H_
27 #define _PUBLISHSTORE_H_
28 
29 #include <ampsplusplus.hpp>
30 #include <BlockPublishStore.hpp>
31 #include <MMapStoreBuffer.hpp>
32 #ifndef _WIN32
33 #include <unistd.h>
34 #endif
35 
40 
41 namespace AMPS
42 {
47 {
48 public:
53  PublishStore(const std::string& fileName_)
54  : BlockPublishStore(new MMapStoreBuffer(fileName_), 1000, true)
55  , _fileName(fileName_)
56  , _initialBlocks(1000)
57  , _truncateOnClose(false)
58  {
59  recover();
60  }
61 
67  PublishStore(const std::string& fileName_, size_t blocksPerRealloc_)
68  : BlockPublishStore(new MMapStoreBuffer(fileName_),
69  (amps_uint32_t)blocksPerRealloc_, true)
70  , _fileName(fileName_)
71  , _initialBlocks((int)blocksPerRealloc_)
72  , _truncateOnClose(false)
73  {
74  recover();
75  }
76 
77  ~PublishStore()
78  {
79  close();
80  }
81 
87  void truncateOnClose(bool truncate_)
88  {
89  _truncateOnClose = truncate_;
90  }
91 
94  void close()
95  {
96  if (!_blockStore.getBuffer()) return;
97  amps_uint64_t unpersisted = unpersistedCount();
98  BufferLock guard(_blockStore);
99  reinterpret_cast<MMapStoreBuffer*>(_blockStore.getBuffer())->close();
100  if (_truncateOnClose && unpersisted == 0)
101  {
102 #ifdef _WIN32
103  size_t retries = 0;
104  HANDLE file = INVALID_HANDLE_VALUE;
105  while( file == INVALID_HANDLE_VALUE && retries++ < 5)
106  {
107  file = CreateFileA(_fileName.c_str(),
108  GENERIC_READ | GENERIC_WRITE, 0, NULL,
109  OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
110  }
111  // Ignore failure, since this could be in destructor
112  if( file != INVALID_HANDLE_VALUE )
113  {
114  SetFilePointer(file, (LONG)(_initialBlocks*_blockStore.getBlockSize()),
115  NULL, FILE_BEGIN);
116  SetEndOfFile(file);
117  CloseHandle(file);
118  }
119 #else
120  if (truncate(_fileName.c_str(),
121  (off_t)_initialBlocks * (off_t)_blockStore.getBlockSize()) == -1)
122  {
123  // Ignore failure, since this could be in destructor
124  ;
125  }
126 #endif
127  }
128  }
129 
132  void sync()
133  {
134  BufferLock guard(_blockStore);
135  reinterpret_cast<MMapStoreBuffer*>(_blockStore.getBuffer())->sync();
136  }
137 private:
138  std::string _fileName;
139  int _initialBlocks;
140  bool _truncateOnClose;
141 };
142 
143 } //namespace AMPS
144 
145 #endif //_PUBLISHSTORE_H_
146 
Buffer * getBuffer()
Return the buffer underlying the store for direct write/read.
Definition: BlockStore.hpp:591
Provides AMPS::MMapStoreBuffer, an AMPS::Buffer implementation used by the AMPS::MMapBookmarkStore.
void truncateOnClose(bool truncate_)
Tell the PublishStore if it should return the file to its initial capacity when the store is closed i...
Definition: PublishStore.hpp:87
Provides AMPS::BlockPublishStore, a concrete implementation of a store that breaks the allocated stor...
PublishStore(const std::string &fileName_)
Create a PublishStore that uses fileName_ for the storage.
Definition: PublishStore.hpp:53
A StoreImpl implementation that uses a memory-mapped file to provide a publish store that persists ac...
Definition: PublishStore.hpp:46
PublishStore(const std::string &fileName_, size_t blocksPerRealloc_)
Create a PublishStore that uses fileName_ for the storage.
Definition: PublishStore.hpp:67
Core type, function, and class declarations for the AMPS C++ client.
size_t unpersistedCount() const
Method to return the count of messages that currently in the Store because they have not been discard...
Definition: BlockPublishStore.hpp:614
A Buffer implementation that uses a memory mapped file as its storage.
Definition: MMapStoreBuffer.hpp:49
void sync()
Force the PublishStore to sync to disk.
Definition: PublishStore.hpp:132
Used as a base class for other stores in the AMPS C++ client, this is an implementation of StoreImpl ...
Definition: BlockPublishStore.hpp:60
void close()
Close the PublishStore and associated file.
Definition: PublishStore.hpp:94
amps_uint32_t getBlockSize() const
Get the size of each Block, as set in the constructor.
Definition: BlockStore.hpp:160
Definition: ampsplusplus.hpp:103