ha_berkeley.h 6.63 KB
Newer Older
unknown's avatar
unknown committed
1
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
unknown's avatar
unknown committed
2

unknown's avatar
unknown committed
3 4 5 6
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.
unknown's avatar
unknown committed
7

unknown's avatar
unknown committed
8 9 10 11
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
unknown's avatar
unknown committed
12

unknown's avatar
unknown committed
13 14 15 16 17 18 19 20 21 22 23 24 25
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */


#ifdef __GNUC__
#pragma interface			/* gcc class implementation */
#endif

/* class for the the myisam handler */

#include <db.h>

26 27
#define BDB_HIDDEN_PRIMARY_KEY_LENGTH 5

unknown's avatar
unknown committed
28
typedef struct st_berkeley_share {
29
  ulonglong auto_ident;
30 31
  ha_rows rows, org_rows;
  ulong *rec_per_key;
unknown's avatar
unknown committed
32
  THR_LOCK lock;
33
  pthread_mutex_t mutex;
unknown's avatar
unknown committed
34
  char *table_name;
35 36
  DB *status_block, *file, **key_file;
  u_int32_t *key_type;
unknown's avatar
unknown committed
37
  uint table_name_length,use_count;
38
  uint status,version;
39 40
  uint ref_length;
  bool fixed_length_primary_key, fixed_length_row;
unknown's avatar
unknown committed
41 42
} BDB_SHARE;

43

unknown's avatar
unknown committed
44 45 46 47 48 49 50 51 52 53 54 55
class ha_berkeley: public handler
{
  THR_LOCK_DATA lock;
  DBT last_key,current_row;
  gptr alloc_ptr;
  byte *rec_buff;
  char *key_buff, *key_buff2, *primary_key_buff;
  DB *file, **key_file;
  DB_TXN *transaction;
  u_int32_t *key_type;
  DBC *cursor;
  BDB_SHARE *share;
56
  ulong int_table_flags;
unknown's avatar
unknown committed
57
  ulong alloced_rec_buff_length;
58 59
  ulong changed_rows;
  uint primary_key,last_dup_key, hidden_primary_key, version;
unknown's avatar
unknown committed
60
  u_int32_t lock_on_read;
61 62
  bool key_read, using_ignore;
  bool fix_rec_buff_for_blob(ulong length);
63 64
  byte current_ident[BDB_HIDDEN_PRIMARY_KEY_LENGTH];

unknown's avatar
unknown committed
65
  ulong max_row_length(const byte *buf);
66
  int pack_row(DBT *row,const  byte *record, bool new_row);
unknown's avatar
unknown committed
67
  void unpack_row(char *record, DBT *row);
68
  void unpack_key(char *record, DBT *key, uint index);
69 70
  DBT *create_key(DBT *key, uint keynr, char *buff, const byte *record,
		  int key_length = MAX_KEY_LENGTH);
71
  DBT *pack_key(DBT *key, uint keynr, char *buff, const byte *key_ptr,
unknown's avatar
unknown committed
72
		uint key_length);
73
  int remove_key(DB_TXN *trans, uint keynr, const byte *record, DBT *prim_key);
unknown's avatar
unknown committed
74
  int remove_keys(DB_TXN *trans,const byte *record, DBT *new_record,
unknown's avatar
unknown committed
75 76
		  DBT *prim_key, key_map *keys);
  int restore_keys(DB_TXN *trans, key_map *changed_keys, uint primary_key,
77 78 79
		   const byte *old_row, DBT *old_key,
		   const byte *new_row, DBT *new_key,
		   ulong thd_options);
unknown's avatar
unknown committed
80 81
  int key_cmp(uint keynr, const byte * old_row, const byte * new_row);
  int update_primary_key(DB_TXN *trans, bool primary_key_changed,
82 83 84
			 const byte * old_row, DBT *old_key,
			 const byte * new_row, DBT *prim_key,
			 ulong thd_options, bool local_using_ignore);
85
  int read_row(int error, char *buf, uint keynr, DBT *row, DBT *key, bool);
unknown's avatar
unknown committed
86 87 88 89
  DBT *get_pos(DBT *to, byte *pos);

