~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
145
146
147
148
149
150
151
152
153
154
155
156
157
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
 *
 *  Copyright (C) 2008 Sun Microsystems, Inc.
 *  Copyright (C) 2010 Jay Pipes <jaypipes@gmail.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; version 2 of the License.
 *
 *  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
 */

#pragma once

#include <cstddef>

namespace drizzled {

namespace plugin
{
  class MonitoredInTransaction;
  class TransactionalStorageEngine;
  class XaResourceManager;
}

/**
 * Either statement transaction or normal transaction - related
 * session-specific resource manager data state.
 *
 * If a resource manager participates in a statement/transaction,
 * an instance of this class is present in
 * session->transaction.{stmt|all}.resource_contexts.
 *
 * When it's time to commit or rollback, each resource context
 * is used to access the resource manager's prepare()/commit()/rollback()
 * methods, and also to evaluate if a full two phase commit is
 * necessary.
 * 
 * @sa General description of transaction handling in drizzled/transaction_services.cc.
 */
class ResourceContext
{
public:
  ResourceContext() :
    monitored(NULL),
    xa_resource_manager(NULL),
    trx_storage_engine(NULL),
    modified_data(false)
  {}

  /** Clear, prepare for reuse. */
  void reset();

  /**
   * Marks that the underlying resource manager
   * has modified data state.
   */
  void markModifiedData();

  /**
   * Returns true if the underlying resource manager
   * has modified data state.
   */
  bool hasModifiedData() const;

  /**
   * Returns true if the underlying resource
   * manager has registered with the transaction
   * manager for this transaction.
   */
  bool isStarted() const;

  /** 
   * Mark this context as modifying data if the argument has also modified data
   */
  void coalesceWith(const ResourceContext *stmt_trx);

  /**
   * Returns the underlying descriptor for the resource
   * this context tracks.
   */
  plugin::MonitoredInTransaction *getMonitored() const
  {
    return monitored;
  }

  /**
   * Sets the underlying descriptor for the resource
   */
  void setMonitored(plugin::MonitoredInTransaction *in_monitored)
  {
    monitored= in_monitored;
  }

  /**
   * Returns the underlying transactional storage engine
   * this context tracks or NULL if not SQL transactional capable.
   */
  plugin::TransactionalStorageEngine *getTransactionalStorageEngine() const
  {
    return trx_storage_engine;
  }

  /**
   * Sets the underlying transactional storage engine
   */
  void setTransactionalStorageEngine(plugin::TransactionalStorageEngine *in_trx_storage_engine)
  {
    trx_storage_engine= in_trx_storage_engine;
  }

  /**
   * Returns the underlying XA resource manager
   * this context tracks or NULL if not XA capable.
   */
  plugin::XaResourceManager *getXaResourceManager() const
  {
    return xa_resource_manager;
  }

  /**
   * Sets the underlying xa resource manager
   */
  void setXaResourceManager(plugin::XaResourceManager *in_xa_resource_manager)
  {
    xa_resource_manager= in_xa_resource_manager;
  }
private:
  /**
   * A descriptor of the monitored resource
   */
  plugin::MonitoredInTransaction *monitored;
  /**
   * The XA resource manager or NULL if not XA capable.
   */
  plugin::XaResourceManager *xa_resource_manager;
  /**
   * The transactional storage engine or NULL if not SQL transaction capable.
   */
  plugin::TransactionalStorageEngine *trx_storage_engine;
  /**
   * Whether the underlying resource manager has changed
   * some data state.
   */
  bool modified_data;
};

} /* namespace drizzled */