~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/xid.cc

  • Committer: Monty Taylor
  • Date: 2011-03-08 06:21:17 UTC
  • mfrom: (2223.1.3 build)
  • Revision ID: mordred@inaugust.com-20110308062117-4i2syq1gqtmcmcyk
Merge Olaf - XID and Dynamic_array refactoring
Merge Andrew - Optimizer bugs

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
#include <drizzled/charset.h>
26
26
#include <drizzled/global_charset_info.h>
27
27
#include <drizzled/charset_info.h>
28
 
 
 
28
#include <boost/thread/locks.hpp>
29
29
#include <boost/thread/mutex.hpp>
30
30
 
31
 
namespace drizzled
32
 
{
 
31
namespace drizzled {
33
32
 
34
33
bool XID::eq(XID *xid)
35
34
{
55
54
 
56
55
void XID::set(uint64_t xid)
57
56
{
58
 
  my_xid tmp;
59
57
  formatID= 1;
60
58
  set(DRIZZLE_XID_PREFIX_LEN, 0, DRIZZLE_XID_PREFIX);
61
 
  memcpy(data+DRIZZLE_XID_PREFIX_LEN, &server_id, sizeof(server_id));
62
 
  tmp= xid;
63
 
  memcpy(data+DRIZZLE_XID_OFFSET, &tmp, sizeof(tmp));
64
 
  gtrid_length=DRIZZLE_XID_GTRID_LEN;
 
59
  memcpy(data + DRIZZLE_XID_PREFIX_LEN, &server_id, sizeof(server_id));
 
60
  my_xid tmp= xid;
 
61
  memcpy(data + DRIZZLE_XID_OFFSET, &tmp, sizeof(tmp));
 
62
  gtrid_length= DRIZZLE_XID_GTRID_LEN;
65
63
}
66
64
 
67
65
void XID::set(long g, long b, const char *d)
85
83
my_xid XID::quick_get_my_xid()
86
84
{
87
85
  my_xid tmp;
88
 
  memcpy(&tmp, data+DRIZZLE_XID_OFFSET, sizeof(tmp));
 
86
  memcpy(&tmp, data + DRIZZLE_XID_OFFSET, sizeof(tmp));
89
87
  return tmp;
90
88
}
91
89
 
97
95
    quick_get_my_xid() : 0;
98
96
}
99
97
 
100
 
uint32_t XID::length()
 
98
uint32_t XID::length() const
101
99
{
102
100
  return sizeof(formatID)+sizeof(gtrid_length)+sizeof(bqual_length)+
103
101
    gtrid_length+bqual_length;
104
102
}
105
103
 
106
 
unsigned char *XID::key()
 
104
const unsigned char *XID::key() const
107
105
{
108
106
  return (unsigned char *)&gtrid_length;
109
107
}
110
108
 
111
 
uint32_t XID::key_length()
 
109
uint32_t XID::key_length() const
112
110
{
113
111
  return sizeof(gtrid_length)+sizeof(bqual_length)+gtrid_length+bqual_length;
114
112
}
115
113
 
116
 
/***************************************************************************
117
 
  Handling of XA id cacheing
118
 
***************************************************************************/
119
 
boost::mutex LOCK_xid_cache;
120
 
HASH xid_cache;
121
 
 
122
 
unsigned char *xid_get_hash_key(const unsigned char *, size_t *, bool);
123
 
void xid_free_hash(void *);
124
 
 
125
 
unsigned char *xid_get_hash_key(const unsigned char *ptr, size_t *length,
126
 
                        bool )
127
 
{
128
 
  *length=((XID_STATE*)ptr)->xid.key_length();
129
 
  return ((XID_STATE*)ptr)->xid.key();
130
 
}
131
 
 
132
 
void xid_free_hash(void *ptr)
133
 
{
134
 
  XID_STATE *state= (XID_STATE *)ptr;
135
 
  if (state->in_session == false)
136
 
    delete state;
137
 
}
138
 
 
139
114
bool xid_cache_init()
140
115
{
141
 
  return hash_init(&xid_cache, &my_charset_bin, 100, 0, 0,
142
 
                   xid_get_hash_key, xid_free_hash, 0) != 0;
 
116
  return false;
143
117
}
144
118
 
145
119
void xid_cache_free()
146
120
{
147
 
  if (hash_inited(&xid_cache))
148
 
  {
149
 
    hash_free(&xid_cache);
150
 
  }
151
 
}
152
 
 
153
 
XID_STATE *xid_cache_search(XID *xid)
154
 
{
155
 
  LOCK_xid_cache.lock();
156
 
  XID_STATE *res=(XID_STATE *)hash_search(&xid_cache, xid->key(), xid->key_length());
157
 
  LOCK_xid_cache.unlock();
158
 
  return res;
159
 
}
160
 
 
161
 
bool xid_cache_insert(XID *xid, enum xa_states xa_state)
162
 
{
163
 
  XID_STATE *xs;
164
 
  bool res;
165
 
  LOCK_xid_cache.lock();
166
 
  if (hash_search(&xid_cache, xid->key(), xid->key_length()))
167
 
  {
168
 
    res= false;
169
 
  }
170
 
  else if ((xs = new XID_STATE) == NULL)
171
 
  {
172
 
    res= true;
173
 
  }
174
 
  else
175
 
  {
176
 
    xs->xa_state=xa_state;
177
 
    xs->xid.set(xid);
178
 
    xs->in_session=0;
179
 
    res= my_hash_insert(&xid_cache, (unsigned char*)xs);
180
 
  }
181
 
  LOCK_xid_cache.unlock();
182
 
  return res;
183
 
}
184
 
 
185
 
bool xid_cache_insert(XID_STATE *xid_state)
186
 
{
187
 
  LOCK_xid_cache.lock();
188
 
  bool res=my_hash_insert(&xid_cache, (unsigned char*)xid_state);
189
 
  LOCK_xid_cache.unlock();
190
 
  return res;
191
 
}
192
 
 
193
 
void xid_cache_delete(XID_STATE *xid_state)
194
 
{
195
 
  LOCK_xid_cache.lock();
196
 
  hash_delete(&xid_cache, (unsigned char *)xid_state);
197
 
  LOCK_xid_cache.unlock();
 
121
}
 
122
 
 
123
void xid_cache_insert(XID*, xa_states)
 
124
{
 
125
}
 
126
 
 
127
void xid_cache_delete(XID_STATE*)
 
128
{
198
129
}
199
130
 
200
131
} /* namespace drizzled */