~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/xid.cc

  • Committer: Stewart Smith
  • Date: 2010-12-02 06:58:45 UTC
  • mto: (2021.1.2 build)
  • mto: This revision was merged to the branch mainline in revision 1971.
  • Revision ID: stewart@flamingspork.com-20101202065845-th85agu1pl15seh6
update select and subselect_mat test results EXPLAIN output due to improvements in innodb stats

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
2
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3
3
 *
4
 
 *  Copyright (C) 2008 Sun Microsystems, Inc.
 
4
 *  Copyright (C) 2008 Sun Microsystems
5
5
 *
6
6
 *  This program is free software; you can redistribute it and/or modify
7
7
 *  it under the terms of the GNU General Public License as published by
17
17
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
18
18
 */
19
19
 
20
 
#include <config.h>
21
 
#include <cstring>
 
20
#include "config.h"
 
21
#include <string.h>
22
22
 
 
23
#include <drizzled/my_hash.h>
23
24
#include <drizzled/xid.h>
24
 
#include <drizzled/charset.h>
25
 
 
26
 
namespace drizzled {
 
25
#include "drizzled/charset.h"
 
26
#include "drizzled/global_charset_info.h"
 
27
#include "drizzled/charset_info.h"
 
28
 
 
29
#include <boost/thread/mutex.hpp>
 
30
 
 
31
namespace drizzled
 
32
{
 
33
 
 
34
bool XID::eq(XID *xid)
 
35
{
 
36
  return eq(xid->gtrid_length, xid->bqual_length, xid->data);
 
37
}
 
38
 
 
39
bool XID::eq(long g, long b, const char *d)
 
40
{
 
41
  return g == gtrid_length && b == bqual_length && !memcmp(d, data, g+b);
 
42
}
 
43
 
 
44
void XID::set(XID *xid)
 
45
{
 
46
  memcpy(this, xid, xid->length());
 
47
}
 
48
 
 
49
void XID::set(long f, const char *g, long gl, const char *b, long bl)
 
50
{
 
51
  formatID= f;
 
52
  memcpy(data, g, gtrid_length= gl);
 
53
  memcpy(data+gl, b, bqual_length= bl);
 
54
}
27
55
 
28
56
void XID::set(uint64_t xid)
29
57
{
 
58
  my_xid tmp;
30
59
  formatID= 1;
31
60
  set(DRIZZLE_XID_PREFIX_LEN, 0, DRIZZLE_XID_PREFIX);
32
 
  memcpy(data + DRIZZLE_XID_PREFIX_LEN, &server_id, sizeof(server_id));
33
 
  my_xid tmp= xid;
34
 
  memcpy(data + DRIZZLE_XID_OFFSET, &tmp, sizeof(tmp));
35
 
  gtrid_length= DRIZZLE_XID_GTRID_LEN;
 
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;
36
65
}
37
66
 
38
67
void XID::set(long g, long b, const char *d)
48
77
  return formatID == -1;
49
78
}
50
79
 
51
 
void XID::set_null()
 
80
void XID::null()
52
81
{
53
82
  formatID= -1;
54
83
}
56
85
my_xid XID::quick_get_my_xid()
57
86
{
58
87
  my_xid tmp;
59
 
  memcpy(&tmp, data + DRIZZLE_XID_OFFSET, sizeof(tmp));
 
88
  memcpy(&tmp, data+DRIZZLE_XID_OFFSET, sizeof(tmp));
60
89
  return tmp;
61
90
}
62
91
 
68
97
    quick_get_my_xid() : 0;
69
98
}
70
99
 
71
 
uint32_t XID::length() const
 
100
uint32_t XID::length()
72
101
{
73
102
  return sizeof(formatID)+sizeof(gtrid_length)+sizeof(bqual_length)+
74
103
    gtrid_length+bqual_length;
75
104
}
76
105
 
 
106
unsigned char *XID::key()
 
107
{
 
108
  return (unsigned char *)&gtrid_length;
 
109
}
 
110
 
 
111
uint32_t XID::key_length()
 
112
{
 
113
  return sizeof(gtrid_length)+sizeof(bqual_length)+gtrid_length+bqual_length;
 
114
}
 
115
 
 
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
bool xid_cache_init()
 
140
{
 
141
  return hash_init(&xid_cache, &my_charset_bin, 100, 0, 0,
 
142
                   xid_get_hash_key, xid_free_hash, 0) != 0;
 
143
}
 
144
 
 
145
void xid_cache_free()
 
146
{
 
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();
 
198
}
 
199
 
77
200
} /* namespace drizzled */