summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/orbsvcs/Log/PersistStore.h
blob: 6945a77b6b0f6d18b18a70395c65b087eaefa804 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
// -*- C++ -*-

//=============================================================================
/**
 *  @file   PersistStore.h
 *
 *  $Id$
 *
 *  This flat file demonstrates basic persistence.
 *
 *  @author Rob Ruff <rruff@scires.com>
 *  @author David A. Hanvey <d.hanvey@qub.ac.uk>
 */
//=============================================================================

#ifndef TAO_PERSIST_STORE_H
#define TAO_PERSIST_STORE_H
#include /**/ "ace/pre.h"

#include "orbsvcs/DsLogAdminS.h"
#include "tao/Typecode.h"

#if !defined (ACE_LACKS_PRAGMA_ONCE)
# pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */

#include "orbsvcs/DsLogAdminC.h"
#include "ace/Mutex.h"
#include "log_serv_export.h"

#define PERSIST_LOG_DEFAULT_MAX_REC_LIST_LEN 250

struct PersistentData
{
  DsLogAdmin::RecordId id;
  DsLogAdmin::TimeT time;
  CORBA::TCKind kind;
  int byte_order;
  size_t mb_size;
};

/**
 * @class TAO_PersistStore
 *
 * @brief A class for storing DsLogAdmin::LogRecord *'s
 *
 * This implementation is to serve for illustration purposes.
 */

class TAO_Log_Serv_Export TAO_PersistStore
{
 public:

  // = Initialization and termination methods

  /// Constructor.
  TAO_PersistStore (CORBA::ULongLong max_size = 0,
                    CORBA::ULong max_rec_list_len
                    = PERSIST_LOG_DEFAULT_MAX_REC_LIST_LEN);

  /// Destructor.
  ~TAO_PersistStore (void);

  /// Initialization.
  int open (const char * file_name);

  /// Close the record store.
  int close (void);

  // = LogRecordStore status methods.

  /// Get the current set value of the max size of the log data.
  CORBA::ULongLong get_max_size (void);

  /// Set the max size of log data. size == 0, => infinite.
  void set_max_size (CORBA::ULongLong size);

  /// Gets the current size of the log data.
  CORBA::ULongLong get_current_size (void);

  /// Get the number of records in the log right now.
  CORBA::ULongLong get_n_records (void);

  // = Record logging, retrieval, update and removal methods

  /// Insert rec into storage. Returns 0 on success -1 on failure and 1
  /// if the log is full.
  int log (DsLogAdmin::LogRecord &rec);

  /// Set rec to the pointer to the LogRecord with the given
  /// id. Returns 0 on success, -1 on failure.
  int retrieve (DsLogAdmin::RecordId id, DsLogAdmin::LogRecord &rec);

  /// Return the percentage of the max space that is currently being used,
  /// If size is infinite, return 0.
  unsigned short get_percentage_full (void);

 protected:

  /// Assigned to a new RecordId and then incremented.
  DsLogAdmin::RecordId maxid_;

  /// The maximum size of the log.
  CORBA::ULongLong max_size_;

  /// The current size (in bytes) of the log.
  CORBA::ULongLong current_size_;

  /// The current number of records in the log.
  CORBA::ULongLong num_records_;

  /// The max size of the record list returned in a query.
  CORBA::ULong max_rec_list_len_;

  /// The file descriptor for the persistent log storage file.
  ACE_HANDLE write_persistent_file_;
  ACE_HANDLE read_persistent_file_;

  /// Lock the log operation.
  ACE_Mutex write_lock_;
};

#include /**/ "ace/post.h"
#endif /*TAO_PERSIST_STORE_H*/