diff options
Diffstat (limited to 'storage/archive')
-rw-r--r-- | storage/archive/azio.c | 17 | ||||
-rw-r--r-- | storage/archive/ha_archive.cc | 48 |
2 files changed, 41 insertions, 24 deletions
diff --git a/storage/archive/azio.c b/storage/archive/azio.c index 4519d15cefc..c1efe19e91f 100644 --- a/storage/archive/azio.c +++ b/storage/archive/azio.c @@ -77,6 +77,7 @@ int az_open (azio_stream *s, const char *path, int Flags, File fd) s->version = (unsigned char)az_magic[1]; /* this needs to be a define to version */ s->minor_version= (unsigned char) az_magic[2]; /* minor version */ s->dirty= AZ_STATE_CLEAN; + s->start= 0; /* We do our own version of append by nature. @@ -186,6 +187,9 @@ int write_header(azio_stream *s) char buffer[AZHEADER_SIZE + AZMETA_BUFFER_SIZE]; char *ptr= buffer; + if (s->version == 1) + return 0; + s->block_size= AZ_BUFSIZE_WRITE; s->version = (unsigned char)az_magic[1]; s->minor_version = (unsigned char)az_magic[2]; @@ -308,9 +312,9 @@ void check_header(azio_stream *s) /* Peek ahead to check the gzip magic header */ if ( s->stream.next_in[0] == gz_magic[0] && s->stream.next_in[1] == gz_magic[1]) { + read_header(s, s->stream.next_in); s->stream.avail_in -= 2; s->stream.next_in += 2; - s->version= (unsigned char)2; /* Check the rest of the gzip header */ method = get_byte(s); @@ -339,7 +343,8 @@ void check_header(azio_stream *s) for (len = 0; len < 2; len++) (void)get_byte(s); } s->z_err = s->z_eof ? Z_DATA_ERROR : Z_OK; - s->start = my_tell(s->file, MYF(0)) - s->stream.avail_in; + if (!s->start) + s->start= my_tell(s->file, MYF(0)) - s->stream.avail_in; } else if ( s->stream.next_in[0] == az_magic[0] && s->stream.next_in[1] == az_magic[1]) { @@ -401,9 +406,13 @@ void read_header(azio_stream *s, unsigned char *buffer) else if (buffer[0] == gz_magic[0] && buffer[1] == gz_magic[1]) { /* - Set version number to previous version (2). + Set version number to previous version (1). */ - s->version= (unsigned char) 2; + s->version= 1; + s->auto_increment= 0; + s->frm_length= 0; + s->longest_row= 0; + s->shortest_row= 0; } else { /* Unknown version. diff --git a/storage/archive/ha_archive.cc b/storage/archive/ha_archive.cc index bb66d329de0..82f2513ad59 100644 --- a/storage/archive/ha_archive.cc +++ b/storage/archive/ha_archive.cc @@ -97,6 +97,11 @@ inserts a lot faster, but would mean highly arbitrary reads. -Brian + + Archive file format versions: + <5.1.5 - v.1 + 5.1.5-5.1.15 - v.2 + >5.1.15 - v.3 */ @@ -192,9 +197,11 @@ static void init_archive_psi_keys(void) /* We just implement one additional file extension. + ARM is here just to properly drop 5.0 tables. */ static const char *ha_archive_exts[] = { ARZ, + ARM, NullS }; @@ -581,20 +588,13 @@ int ha_archive::open(const char *name, int mode, uint open_options) if (!share) DBUG_RETURN(rc); - /* - Allow open on crashed table in repair mode only. - Block open on 5.0 ARCHIVE table. Though we have almost all - routines to access these tables, they were not well tested. - For now we have to refuse to open such table to avoid - potential data loss. - */ + /* Allow open on crashed table in repair mode only. */ switch (rc) { case 0: break; case HA_ERR_TABLE_DEF_CHANGED: case HA_ERR_CRASHED_ON_USAGE: - case HA_ERR_TABLE_NEEDS_UPGRADE: if (open_options & HA_OPEN_FOR_REPAIR) { rc= 0; @@ -675,6 +675,17 @@ int ha_archive::frm_copy(azio_stream *src, azio_stream *dst) int rc= 0; uchar *frm_ptr; + if (!src->frm_length) + { + size_t frm_len; + if (!table_share->read_frm_image((const uchar**) &frm_ptr, &frm_len)) + { + azwrite_frm(dst, frm_ptr, frm_len); + table_share->free_frm_image(frm_ptr); + } + return 0; + } + if (!(frm_ptr= (uchar *) my_malloc(src->frm_length, MYF(MY_THREAD_SPECIFIC | MY_WME)))) return HA_ERR_OUT_OF_MEM; @@ -1639,19 +1650,13 @@ int ha_archive::info(uint flag) { DBUG_ENTER("ha_archive::info"); - /* - If dirty, we lock, and then reset/flush the data. - I found that just calling azflush() doesn't always work. - */ mysql_mutex_lock(&share->mutex); - if (share->dirty == TRUE) + if (share->dirty) { - if (share->dirty == TRUE) - { - DBUG_PRINT("ha_archive", ("archive flushing out rows for scan")); - azflush(&(share->archive_write), Z_SYNC_FLUSH); - share->dirty= FALSE; - } + DBUG_PRINT("ha_archive", ("archive flushing out rows for scan")); + DBUG_ASSERT(share->archive_write_open); + azflush(&(share->archive_write), Z_SYNC_FLUSH); + share->dirty= FALSE; } /* @@ -1727,7 +1732,10 @@ int ha_archive::end_bulk_insert() { DBUG_ENTER("ha_archive::end_bulk_insert"); bulk_insert= FALSE; - share->dirty= TRUE; + mysql_mutex_lock(&share->mutex); + if (share->archive_write_open) + share->dirty= true; + mysql_mutex_unlock(&share->mutex); DBUG_RETURN(0); } |