client-cpp  0.8.1
SQLiteDBLogStorage.hpp
Go to the documentation of this file.
1 
17 #ifndef SQLITEDBLOGSTORAGE_HPP_
18 #define SQLITEDBLOGSTORAGE_HPP_
19 
20 #include <memory>
21 #include <list>
22 #include <cstdint>
23 #include <string>
24 #include <unordered_map>
25 
26 #include <sqlite3.h>
27 
28 #include "kaa/KaaThread.hpp"
29 #include "kaa/log/ILogStorage.hpp"
32 
33 
34 
35 #define KAA_DEFAULT_LOG_DB_STORAGE "logs.db"
36 
37 namespace kaa {
38 
39 class IKaaClientContext;
40 
42 {
44 
49 
54 };
55 
57 public:
59  std::size_t bucketSize = LogStorageConstants::DEFAULT_MAX_BUCKET_SIZE,
60  std::size_t bucketRecordCount = LogStorageConstants::DEFAULT_MAX_BUCKET_RECORD_COUNT);
61 
63  const std::string& dbName,
64  int optimizationMask = (int)SQLiteOptimizationOptions::SQLITE_NO_OPTIMIZATIONS,
65  std::size_t bucketSize = LogStorageConstants::DEFAULT_MAX_BUCKET_SIZE,
66  std::size_t bucketRecordCount = LogStorageConstants::DEFAULT_MAX_BUCKET_RECORD_COUNT);
67 
69 
70  virtual BucketInfo addLogRecord(LogRecord&& record);
71  virtual ILogStorageStatus& getStatus() { return *this; }
72 
73  virtual LogBucket getNextBucket();
74  virtual void removeBucket(std::int32_t bucketId);
75  virtual void rollbackBucket(std::int32_t bucketId);
76 
77  virtual std::size_t getConsumedVolume();
78  virtual std::size_t getRecordsCount();
79 
80 private:
81  void init(int optimizationMask);
82 
83  void openDBConnection();
84  void closeDBConnection();
85 
86  void initDBTables();
87  void applyOptimization(int mask);
88 
89  void markBucketsAsFree();
90 
91  void addNextBucket();
92 
93  bool checkBucketOverflow(const LogRecord& record) {
94  return (currentBucketSize_ + record.getSize() > maxBucketSize_) ||
95  (currentBucketRecordCount_ + 1 > maxBucketRecordCount_);
96  }
97 
98  void markBucketAsInUse(std::int32_t id);
99 
100  bool truncateIfBucketSizeIncompatible();
101 
102 private:
103  struct InnerBucketInfo {
104  InnerBucketInfo(std::size_t sizeInBytes, std::size_t sizeInLogs)
105  : sizeInBytes_(sizeInBytes), sizeInLogs_(sizeInLogs) {}
106 
107  std::size_t sizeInBytes_ = 0;
108  std::size_t sizeInLogs_ = 0;
109  };
110 
111 private:
112 
113  const std::string dbName_;
114  sqlite3 *db_ = nullptr;
115 
116  const std::size_t maxBucketSize_;
117  const std::size_t maxBucketRecordCount_;
118 
119  std::int32_t currentBucketId_ = 0;
120  std::size_t currentBucketSize_ = 0;
121  std::size_t currentBucketRecordCount_ = 0;
122 
123  std::size_t unmarkedRecordCount_ = 0;
124  std::size_t totalRecordCount_ = 0;
125 
126  std::size_t consumedMemory_ = 0;
127  std::unordered_map<std::int32_t/*Bucket id*/, InnerBucketInfo> consumedMemoryStorage_;
128 
129  KAA_MUTEX_DECLARE(sqliteLogStorageGuard_);
130 
131  IKaaClientContext &context_;
132 };
133 
134 } /* namespace kaa */
135 
136 #endif /* SQLITEDBLOGSTORAGE_HPP_ */
SQLiteDBLogStorage(IKaaClientContext &context, std::size_t bucketSize=LogStorageConstants::DEFAULT_MAX_BUCKET_SIZE, std::size_t bucketRecordCount=LogStorageConstants::DEFAULT_MAX_BUCKET_RECORD_COUNT)
The helper class which is used to transfer logs from LogStorage to LogCollector.
Definition: LogBucket.hpp:33
virtual std::size_t getRecordsCount()
Returns the number of collected logs.
std::size_t getSize() const
Definition: LogRecord.hpp:50
virtual LogBucket getNextBucket()
Returns a new log bucket.
virtual void removeBucket(std::int32_t bucketId)
Tells a log storage to remove a log bucket.
virtual BucketInfo addLogRecord(LogRecord &&record)
Persists a log record.
virtual std::size_t getConsumedVolume()
Returns amount of bytes collected logs are consumed.
virtual ILogStorageStatus & getStatus()
Returns a log storage status.
static const std::size_t DEFAULT_MAX_BUCKET_RECORD_COUNT
static const std::size_t DEFAULT_MAX_BUCKET_SIZE
Describes a unique log bucket.
Definition: BucketInfo.hpp:31
SQLiteOptimizationOptions
Interface of a log storage.
Definition: ILogStorage.hpp:40
virtual void rollbackBucket(std::int32_t bucketId)
Tells a log storage to consider a log bucket as unused, i.e. a log bucket will be accessible again vi...
The public interface to represent the current log storage state.