29
29
#include "drizzled/cursor.h"
30
30
#include "drizzled/data_home.h"
32
#include <drizzled/pthread_globals.h>
34
#include <drizzled/execute.h>
32
36
#include "drizzled/internal/my_sys.h"
33
#include "drizzled/transaction_services.h"
36
39
#include <sys/stat.h>
71
73
CachedDirectory directory(getDataHomeCatalog().file_string(), CachedDirectory::DIRECTORY);
72
74
CachedDirectory::Entries files= directory.getEntries();
75
boost::unique_lock<boost::shared_mutex> scopedLock(mutex);
76
77
for (CachedDirectory::Entries::iterator fileIter= files.begin();
77
78
fileIter != files.end(); fileIter++)
82
83
if (not entry->filename.compare(GLOBAL_TEMPORARY_EXT))
85
SchemaIdentifier filename(entry->filename);
86
if (readSchemaFile(filename, schema_message))
86
if (readSchemaFile(entry->filename, schema_message))
88
SchemaIdentifier schema_identifier(schema_message.name());
88
identifier::Schema schema_identifier(schema_message.name());
90
90
pair<SchemaCache::iterator, bool> ret=
91
91
schema_cache.insert(make_pair(schema_identifier.getPath(), new message::Schema(schema_message)));
93
93
if (ret.second == false)
95
95
abort(); // If this has happened, something really bad is going down.
102
void Schema::doGetSchemaIdentifiers(SchemaIdentifiers &set_of_names)
101
void Schema::startup(drizzled::Session &)
105
void Schema::doGetSchemaIdentifiers(identifier::Schema::vector &set_of_names)
104
107
mutex.lock_shared();
107
110
iter != schema_cache.end();
110
set_of_names.push_back(SchemaIdentifier((*iter).second->name()));
113
set_of_names.push_back(identifier::Schema((*iter).second->name()));
113
116
mutex.unlock_shared();
116
bool Schema::doGetSchemaDefinition(const SchemaIdentifier &schema_identifier, message::SchemaPtr &schema_message)
119
bool Schema::doGetSchemaDefinition(const identifier::Schema &schema_identifier, message::schema::shared_ptr &schema_message)
118
121
mutex.lock_shared();
119
122
SchemaCache::iterator iter= schema_cache.find(schema_identifier.getPath());
133
137
bool Schema::doCreateSchema(const drizzled::message::Schema &schema_message)
135
SchemaIdentifier schema_identifier(schema_message.name());
139
identifier::Schema schema_identifier(schema_message.name());
137
141
if (mkdir(schema_identifier.getPath().c_str(), 0777) == -1)
143
sql_perror(schema_identifier.getPath().c_str());
140
147
if (not writeSchemaFile(schema_identifier, schema_message))
155
162
abort(); // If this has happened, something really bad is going down.
160
TransactionServices &transaction_services= TransactionServices::singleton();
161
transaction_services.allocateNewTransactionId();
166
bool Schema::doDropSchema(const SchemaIdentifier &schema_identifier)
169
bool Schema::doDropSchema(const identifier::Schema &schema_identifier)
168
message::SchemaPtr schema_message;
171
message::schema::shared_ptr schema_message;
170
173
string schema_file(schema_identifier.getPath());
171
174
schema_file.append(1, FN_LIBCHAR);
177
180
// No db.opt file, no love from us.
178
181
if (access(schema_file.c_str(), F_OK))
180
perror(schema_file.c_str());
183
sql_perror(schema_file.c_str());
184
187
if (unlink(schema_file.c_str()))
186
perror(schema_file.c_str());
189
sql_perror(schema_file.c_str());
190
193
if (rmdir(schema_identifier.getPath().c_str()))
192
perror(schema_identifier.getPath().c_str());
195
sql_perror(schema_identifier.getPath().c_str());
193
196
//@todo If this happens, we want a report of it. For the moment I dump
194
197
//to stderr so I can catch it in Hudson.
195
198
CachedDirectory dir(schema_identifier.getPath());
202
boost::unique_lock<boost::shared_mutex> scopedLock(mutex);
200
203
schema_cache.erase(schema_identifier.getPath());
203
TransactionServices &transaction_services= TransactionServices::singleton();
204
transaction_services.allocateNewTransactionId();
209
208
bool Schema::doAlterSchema(const drizzled::message::Schema &schema_message)
211
SchemaIdentifier schema_identifier(schema_message.name());
210
identifier::Schema schema_identifier(schema_message.name());
213
212
if (access(schema_identifier.getPath().c_str(), F_OK))
216
215
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)
220
schema_cache.erase(schema_identifier.getPath());
222
pair<SchemaCache::iterator, bool> ret=
223
schema_cache.insert(make_pair(schema_identifier.getPath(), new message::Schema(schema_message)));
225
if (ret.second == false)
227
abort(); // If this has happened, something really bad is going down.
225
abort(); // If this has happened, something really bad is going down.
232
TransactionServices &transaction_services= TransactionServices::singleton();
233
transaction_services.allocateNewTransactionId();
242
235
@note we do the rename to make it crash safe.
244
bool Schema::writeSchemaFile(const SchemaIdentifier &schema_identifier, const message::Schema &db)
237
bool Schema::writeSchemaFile(const identifier::Schema &schema_identifier, const message::Schema &db)
246
239
char schema_file_tmp[FN_REFLEN];
247
240
string schema_file(schema_identifier.getPath());
277
270
db.InitializationErrorString().empty() ? "unknown" : db.InitializationErrorString().c_str());
279
272
if (close(fd) == -1)
280
perror(schema_file_tmp);
273
sql_perror(schema_file_tmp);
282
275
if (unlink(schema_file_tmp))
283
perror(schema_file_tmp);
276
sql_perror(schema_file_tmp);
288
281
if (close(fd) == -1)
290
perror(schema_file_tmp);
283
sql_perror(schema_file_tmp);
292
285
if (unlink(schema_file_tmp))
293
perror(schema_file_tmp);
286
sql_perror(schema_file_tmp);
310
bool Schema::readSchemaFile(const drizzled::SchemaIdentifier &schema_identifier, drizzled::message::Schema &schema)
303
bool Schema::readSchemaFile(const drizzled::identifier::Schema &schema_identifier, drizzled::message::Schema &schema)
312
string db_opt_path(schema_identifier.getPath());
305
return readSchemaFile(schema_identifier.getPath(), schema);
308
bool Schema::readSchemaFile(std::string db_opt_path, drizzled::message::Schema &schema)
315
311
Pass an empty file name, and the database options file name as extension
316
312
to avoid table name to file name encoding.
340
perror(db_opt_path.c_str());
336
sql_perror(db_opt_path.c_str());
346
bool Schema::doCanCreateTable(const drizzled::TableIdentifier &identifier)
349
// This should always be the same value as GLOBAL_TEMPORARY_EXT but be
352
// This needs to be done static in here for ordering reasons
353
static SchemaIdentifier TEMPORARY_IDENTIFIER(".TEMPORARY");
354
if (static_cast<const SchemaIdentifier&>(identifier) == TEMPORARY_IDENTIFIER)
362
342
void Schema::doGetTableIdentifiers(drizzled::CachedDirectory&,
363
const drizzled::SchemaIdentifier&,
364
drizzled::TableIdentifiers&)
343
const drizzled::identifier::Schema&,
344
drizzled::identifier::Table::vector&)