diff options
author | Michael Widenius <monty@mysql.com> | 2008-11-01 01:14:58 +0200 |
---|---|---|
committer | Michael Widenius <monty@mysql.com> | 2008-11-01 01:14:58 +0200 |
commit | 2b521320fb66c6f0635103b3fa3ee1b86f6b7a2c (patch) | |
tree | 42aff63b09c43037fe04f96ec85031748054115f /storage/maria | |
parent | ca4d512aa46df2f231940d20f1b94b8409a7c691 (diff) | |
download | mariadb-git-2b521320fb66c6f0635103b3fa3ee1b86f6b7a2c.tar.gz |
Added ha_maria::is_changed() (needed for Query cache)
storage/maria/ha_maria.cc:
Added ha_maria::is_changed()
storage/maria/ha_maria.h:
Added ha_maria::is_changed()
storage/maria/ma_delete.c:
Mark that table changed
storage/maria/ma_open.c:
Ensure that info->state->changed is always reset from thr_lock()
storage/maria/ma_state.c:
Reset handler->state->changed at first usage of transactional table
Reset handler->state->changed when taking lock for not transactional table
storage/maria/ma_state.h:
Added variable and function to track changes of table
storage/maria/ma_update.c:
Mark that table changed
storage/maria/ma_write.c:
Mark that table changed
Diffstat (limited to 'storage/maria')
-rw-r--r-- | storage/maria/ha_maria.cc | 10 | ||||
-rw-r--r-- | storage/maria/ha_maria.h | 1 | ||||
-rw-r--r-- | storage/maria/ma_delete.c | 1 | ||||
-rw-r--r-- | storage/maria/ma_open.c | 1 | ||||
-rw-r--r-- | storage/maria/ma_state.c | 10 | ||||
-rw-r--r-- | storage/maria/ma_state.h | 2 | ||||
-rw-r--r-- | storage/maria/ma_update.c | 1 | ||||
-rw-r--r-- | storage/maria/ma_write.c | 1 |
8 files changed, 27 insertions, 0 deletions
diff --git a/storage/maria/ha_maria.cc b/storage/maria/ha_maria.cc index 4c96cbdf5ca..cad9c4d6145 100644 --- a/storage/maria/ha_maria.cc +++ b/storage/maria/ha_maria.cc @@ -3074,6 +3074,16 @@ static int mark_recovery_success(void) } +/* + Return 1 if table has changed during the current transaction +*/ + +bool ha_maria::is_changed() const +{ + return file->state->changed; +} + + static int ha_maria_init(void *p) { int res; diff --git a/storage/maria/ha_maria.h b/storage/maria/ha_maria.h index 7c6350e1745..ba3ea39b92a 100644 --- a/storage/maria/ha_maria.h +++ b/storage/maria/ha_maria.h @@ -139,6 +139,7 @@ public: int repair(THD * thd, HA_CHECK_OPT * check_opt); bool check_and_repair(THD * thd); bool is_crashed() const; + bool is_changed() const; bool auto_repair() const { return 1; } int optimize(THD * thd, HA_CHECK_OPT * check_opt); int restore(THD * thd, HA_CHECK_OPT * check_opt); diff --git a/storage/maria/ma_delete.c b/storage/maria/ma_delete.c index 930eaa7982c..a4223e2250c 100644 --- a/storage/maria/ma_delete.c +++ b/storage/maria/ma_delete.c @@ -116,6 +116,7 @@ int maria_delete(MARIA_HA *info,const uchar *record) info->update= HA_STATE_CHANGED+HA_STATE_DELETED+HA_STATE_ROW_CHANGED; share->state.changed|= (STATE_NOT_OPTIMIZED_ROWS | STATE_NOT_MOVABLE | STATE_NOT_ZEROFILLED); + info->state->changed=1; mi_sizestore(lastpos, info->cur_row.lastpos); VOID(_ma_writeinfo(info,WRITEINFO_UPDATE_KEYFILE)); diff --git a/storage/maria/ma_open.c b/storage/maria/ma_open.c index 96561619e92..14f7b656517 100644 --- a/storage/maria/ma_open.c +++ b/storage/maria/ma_open.c @@ -824,6 +824,7 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags) VOID(my_rwlock_init(&share->mmap_lock, NULL)); share->row_is_visible= _ma_row_visible_always; + share->lock.get_status= _ma_reset_update_flag; if (!thr_lock_inited) { /* Probably a single threaded program; Don't use concurrent inserts */ diff --git a/storage/maria/ma_state.c b/storage/maria/ma_state.c index cfe0de62929..36e2dbc669a 100644 --- a/storage/maria/ma_state.c +++ b/storage/maria/ma_state.c @@ -96,6 +96,8 @@ my_bool _ma_setup_live_state(MARIA_HA *info) pthread_mutex_unlock(&share->intern_lock); /* The current item can't be deleted as it's the first one visible for us */ tables->state_start= tables->state_current= history->state; + tables->state_current.changed= 0; + DBUG_PRINT("info", ("records: %ld", (ulong) tables->state_start.records)); end: @@ -262,6 +264,7 @@ void _ma_get_status(void* param, my_bool concurrent_insert) #endif info->state_save= info->s->state.state; info->state= &info->state_save; + info->state->changed= 0; info->append_insert_at_end= concurrent_insert; DBUG_VOID_RETURN; } @@ -315,6 +318,13 @@ void _ma_copy_status(void* to, void *from) } +void _ma_reset_update_flag(void *param) +{ + MARIA_HA *info=(MARIA_HA*) param; + info->state->changed= 0; +} + + /** @brief Check if should allow concurrent inserts diff --git a/storage/maria/ma_state.h b/storage/maria/ma_state.h index 1bb88e80a40..613dd2e1555 100644 --- a/storage/maria/ma_state.h +++ b/storage/maria/ma_state.h @@ -24,6 +24,7 @@ typedef struct st_maria_status_info my_off_t key_file_length; my_off_t data_file_length; ha_checksum checksum; + my_bool changed; } MARIA_STATUS_INFO; @@ -62,6 +63,7 @@ void _ma_get_status(void* param, my_bool concurrent_insert); void _ma_update_status(void* param); void _ma_restore_status(void *param); void _ma_copy_status(void* to, void *from); +void _ma_reset_update_flag(void *param); my_bool _ma_check_status(void *param); void _ma_block_get_status(void* param, my_bool concurrent_insert); void _ma_block_update_status(void *param); diff --git a/storage/maria/ma_update.c b/storage/maria/ma_update.c index a178f5d47a7..7b9e006ec43 100644 --- a/storage/maria/ma_update.c +++ b/storage/maria/ma_update.c @@ -173,6 +173,7 @@ int maria_update(register MARIA_HA *info, const uchar *oldrec, uchar *newrec) */ info->update= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED | key_changed); share->state.changed|= STATE_NOT_MOVABLE | STATE_NOT_ZEROFILLED; + info->state->changed= 1; /* Every Maria function that updates Maria table must end with diff --git a/storage/maria/ma_write.c b/storage/maria/ma_write.c index 16cbc5f74ec..3d6da817596 100644 --- a/storage/maria/ma_write.c +++ b/storage/maria/ma_write.c @@ -289,6 +289,7 @@ int maria_write(MARIA_HA *info, uchar *record) info->update= (HA_STATE_CHANGED | HA_STATE_AKTIV | HA_STATE_WRITTEN | HA_STATE_ROW_CHANGED); share->state.changed|= STATE_NOT_MOVABLE | STATE_NOT_ZEROFILLED; + info->state->changed= 1; info->cur_row.lastpos= filepos; VOID(_ma_writeinfo(info, WRITEINFO_UPDATE_KEYFILE)); |