~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/statement/create_schema.cc

  • Committer: Brian Aker
  • Date: 2008-12-15 19:32:58 UTC
  • mfrom: (677.1.2 devel)
  • Revision ID: brian@tangent.org-20081215193258-fsvc1sh9h7a9sb1t
Merge from Monty

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
 
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3
 
 *
4
 
 *  Copyright (C) 2009 Sun Microsystems, Inc.
5
 
 *
6
 
 *  This program is free software; you can redistribute it and/or modify
7
 
 *  it under the terms of the GNU General Public License as published by
8
 
 *  the Free Software Foundation; either version 2 of the License, or
9
 
 *  (at your option) any later version.
10
 
 *
11
 
 *  This program is distributed in the hope that it will be useful,
12
 
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 
 *  GNU General Public License for more details.
15
 
 *
16
 
 *  You should have received a copy of the GNU General Public License
17
 
 *  along with this program; if not, write to the Free Software
18
 
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19
 
 */
20
 
 
21
 
#include "config.h"
22
 
 
23
 
#include <drizzled/show.h>
24
 
#include <drizzled/session.h>
25
 
#include <drizzled/statement/create_schema.h>
26
 
#include <drizzled/db.h>
27
 
#include <drizzled/plugin/event_observer.h>
28
 
#include <drizzled/message.h>
29
 
#include <drizzled/plugin/storage_engine.h>
30
 
 
31
 
#include <string>
32
 
 
33
 
using namespace std;
34
 
 
35
 
namespace drizzled
36
 
{
37
 
 
38
 
bool statement::CreateSchema::execute()
39
 
{
40
 
  if (not validateSchemaOptions())
41
 
    return true;
42
 
 
43
 
  if (getSession()->inTransaction())
44
 
  {
45
 
    my_error(ER_TRANSACTIONAL_DDL_NOT_SUPPORTED, MYF(0));
46
 
    return true;
47
 
  }
48
 
 
49
 
  identifier::Schema schema_identifier(string(getSession()->lex->name.str, getSession()->lex->name.length));
50
 
  if (not check(schema_identifier))
51
 
    return false;
52
 
 
53
 
  drizzled::message::schema::init(schema_message, getSession()->lex->name.str);
54
 
 
55
 
  bool res = false;
56
 
  std::string path;
57
 
  schema_identifier.getSQLPath(path);
58
 
 
59
 
  if (unlikely(plugin::EventObserver::beforeCreateDatabase(*getSession(), path)))
60
 
  {
61
 
    my_error(ER_EVENT_OBSERVER_PLUGIN, MYF(0), path.c_str());
62
 
  }
63
 
  else
64
 
  {
65
 
    res= create_db(getSession(), schema_message, getSession()->getLex()->exists());
66
 
    if (unlikely(plugin::EventObserver::afterCreateDatabase(*getSession(), path, res)))
67
 
    {
68
 
      my_error(ER_EVENT_OBSERVER_PLUGIN, schema_identifier);
69
 
      res = false;
70
 
    }
71
 
 
72
 
  }
73
 
 
74
 
  return not res;
75
 
}
76
 
 
77
 
bool statement::CreateSchema::check(const identifier::Schema &identifier)
78
 
{
79
 
  if (not identifier.isValid())
80
 
    return false;
81
 
 
82
 
  if (not plugin::Authorization::isAuthorized(getSession()->user(), identifier))
83
 
    return false;
84
 
 
85
 
  if (not getSession()->getLex()->exists())
86
 
  {
87
 
    if (plugin::StorageEngine::doesSchemaExist(identifier))
88
 
    {
89
 
      my_error(ER_DB_CREATE_EXISTS, identifier);
90
 
 
91
 
      return false;
92
 
    }
93
 
  }
94
 
 
95
 
  return true;
96
 
}
97
 
 
98
 
// We don't actually test anything at this point, we assume it is all bad.
99
 
bool statement::CreateSchema::validateSchemaOptions()
100
 
{
101
 
  size_t num_engine_options= schema_message.engine().options_size();
102
 
  bool rc= num_engine_options ? false : true;
103
 
 
104
 
  for (size_t y= 0; y < num_engine_options; ++y)
105
 
  {
106
 
    my_error(ER_UNKNOWN_SCHEMA_OPTION, MYF(0),
107
 
             schema_message.engine().options(y).name().c_str(),
108
 
             schema_message.engine().options(y).state().c_str());
109
 
 
110
 
    rc= false;
111
 
  }
112
 
 
113
 
  return rc;
114
 
}
115
 
 
116
 
} /* namespace drizzled */
117