summaryrefslogtreecommitdiff
path: root/sql/ha_berkeley.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/ha_berkeley.cc')
-rw-r--r--sql/ha_berkeley.cc31
1 files changed, 26 insertions, 5 deletions
diff --git a/sql/ha_berkeley.cc b/sql/ha_berkeley.cc
index 5f156622901..e5c9f66e200 100644
--- a/sql/ha_berkeley.cc
+++ b/sql/ha_berkeley.cc
@@ -319,8 +319,14 @@ int ha_berkeley::open(const char *name, int mode, uint test_if_locked)
/* Open other keys */
bzero((char*) key_file,sizeof(*key_file)*table->keys);
- key_used_on_scan=primary_key=table->primary_key;
- key_file[primary_key]=file;
+ if ((key_used_on_scan=primary_key=table->primary_key) < MAX_KEY)
+ key_file[primary_key]=file;
+ else // No primary key
+ {
+ hidden_primary_key=1;
+ if (!share->primary_key_inited)
+ update_auto_primary_key();
+ }
bzero((char*) &current_row,sizeof(current_row));
DB **ptr=key_file;
@@ -1387,8 +1393,6 @@ static BDB_SHARE *get_share(const char *table_name)
if ((share=(BDB_SHARE *) my_malloc(sizeof(*share)+length+1,
MYF(MY_WME | MY_ZEROFILL))))
{
- // pthread_mutex_init(&share->mutex);
- // pthread_cond_init(&share->cond);
share->table_name_length=length;
share->table_name=(char*) (share+1);
strmov(share->table_name,table_name);
@@ -1399,6 +1403,7 @@ static BDB_SHARE *get_share(const char *table_name)
return 0;
}
thr_lock_init(&share->lock);
+ pthread_mutex_init(&share->mutex);
}
}
share->use_count++;
@@ -1413,10 +1418,26 @@ static void free_share(BDB_SHARE *share)
{
hash_delete(&bdb_open_tables, (gptr) share);
thr_lock_delete(&share->lock);
- // pthread_mutex_destroy(&share->mutex);
+ pthread_mutex_destroy(&share->mutex);
my_free((gptr) share, MYF(0));
}
pthread_mutex_unlock(&bdb_mutex);
}
+
+void ha_berkeley::update_auto_primary_key()
+{
+ (void) extra(HA_EXTRA_KEYREAD);
+ pthread_mutex_lock(&share->mutex);
+ if (!share->primary_key_inited)
+ {
+ index_init(primary_key);
+ if (!index_last(table->record[1]))
+ share->auto_ident=current_ident;
+ index_end();
+ }
+ pthread_mutex_unlock(&share->mutex);
+ (void) extra(HA_EXTRA_NO_KEYREAD);
+}
+
#endif /* HAVE_BERKELEY_DB */