 public:
  ha_berkeley(TABLE *table): handler(table), alloc_ptr(0),rec_buff(0), file(0),
unknown's avatar
unknown committed
90
    int_table_flags(HA_REC_NOT_IN_SEQ | HA_FAST_KEY_READ |
unknown's avatar
unknown committed
91
		    HA_NULL_IN_KEY | HA_CAN_INDEX_BLOBS | HA_NOT_EXACT_COUNT |
unknown's avatar
unknown committed
92 93 94
		    HA_PRIMARY_KEY_IN_READ_INDEX | HA_FILE_BASED |
		    HA_AUTO_PART_KEY | HA_TABLE_SCAN_ON_INDEX),
    changed_rows(0),last_dup_key((uint) -1),version(0),using_ignore(0) {}
unknown's avatar
unknown committed
95 96
  ~ha_berkeley() {}
  const char *table_type() const { return "BerkeleyDB"; }
unknown's avatar
unknown committed
97 98 99 100 101 102 103 104
  ulong ha_berkeley::index_flags(uint idx, uint part) const
  {
    ulong flags=HA_READ_NEXT | HA_READ_PREV;
    if (part == (uint)~0 ||
        table->key_info[idx].key_part[part].field->key_type() != HA_KEYTYPE_TEXT)
      flags|= HA_READ_ORDER | HA_KEYREAD_ONLY | HA_READ_RANGE;
    return flags;
  }
105
  const char *index_type(uint key_number) { return "BTREE"; }
unknown's avatar
unknown committed
106
  const char **bas_ext() const;
107
  ulong table_flags(void) const { return int_table_flags; }
unknown's avatar
unknown committed
108
  uint max_supported_keys()        const { return MAX_KEY-1; }
109 110
  uint extra_rec_buf_length()	 { return BDB_HIDDEN_PRIMARY_KEY_LENGTH; }
  ha_rows estimate_number_of_rows();
unknown's avatar
unknown committed
111
  const key_map *keys_to_use_for_scanning() { return &key_map_full; }
unknown's avatar
unknown committed
112 113
  bool has_transactions()  { return 1;}

114
  int open(const char *name, int mode, uint test_if_locked);
unknown's avatar
unknown committed
115 116 117 118 119 120 121 122 123 124 125
  int close(void);
  double scan_time();
  int write_row(byte * buf);
  int update_row(const byte * old_data, byte * new_data);
  int delete_row(const byte * buf);
  int index_init(uint index);
  int index_end();
  int index_read(byte * buf, const byte * key,
		 uint key_len, enum ha_rkey_function find_flag);
  int index_read_idx(byte * buf, uint index, const byte * key,
		     uint key_len, enum ha_rkey_function find_flag);
126
  int index_read_last(byte * buf, const byte * key, uint key_len);
unknown's avatar
unknown committed
127 128 129 130 131
  int index_next(byte * buf);
  int index_next_same(byte * buf, const byte *key, uint keylen);
  int index_prev(byte * buf);
  int index_first(byte * buf);
  int index_last(byte * buf);
132
  int rnd_init(bool scan);
unknown's avatar
unknown committed
133 134 135 136 137 138 139 140
  int rnd_end();
  int rnd_next(byte *buf);
  int rnd_pos(byte * buf, byte *pos);
  void position(const byte *record);
  void info(uint);
  int extra(enum ha_extra_function operation);
  int reset(void);
  int external_lock(THD *thd, int lock_type);
unknown's avatar
unknown committed
141
  int start_stmt(THD *thd);
142
  void position(byte *record);
143 144 145 146
  int analyze(THD* thd,HA_CHECK_OPT* check_opt);
  int optimize(THD* thd, HA_CHECK_OPT* check_opt);
  int check(THD* thd, HA_CHECK_OPT* check_opt);

unknown's avatar
unknown committed
147
  ha_rows records_in_range(uint inx, key_range *min_key, key_range *max_key);
148
  int create(const char *name, register TABLE *form,
149
	     HA_CREATE_INFO *create_info);
150
  int delete_table(const char *name);
151
  int rename_table(const char* from, const char* to);
unknown's avatar
unknown committed
152 153
  THR_LOCK_DATA **store_lock(THD *thd, THR_LOCK_DATA **to,
			     enum thr_lock_type lock_type);
154

155
  void get_status();
156 157 158 159 160 161 162
  inline void get_auto_primary_key(byte *to)
  {
    pthread_mutex_lock(&share->mutex);
    share->auto_ident++;
    int5store(to,share->auto_ident);
    pthread_mutex_unlock(&share->mutex);
  }
163
  longlong get_auto_increment();
unknown's avatar
unknown committed
164
  void print_error(int error, myf errflag);
165
  uint8 table_cache_type() { return HA_CACHE_TBL_TRANSACT; }
unknown's avatar
unknown committed
166 167
};

168
extern bool berkeley_shared_data;
unknown's avatar
unknown committed
169 170
extern u_int32_t berkeley_init_flags,berkeley_env_flags, berkeley_lock_type,
                 berkeley_lock_types[];
unknown's avatar
unknown committed
171
extern ulong berkeley_cache_size, berkeley_max_lock, berkeley_log_buffer_size;
unknown's avatar
unknown committed
172 173 174 175 176 177 178
extern char *berkeley_home, *berkeley_tmpdir, *berkeley_logdir;
extern long berkeley_lock_scan_time;
extern TYPELIB berkeley_lock_typelib;

bool berkeley_init(void);
bool berkeley_end(void);
bool berkeley_flush_logs(void);
179 180
int berkeley_commit(THD *thd, void *trans);
int berkeley_rollback(THD *thd, void *trans);
181
int berkeley_show_logs(Protocol *protocol);