~drizzle-trunk/drizzle/development

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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/* - mode: c; c-basic-offset: 2; indent-tabs-mode: nil; -*-
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
 *
 *  Copyright (C) 2009 Sun Microsystems, Inc.
 *
 *  Authors:
 *
 *  Jay Pipes <joinfu@sun.com>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */

/**
 * @file
 *
 * Defines the API of a simple index for the transaction log
 */

#pragma once

#include "transaction_log.h"
#include "transaction_log_entry.h"

#include <pthread.h>
#include <string>

namespace drizzled { namespace message {class Transaction;}}

class TransactionLogIndex
{
public:
  explicit TransactionLogIndex(TransactionLog &in_log);
  ~TransactionLogIndex();
  /**
   * Returns the minimum end timestamp of a transaction
   * in the transaction log.
   */
  uint64_t getMinEndTimestamp() const;
  /**
   * Returns the maximum end timestamp of a transaction
   * in the transaction log.
   */
  uint64_t getMaxEndTimestamp() const;
  /**
   * Returns the minimum transaction ID of a transaction
   * in the transaction log.
   */
  uint64_t getMinTransactionId() const;
  /**
   * Returns the maximum transaction ID of a transaction
   * in the transaction log.
   */
  uint64_t getMaxTransactionId() const;
  /**
   * Returns the total number of entries in the transaction log
   */
  uint64_t getNumLogEntries() const;
  /**
   * Returns the total number of transaction entries in the transaction log
   */
  uint64_t getNumTransactionEntries() const;
  /**
   * Returns whether the index encountered an
   * error on its last action.
   */
  bool hasError() const;
  /**
   * Returns the current error message
   */
  const std::string &getErrorMessage() const;
  /**
   * Returns a reference to the index's collection
   * of log entry objects
   */
  TransactionLog::Entries &getEntries();
  /**
   * Returns a reference to the index's collection
   * of transaction entry objects
   */
  TransactionLog::TransactionEntries &getTransactionEntries();
  /**
   * Adds a new entry to the index of type Transaction message.
   *
   * @param[in] The transaction log entry
   * @param[in] The transaction message
   * @param[in] The checksum for the transaction message bytes
   */
  void addEntry(const TransactionLogEntry &entry,
                const drizzled::message::Transaction &transaction,
                uint32_t checksum);
  /**
   * Clears all data out of the transaction log
   * index.
   *
   * @note
   *
   * No locks are taken here.  Currently only used in debugging.
   */
  void clear();

  /* Some methods returning size in bytes of the index and its parts */
  size_t getTransactionEntriesSizeInBytes();
  size_t getEntriesSizeInBytes();
  size_t getSizeInBytes();
private:
  /**
   * Helper function to open/create the index from 
   * the transaction log.
   */
  void open();
  /**
   * Clears the internal error state
   */
  void clearError();

  TransactionLog &log; ///< The transaction log instance
  int index_file; ///< File descriptor for the transaction log on-disk index file
  const std::string index_file_path; ///< Filename of the on-disk transaction log index
  bool has_error; ///< Index is in error mode?
  std::string error_message; ///< Current error message

  uint64_t min_end_timestamp; ///< Minimum end timestamp in log
  uint64_t max_end_timestamp; ///< Maximim end timestamp in log
  uint64_t min_transaction_id; ///< Minimum transaction ID in log
  uint64_t max_transaction_id; ///< Maximum transaction ID in log

  TransactionLog::Entries entries; ///< Collection of information about the entries in the log
  TransactionLog::TransactionEntries transaction_entries; ///<

  pthread_mutex_t index_lock; ///< The global index lock
};