diff options
author | Marc Alff <marc.alff@sun.com> | 2008-10-07 20:19:32 -0600 |
---|---|---|
committer | Marc Alff <marc.alff@sun.com> | 2008-10-07 20:19:32 -0600 |
commit | 9846ab0a70241945f59e1f474137546dcbd66ed8 (patch) | |
tree | 9e65beac58210790fbf0cd244af79793fbe044c3 /sql/ha_partition.h | |
parent | 3d514511436f5f9f8ab28a1223e06e59fbc58cc1 (diff) | |
parent | 4d7ad72e52db47b6d8364c34dbfb206c40cb4aad (diff) | |
download | mariadb-git-9846ab0a70241945f59e1f474137546dcbd66ed8.tar.gz |
Merge 5.1-bugteam -> local bugfix branch
Diffstat (limited to 'sql/ha_partition.h')
-rw-r--r-- | sql/ha_partition.h | 62 |
1 files changed, 58 insertions, 4 deletions
diff --git a/sql/ha_partition.h b/sql/ha_partition.h index 459b566b6d8..685f057dfce 100644 --- a/sql/ha_partition.h +++ b/sql/ha_partition.h @@ -37,6 +37,15 @@ typedef struct st_partition_share } PARTITION_SHARE; #endif +/** + Partition specific ha_data struct. + @todo: move all partition specific data from TABLE_SHARE here. +*/ +typedef struct st_ha_data_partition +{ + ulonglong next_auto_inc_val; /**< first non reserved value */ + bool auto_inc_initialized; +} HA_DATA_PARTITION; #define PARTITION_BYTES_IN_POS 2 class ha_partition :public handler @@ -140,6 +149,12 @@ private: "own" the m_part_info structure. */ bool is_clone; + bool auto_increment_lock; /**< lock reading/updating auto_inc */ + /** + Flag to keep the auto_increment lock through out the statement. + This to ensure it will work with statement based replication. + */ + bool auto_increment_safe_stmt_log_lock; public: handler *clone(MEM_ROOT *mem_root); virtual void set_part_info(partition_info *part_info) @@ -196,8 +211,8 @@ public: virtual char *update_table_comment(const char *comment); virtual int change_partitions(HA_CREATE_INFO *create_info, const char *path, - ulonglong *copied, - ulonglong *deleted, + ulonglong * const copied, + ulonglong * const deleted, const uchar *pack_frm_data, size_t pack_frm_len); virtual int drop_partitions(const char *path); @@ -211,7 +226,7 @@ public: virtual void change_table_ptr(TABLE *table_arg, TABLE_SHARE *share); private: int prepare_for_rename(); - int copy_partitions(ulonglong *copied, ulonglong *deleted); + int copy_partitions(ulonglong * const copied, ulonglong * const deleted); void cleanup_new_partition(uint part_count); int prepare_new_partition(TABLE *table, HA_CREATE_INFO *create_info, handler *file, const char *part_name, @@ -826,12 +841,51 @@ public: auto_increment_column_changed ------------------------------------------------------------------------- */ - virtual void restore_auto_increment(ulonglong prev_insert_id); virtual void get_auto_increment(ulonglong offset, ulonglong increment, ulonglong nb_desired_values, ulonglong *first_value, ulonglong *nb_reserved_values); virtual void release_auto_increment(); +private: + virtual int reset_auto_increment(ulonglong value); + virtual void lock_auto_increment() + { + /* lock already taken */ + if (auto_increment_safe_stmt_log_lock) + return; + DBUG_ASSERT(table_share->ha_data && !auto_increment_lock); + if(table_share->tmp_table == NO_TMP_TABLE) + { + auto_increment_lock= TRUE; + pthread_mutex_lock(&table_share->mutex); + } + } + virtual void unlock_auto_increment() + { + DBUG_ASSERT(table_share->ha_data); + /* + If auto_increment_safe_stmt_log_lock is true, we have to keep the lock. + It will be set to false and thus unlocked at the end of the statement by + ha_partition::release_auto_increment. + */ + if(auto_increment_lock && !auto_increment_safe_stmt_log_lock) + { + pthread_mutex_unlock(&table_share->mutex); + auto_increment_lock= FALSE; + } + } + virtual void set_auto_increment_if_higher(const ulonglong nr) + { + HA_DATA_PARTITION *ha_data= (HA_DATA_PARTITION*) table_share->ha_data; + lock_auto_increment(); + /* must check when the mutex is taken */ + if (nr >= ha_data->next_auto_inc_val) + ha_data->next_auto_inc_val= nr + 1; + ha_data->auto_inc_initialized= TRUE; + unlock_auto_increment(); + } + +public: /* ------------------------------------------------------------------------- |