29
29
#include "drizzled/cursor.h"
30
30
#include "drizzled/data_home.h"
32
#include <drizzled/pthread_globals.h>
34
#include <drizzled/execute.h>
36
32
#include "drizzled/internal/my_sys.h"
73
69
CachedDirectory directory(getDataHomeCatalog().file_string(), CachedDirectory::DIRECTORY);
74
70
CachedDirectory::Entries files= directory.getEntries();
75
boost::unique_lock<boost::shared_mutex> scopedLock(mutex);
77
74
for (CachedDirectory::Entries::iterator fileIter= files.begin();
78
75
fileIter != files.end(); fileIter++)
83
80
if (not entry->filename.compare(GLOBAL_TEMPORARY_EXT))
86
if (readSchemaFile(entry->filename, schema_message))
83
SchemaIdentifier filename(entry->filename);
84
if (readSchemaFile(filename, schema_message))
88
identifier::Schema schema_identifier(schema_message.name());
86
SchemaIdentifier schema_identifier(schema_message.name());
90
88
pair<SchemaCache::iterator, bool> ret=
91
89
schema_cache.insert(make_pair(schema_identifier.getPath(), new message::Schema(schema_message)));
93
91
if (ret.second == false)
95
93
abort(); // If this has happened, something really bad is going down.
101
void Schema::startup(drizzled::Session &)
105
void Schema::doGetSchemaIdentifiers(identifier::Schema::vector &set_of_names)
100
void Schema::doGetSchemaIdentifiers(SchemaIdentifier::vector &set_of_names)
107
102
mutex.lock_shared();
110
105
iter != schema_cache.end();
113
set_of_names.push_back(identifier::Schema((*iter).second->name()));
108
set_of_names.push_back(SchemaIdentifier((*iter).second->name()));
116
111
mutex.unlock_shared();
119
bool Schema::doGetSchemaDefinition(const identifier::Schema &schema_identifier, message::schema::shared_ptr &schema_message)
114
bool Schema::doGetSchemaDefinition(const SchemaIdentifier &schema_identifier, message::schema::shared_ptr &schema_message)
121
116
mutex.lock_shared();
122
117
SchemaCache::iterator iter= schema_cache.find(schema_identifier.getPath());
137
131
bool Schema::doCreateSchema(const drizzled::message::Schema &schema_message)
139
identifier::Schema schema_identifier(schema_message.name());
133
SchemaIdentifier schema_identifier(schema_message.name());
141
135
if (mkdir(schema_identifier.getPath().c_str(), 0777) == -1)
143
sql_perror(schema_identifier.getPath().c_str());
147
138
if (not writeSchemaFile(schema_identifier, schema_message))
162
153
abort(); // If this has happened, something really bad is going down.
169
bool Schema::doDropSchema(const identifier::Schema &schema_identifier)
161
bool Schema::doDropSchema(const SchemaIdentifier &schema_identifier)
171
163
message::schema::shared_ptr schema_message;
180
172
// No db.opt file, no love from us.
181
173
if (access(schema_file.c_str(), F_OK))
183
sql_perror(schema_file.c_str());
175
perror(schema_file.c_str());
187
179
if (unlink(schema_file.c_str()))
189
sql_perror(schema_file.c_str());
181
perror(schema_file.c_str());
193
185
if (rmdir(schema_identifier.getPath().c_str()))
195
sql_perror(schema_identifier.getPath().c_str());
187
perror(schema_identifier.getPath().c_str());
196
188
//@todo If this happens, we want a report of it. For the moment I dump
197
189
//to stderr so I can catch it in Hudson.
198
190
CachedDirectory dir(schema_identifier.getPath());
202
boost::unique_lock<boost::shared_mutex> scopedLock(mutex);
203
195
schema_cache.erase(schema_identifier.getPath());
208
201
bool Schema::doAlterSchema(const drizzled::message::Schema &schema_message)
210
identifier::Schema schema_identifier(schema_message.name());
203
SchemaIdentifier schema_identifier(schema_message.name());
212
205
if (access(schema_identifier.getPath().c_str(), F_OK))
215
208
if (writeSchemaFile(schema_identifier, schema_message))
217
boost::unique_lock<boost::shared_mutex> scopedLock(mutex);
218
schema_cache.erase(schema_identifier.getPath());
220
pair<SchemaCache::iterator, bool> ret=
221
schema_cache.insert(make_pair(schema_identifier.getPath(), new message::Schema(schema_message)));
223
if (ret.second == false)
225
abort(); // If this has happened, something really bad is going down.
212
schema_cache.erase(schema_identifier.getPath());
214
pair<SchemaCache::iterator, bool> ret=
215
schema_cache.insert(make_pair(schema_identifier.getPath(), new message::Schema(schema_message)));
217
if (ret.second == false)
219
abort(); // If this has happened, something really bad is going down.
235
231
@note we do the rename to make it crash safe.
237
bool Schema::writeSchemaFile(const identifier::Schema &schema_identifier, const message::Schema &db)
233
bool Schema::writeSchemaFile(const SchemaIdentifier &schema_identifier, const message::Schema &db)
239
235
char schema_file_tmp[FN_REFLEN];
240
236
string schema_file(schema_identifier.getPath());
270
266
db.InitializationErrorString().empty() ? "unknown" : db.InitializationErrorString().c_str());
272
268
if (close(fd) == -1)
273
sql_perror(schema_file_tmp);
269
perror(schema_file_tmp);
275
271
if (unlink(schema_file_tmp))
276
sql_perror(schema_file_tmp);
272
perror(schema_file_tmp);
281
277
if (close(fd) == -1)
283
sql_perror(schema_file_tmp);
279
perror(schema_file_tmp);
285
281
if (unlink(schema_file_tmp))
286
sql_perror(schema_file_tmp);
282
perror(schema_file_tmp);
303
bool Schema::readSchemaFile(const drizzled::identifier::Schema &schema_identifier, drizzled::message::Schema &schema)
299
bool Schema::readSchemaFile(const drizzled::SchemaIdentifier &schema_identifier, drizzled::message::Schema &schema)
305
return readSchemaFile(schema_identifier.getPath(), schema);
301
string db_opt_path(schema_identifier.getPath());
308
bool Schema::readSchemaFile(std::string db_opt_path, drizzled::message::Schema &schema)
311
304
Pass an empty file name, and the database options file name as extension
312
305
to avoid table name to file name encoding.
336
sql_perror(db_opt_path.c_str());
329
perror(db_opt_path.c_str());
342
335
void Schema::doGetTableIdentifiers(drizzled::CachedDirectory&,
343
const drizzled::identifier::Schema&,
344
drizzled::identifier::Table::vector&)
336
const drizzled::SchemaIdentifier&,
337
drizzled::TableIdentifier::vector&)