137
class ArchiveTableNameIterator: public TableNameIteratorImplementation
141
uint32_t current_entry;
144
ArchiveTableNameIterator(const std::string &database)
145
: TableNameIteratorImplementation(database), dirp(NULL), current_entry(-1)
148
~ArchiveTableNameIterator();
150
int next(std::string *name);
154
ArchiveTableNameIterator::~ArchiveTableNameIterator()
160
int ArchiveTableNameIterator::next(string *name)
162
char uname[NAME_LEN + 1];
165
uint32_t file_name_len;
166
const char *wild= NULL;
171
char path[FN_REFLEN];
173
build_table_filename(path, sizeof(path), db.c_str(), "", false);
174
dirp = my_dir(path,MYF(dir ? MY_WANT_STAT : 0));
177
if (my_errno == ENOENT)
178
my_error(ER_BAD_DB_ERROR, MYF(ME_BELL+ME_WAITTANG), db.c_str());
180
my_error(ER_CANT_READ_DIR, MYF(ME_BELL+ME_WAITTANG), path, my_errno);
190
if (current_entry == dirp->number_off_files)
197
file= dirp->dir_entry + current_entry;
199
if (my_strcasecmp(system_charset_info, ext=strchr(file->name,'.'), ARZ) ||
200
is_prefix(file->name, TMP_FILE_PREFIX))
204
file_name_len= filename_to_tablename(file->name, uname, sizeof(uname));
206
uname[file_name_len]= '\0';
208
if (wild && wild_compare(uname, wild, 0))
136
217
class ArchiveEngine : public StorageEngine
139
ArchiveEngine(const string &name_arg) : StorageEngine(name_arg) {}
220
ArchiveEngine(const string &name_arg) : StorageEngine(name_arg,
222
| HTON_HAS_DATA_DICTIONARY) {}
140
224
virtual handler *create(TableShare *table,
141
225
MEM_ROOT *mem_root)
147
231
return ha_archive_exts;
150
int createTableImpl(Session *session, const char *table_name,
151
Table *table_arg, HA_CREATE_INFO *create_info);
234
int createTableImplementation(Session *session, const char *table_name,
235
Table *table_arg, HA_CREATE_INFO *create_info,
236
drizzled::message::Table* proto);
238
int getTableProtoImplementation(const char* path,
239
drizzled::message::Table *table_proto);
241
TableNameIteratorImplementation* tableNameIterator(const std::string &database)
243
return new ArchiveTableNameIterator(database);
247
int ArchiveEngine::getTableProtoImplementation(const char* path,
248
drizzled::message::Table *table_proto)
250
struct stat stat_info;
254
proto_path.reserve(FN_REFLEN);
255
proto_path.assign(path);
257
proto_path.append(ARZ);
259
if (stat(proto_path.c_str(),&stat_info))
264
azio_stream proto_stream;
266
if(azopen(&proto_stream, proto_path.c_str(), O_RDONLY, AZ_METHOD_BLOCK) == 0)
267
return HA_ERR_CRASHED_ON_USAGE;
269
proto_string= (char*)malloc(sizeof(char) * proto_stream.frm_length);
270
if (proto_string == NULL)
272
azclose(&proto_stream);
276
azread_frm(&proto_stream, proto_string);
278
if(table_proto->ParseFromArray(proto_string, proto_stream.frm_length) == false)
279
error= HA_ERR_CRASHED_ON_USAGE;
281
azclose(&proto_stream);
154
288
static ArchiveEngine *archive_engine= NULL;
509
int ArchiveEngine::createTableImpl(Session *session, const char *table_name,
511
HA_CREATE_INFO *create_info)
643
int ArchiveEngine::createTableImplementation(Session *session,
644
const char *table_name,
646
HA_CREATE_INFO *create_info,
647
drizzled::message::Table *proto)
513
649
char name_buff[FN_REFLEN];
514
650
char linkname[FN_REFLEN];
516
652
azio_stream create_stream; /* Archive file we are working with */
517
FILE *frm_file; /* File handler for readers */
518
struct stat file_stat;
519
unsigned char *frm_ptr;
521
653
uint64_t auto_increment_value;
654
string serialized_proto;
523
656
auto_increment_value= create_info->auto_increment_value;
561
There is a chance that the file was "discovered". In this case
562
just use whatever file is there.
564
r= stat(name_buff, &file_stat);
565
if (r == -1 && errno!=ENOENT)
570
return HA_ERR_TABLE_EXIST;
573
if (!(azopen(&create_stream, name_buff, O_CREAT|O_RDWR,
694
if (azopen(&create_stream, name_buff, O_CREAT|O_RDWR,
695
AZ_METHOD_BLOCK) == 0)
581
702
if(symlink(name_buff, linkname) != 0)
583
fn_format(name_buff, table_name, "", ".frm",
584
MY_REPLACE_EXT | MY_UNPACK_FILENAME);
587
Here is where we open up the frm and pass it to archive to store
589
if ((frm_file= fopen(name_buff, "r")) > 0)
591
if (fstat(fileno(frm_file), &file_stat))
593
if ((uint64_t)file_stat.st_size > SIZE_MAX)
598
frm_ptr= (unsigned char *)malloc((size_t)file_stat.st_size);
602
length_io= read(fileno(frm_file), frm_ptr, (size_t)file_stat.st_size);
604
if (length_io != (size_t)file_stat.st_size)
610
length_io= azwrite_frm(&create_stream, (char *)frm_ptr, (size_t)file_stat.st_size);
612
if (length_io != (size_t)file_stat.st_size)
705
proto->SerializeToString(&serialized_proto);
707
if (azwrite_frm(&create_stream, serialized_proto.c_str(),
708
serialized_proto.length()))
624
711
if (create_info->comment.str)
1049
1136
share->archive_write_open= false;
1140
proto_string= (char*)malloc(sizeof(char) * archive.frm_length);
1141
if (proto_string == NULL)
1145
azread_frm(&archive, proto_string);
1052
1147
/* Lets create a file to contain the new data */
1053
1148
fn_format(writer_filename, share->table_name.c_str(), "", ARN,
1054
1149
MY_REPLACE_EXT | MY_UNPACK_FILENAME);
1056
1151
if (!(azopen(&writer, writer_filename, O_CREAT|O_RDWR, AZ_METHOD_BLOCK)))
1057
1154
return(HA_ERR_CRASHED_ON_USAGE);
1157
azwrite_frm(&writer, proto_string, archive.frm_length);
1060
1160
An extended rebuild is a lot more effort. We open up each row and re-record it.