12
12
You should have received a copy of the GNU General Public License
13
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
17
17
Make sure to look at ha_tina.h for more details.
112
112
pthread_mutex_destroy(&tina_mutex);
115
virtual Cursor *create(Table &table)
115
virtual Cursor *create(TableShare &table)
117
117
return new ha_tina(*this, table);
130
130
const drizzled::TableIdentifier &identifier,
131
131
drizzled::message::Table &table_message);
133
/* Temp only engine, so do not return values. */
134
void doGetTableNames(drizzled::CachedDirectory &, const SchemaIdentifier&, set<string>&) { };
133
136
int doDropTable(Session&, const drizzled::TableIdentifier &identifier);
134
137
TinaShare *findOpenTable(const string table_name);
135
138
void addOpenTable(const string &table_name, TinaShare *);
145
148
void doGetTableIdentifiers(drizzled::CachedDirectory &directory,
146
149
const drizzled::SchemaIdentifier &schema_identifier,
147
drizzled::TableIdentifier::vector &set_of_identifiers);
150
drizzled::TableIdentifiers &set_of_identifiers);
150
153
void Tina::doGetTableIdentifiers(drizzled::CachedDirectory&,
151
154
const drizzled::SchemaIdentifier&,
152
drizzled::TableIdentifier::vector&)
155
drizzled::TableIdentifiers&)
170
session.getMessageCache().renameTableMessage(from, to);
173
session.renameTableMessage(from, to);
175
178
bool Tina::doDoesTableExist(Session &session, const drizzled::TableIdentifier &identifier)
177
return session.getMessageCache().doesTableMessageExist(identifier);
180
return session.doesTableMessageExist(identifier);
185
188
int enoent_or_zero= ENOENT; // Error if no file was deleted
189
char buff[FN_REFLEN];
187
191
for (const char **ext= bas_ext(); *ext ; ext++)
189
std::string full_name= identifier.getPath();
190
full_name.append(*ext);
192
if (internal::my_delete_with_symlink(full_name.c_str(), MYF(0)))
193
internal::fn_format(buff, identifier.getPath().c_str(), "", *ext,
194
MY_UNPACK_FILENAME|MY_APPEND_EXT);
195
if (internal::my_delete_with_symlink(buff, MYF(0)))
194
197
if ((error= errno) != ENOENT)
199
201
enoent_or_zero= 0; // No error for ENOENT
201
202
error= enoent_or_zero;
204
session.getMessageCache().removeTableMessage(identifier);
205
session.removeTableMessage(identifier);
232
233
const drizzled::TableIdentifier &identifier,
233
234
drizzled::message::Table &table_message)
235
if (session.getMessageCache().getTableMessage(identifier, table_message))
236
if (session.getTableMessage(identifier, table_message))
256
TinaShare::TinaShare(const std::string &table_name_arg) :
257
table_name(table_name_arg),
258
data_file_name(table_name_arg),
260
saved_data_file_length(0),
261
update_file_opened(false),
262
tina_write_opened(false),
257
TinaShare::TinaShare(const char *table_name_arg)
258
: table_name(table_name_arg), use_count(0), saved_data_file_length(0),
259
update_file_opened(false), tina_write_opened(false),
260
crashed(false), rows_recorded(0), data_file_version(0)
267
data_file_name.append(CSV_EXT);
262
thr_lock_init(&lock);
263
internal::fn_format(data_file_name, table_name_arg, "", CSV_EXT,
264
MY_REPLACE_EXT|MY_UNPACK_FILENAME);
270
267
TinaShare::~TinaShare()
272
270
pthread_mutex_destroy(&mutex);
276
274
Simple lock controls.
278
TinaShare *ha_tina::get_share(const std::string &table_name)
276
TinaShare *ha_tina::get_share(const char *table_name)
280
278
pthread_mutex_lock(&tina_mutex);
282
Tina *a_tina= static_cast<Tina *>(getEngine());
280
Tina *a_tina= static_cast<Tina *>(engine);
283
281
share= a_tina->findOpenTable(table_name);
285
std::string meta_file_name;
283
char meta_file_name[FN_REFLEN];
286
284
struct stat file_stat;
302
meta_file_name.assign(table_name);
303
meta_file_name.append(CSM_EXT);
300
internal::fn_format(meta_file_name, table_name, "", CSM_EXT,
301
MY_REPLACE_EXT|MY_UNPACK_FILENAME);
305
if (stat(share->data_file_name.c_str(), &file_stat))
303
if (stat(share->data_file_name, &file_stat))
307
305
pthread_mutex_unlock(&tina_mutex);
321
319
Usually this will result in auto-repair, and we will get a good
322
320
meta-file in the end.
324
if ((share->meta_file= internal::my_open(meta_file_name.c_str(),
322
if ((share->meta_file= internal::my_open(meta_file_name,
325
323
O_RDWR|O_CREAT, MYF(0))) == -1)
326
324
share->crashed= true;
450
448
(void)write_meta_file(share->meta_file, share->rows_recorded, true);
452
450
if ((share->tina_write_filedes=
453
internal::my_open(share->data_file_name.c_str(), O_RDWR|O_APPEND, MYF(0))) == -1)
451
internal::my_open(share->data_file_name, O_RDWR|O_APPEND, MYF(0))) == -1)
455
453
share->crashed= true;
533
ha_tina::ha_tina(drizzled::plugin::StorageEngine &engine_arg, Table &table_arg)
531
ha_tina::ha_tina(drizzled::plugin::StorageEngine &engine_arg, TableShare &table_arg)
534
532
:Cursor(engine_arg, table_arg),
536
534
These definitions are found in Cursor.h
676
674
error= HA_ERR_CRASHED_ON_USAGE;
678
memset(buf, 0, getTable()->getShare()->null_bytes);
676
memset(buf, 0, table->getShare()->null_bytes);
680
for (Field **field= getTable()->getFields() ; *field ; field++)
678
for (Field **field=table->getFields() ; *field ; field++)
747
745
/* This masks a bug in the logic for a SELECT * */
748
746
(*field)->setWriteSet();
749
if ((*field)->store_and_check(CHECK_FIELD_WARN, buffer.c_ptr(), buffer.length(), buffer.charset()))
747
if ((*field)->store(buffer.ptr(), buffer.length(), buffer.charset(),
754
751
if ((*field)->flags & BLOB_FLAG)
796
793
local_data_file_version= share->data_file_version;
797
if ((data_file= internal::my_open(share->data_file_name.c_str(), O_RDONLY, MYF(0))) == -1)
794
if ((data_file= internal::my_open(share->data_file_name, O_RDONLY, MYF(0))) == -1)
958
956
local_data_file_version= share->data_file_version;
959
957
if (internal::my_close(data_file, MYF(0)) ||
960
(data_file= internal::my_open(share->data_file_name.c_str(), O_RDONLY, MYF(0))) == -1)
958
(data_file= internal::my_open(share->data_file_name, O_RDONLY, MYF(0))) == -1)
963
961
file_buff->init_buff(data_file);
1194
1193
Close opened fildes's. Then move updated file in place
1195
1194
of the old datafile.
1197
std::string rename_file= share->table_name;
1198
rename_file.append(CSN_EXT);
1199
1196
if (internal::my_close(data_file, MYF(0)) ||
1200
internal::my_rename(rename_file.c_str(),
1201
share->data_file_name.c_str(), MYF(0)))
1197
internal::my_rename(internal::fn_format(updated_fname,
1198
share->table_name.c_str(),
1200
MY_REPLACE_EXT | MY_UNPACK_FILENAME),
1201
share->data_file_name, MYF(0)))
1204
1204
/* Open the file again */
1205
if (((data_file= internal::my_open(share->data_file_name.c_str(), O_RDONLY, MYF(0))) == -1))
1205
if (((data_file= internal::my_open(share->data_file_name, O_RDONLY, MYF(0))) == -1))
1208
1208
As we reopened the data file, increase share->data_file_version
1310
1310
internal::my_close(create_file, MYF(0));
1312
session.getMessageCache().storeTableMessage(identifier, create_proto);
1312
session.storeTableMessage(identifier, create_proto);