~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/statement/release_savepoint.cc

Merge Jay

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
#include <drizzled/show.h>
23
23
#include <drizzled/session.h>
24
24
#include <drizzled/statement/release_savepoint.h>
 
25
#include "drizzled/transaction_services.h"
 
26
#include "drizzled/named_savepoint.h"
 
27
 
 
28
#include <string>
 
29
 
 
30
using namespace std;
25
31
 
26
32
namespace drizzled
27
33
{
28
34
 
29
35
bool statement::ReleaseSavepoint::execute()
30
36
{
31
 
  SAVEPOINT *sv;
32
 
  for (sv= session->transaction.savepoints; sv; sv= sv->prev)
 
37
  /*
 
38
   * Look through the deque of savepoints.  If we
 
39
   * find one with the same name, we release it and
 
40
   * unbind it from our deque.
 
41
   */
 
42
  TransactionServices &transaction_services= TransactionServices::singleton();
 
43
  deque<NamedSavepoint> &savepoints= session->transaction.savepoints;
 
44
  deque<NamedSavepoint>::iterator iter;
 
45
 
 
46
  for (iter= savepoints.begin();
 
47
       iter != savepoints.end();
 
48
       ++iter)
33
49
  {
 
50
    NamedSavepoint &sv= *iter;
 
51
    const string &sv_name= sv.getName();
34
52
    if (my_strnncoll(system_charset_info,
35
 
                     (unsigned char *) session->lex->ident.str, 
 
53
                     (unsigned char *) session->lex->ident.str,
36
54
                     session->lex->ident.length,
37
 
                     (unsigned char *) sv->name, 
38
 
                     sv->length) == 0)
39
 
    {
 
55
                     (unsigned char *) sv_name.c_str(),
 
56
                     sv_name.size()) == 0)
40
57
      break;
41
 
    }
42
58
  }
43
 
  if (sv)
 
59
  if (iter != savepoints.end())
44
60
  {
45
 
    if (ha_release_savepoint(session, sv))
46
 
    {
47
 
      return true;
48
 
    }
49
 
    else
50
 
    {
51
 
      session->my_ok();
52
 
    }
53
 
    session->transaction.savepoints= sv->prev;
 
61
    NamedSavepoint &sv= *iter;
 
62
    (void) transaction_services.ha_release_savepoint(session, sv);
 
63
    savepoints.erase(iter);
 
64
    session->my_ok();
54
65
  }
55
66
  else
56
67
  {
63
74
}
64
75
 
65
76
} /* namespace drizzled */
66