Commit fa8fcecb authored by unknown's avatar unknown

Cleanup for handlerton structure to allow for loadable engine work. This is...

Cleanup for handlerton structure to allow for loadable engine work. This is the first in a series of patches. 


sql/examples/ha_archive.cc:
  Now declared externally.
sql/examples/ha_example.cc:
  Now declared externally
sql/examples/ha_tina.cc:
  Now declared externally
sql/ha_berkeley.cc:
  Now declared externally
sql/ha_blackhole.cc:
  Now declared externally
sql/ha_federated.cc:
  Now declared externally.
sql/ha_heap.cc:
  Now declared externally.
sql/ha_innodb.cc:
  Now declared externally.
sql/ha_myisam.cc:
  Now declared externally
sql/ha_myisammrg.cc:
  Now declared externally.
sql/ha_ndbcluster.cc:
  Now declared externally.
sql/handler.cc:
  Changes for eventual loadable engines. This will allow us to gain faster access to the handlerton (eventually this will just be a handlteron array).
sql/handler.h:
  New alias structure and change to show_table_st to place handlerton in the structure.
parent 78cf7b19
......@@ -136,7 +136,7 @@ static HASH archive_open_tables;
#define ARCHIVE_CHECK_HEADER 254 // The number we use to determine corruption
/* dummy handlerton - only to have something to return from archive_db_init */
static handlerton archive_hton = {
handlerton archive_hton = {
"archive",
0, /* slot */
0, /* savepoint size. */
......
......@@ -73,7 +73,7 @@
#include "ha_example.h"
static handlerton example_hton= {
handlerton example_hton= {
"CSV",
0, /* slot */
0, /* savepoint size. */
......
......@@ -54,7 +54,7 @@ pthread_mutex_t tina_mutex;
static HASH tina_open_tables;
static int tina_init= 0;
static handlerton tina_hton= {
handlerton tina_hton= {
"CSV",
0, /* slot */
0, /* savepoint size. */
......
......@@ -107,7 +107,7 @@ static int berkeley_close_connection(THD *thd);
static int berkeley_commit(THD *thd, bool all);
static int berkeley_rollback(THD *thd, bool all);
static handlerton berkeley_hton = {
handlerton berkeley_hton = {
"BerkeleyDB",
0, /* slot */
0, /* savepoint size */
......
......@@ -26,7 +26,7 @@
/* Blackhole storage engine handlerton */
static handlerton blackhole_hton= {
handlerton blackhole_hton= {
"BLACKHOLE",
0, /* slot */
0, /* savepoint size. */
......
......@@ -690,7 +690,7 @@ error:
/* Federated storage engine handlerton */
static handlerton federated_hton= {
handlerton federated_hton= {
"FEDERATED",
0, /* slot */
0, /* savepoint size. */
......
......@@ -23,7 +23,7 @@
#include <myisampack.h>
#include "ha_heap.h"
static handlerton heap_hton= {
handlerton heap_hton= {
"MEMORY",
0, /* slot */
0, /* savepoint size. */
......
......@@ -206,7 +206,7 @@ static int innobase_rollback_to_savepoint(THD* thd, void *savepoint);
static int innobase_savepoint(THD* thd, void *savepoint);
static int innobase_release_savepoint(THD* thd, void *savepoint);
static handlerton innobase_hton = {
handlerton innobase_hton = {
"InnoDB",
0, /* slot */
sizeof(trx_named_savept_t), /* savepoint size. TODO: use it */
......
......@@ -46,7 +46,7 @@ TYPELIB myisam_recover_typelib= {array_elements(myisam_recover_names)-1,"",
/* MyISAM handlerton */
static handlerton myisam_hton= {
handlerton myisam_hton= {
"MyISAM",
0, /* slot */
0, /* savepoint size. */
......
......@@ -34,8 +34,8 @@
/* MyISAM MERGE handlerton */
static handlerton myisammrg_hton= {
"MRG_MyISAM",
handlerton myisammrg_hton= {
"MRG_MYISAM",
0, /* slot */
0, /* savepoint size. */
NULL, /* close_connection */
......
......@@ -49,7 +49,7 @@ static int ndbcluster_close_connection(THD *thd);
static int ndbcluster_commit(THD *thd, bool all);
static int ndbcluster_rollback(THD *thd, bool all);
static handlerton ndbcluster_hton = {
handlerton ndbcluster_hton = {
"ndbcluster",
0, /* slot */
0, /* savepoint size */
......
......@@ -27,31 +27,44 @@
#include "ha_myisammrg.h"
#ifdef HAVE_BERKELEY_DB
#include "ha_berkeley.h"
extern handlerton berkeley_hton;
#endif
#ifdef HAVE_BLACKHOLE_DB
#include "ha_blackhole.h"
extern handlerton blackhole_hton;
#endif
#ifdef HAVE_EXAMPLE_DB
#include "examples/ha_example.h"
extern handlerton example_hton;
#endif
#ifdef HAVE_ARCHIVE_DB
#include "examples/ha_archive.h"
extern handlerton archive_hton;
#endif
#ifdef HAVE_CSV_DB
#include "examples/ha_tina.h"
extern handlerton tina_hton;
#endif
#ifdef HAVE_INNOBASE_DB
#include "ha_innodb.h"
extern handlerton innobase_hton;
#endif
#ifdef HAVE_NDBCLUSTER_DB
#include "ha_ndbcluster.h"
extern handlerton ndbcluster_hton;
#endif
#ifdef HAVE_FEDERATED_DB
#include "ha_federated.h"
extern handlerton federated_hton;
#endif
#include <myisampack.h>
#include <errno.h>
extern handlerton myisam_hton;
extern handlerton myisammrg_hton;
extern handlerton heap_hton;
/* static functions defined in this file */
static SHOW_COMP_OPTION have_yes= SHOW_OPTION_YES;
......@@ -66,46 +79,53 @@ ulong total_ha_2pc;
/* size of savepoint storage area (see ha_init) */
ulong savepoint_alloc_size;
/*
This structure will go away with loadable storeage engines, we will instead
build it dynamically from the configure script.
*/
struct show_table_type_st sys_table_types[]=
{
{"MyISAM", &have_yes,
"Default engine as of MySQL 3.23 with great performance", DB_TYPE_MYISAM},
"Default engine as of MySQL 3.23 with great performance", DB_TYPE_MYISAM,
NULL},
{"MEMORY", &have_yes,
"Hash based, stored in memory, useful for temporary tables", DB_TYPE_HEAP},
{"HEAP", &have_yes,
"Alias for MEMORY", DB_TYPE_HEAP},
{"MERGE", &have_yes,
"Collection of identical MyISAM tables", DB_TYPE_MRG_MYISAM},
{"MRG_MYISAM",&have_yes,
"Alias for MERGE", DB_TYPE_MRG_MYISAM},
"Hash based, stored in memory, useful for temporary tables", DB_TYPE_HEAP,
NULL},
{"MRG_MYISAM", &have_yes,
"Collection of identical MyISAM tables", DB_TYPE_MRG_MYISAM, NULL},
{"ISAM", &have_isam,
"Obsolete storage engine, now replaced by MyISAM", DB_TYPE_ISAM},
"Obsolete storage engine, now replaced by MyISAM", DB_TYPE_ISAM, NULL},
{"MRG_ISAM", &have_isam,
"Obsolete storage engine, now replaced by MERGE", DB_TYPE_MRG_ISAM},
"Obsolete storage engine, now replaced by MERGE", DB_TYPE_MRG_ISAM, NULL},
{"InnoDB", &have_innodb,
"Supports transactions, row-level locking, and foreign keys", DB_TYPE_INNODB},
{"INNOBASE", &have_innodb,
"Alias for INNODB", DB_TYPE_INNODB},
{"BDB", &have_berkeley_db,
"Supports transactions and page-level locking", DB_TYPE_BERKELEY_DB},
{"BERKELEYDB",&have_berkeley_db,
"Alias for BDB", DB_TYPE_BERKELEY_DB},
"Supports transactions, row-level locking, and foreign keys", DB_TYPE_INNODB,
NULL},
{"BERKELEYDB", &have_berkeley_db,
"Supports transactions and page-level locking", DB_TYPE_BERKELEY_DB, NULL},
{"NDBCLUSTER", &have_ndbcluster,
"Clustered, fault-tolerant, memory-based tables", DB_TYPE_NDBCLUSTER},
{"NDB", &have_ndbcluster,
"Alias for NDBCLUSTER", DB_TYPE_NDBCLUSTER},
"Clustered, fault-tolerant, memory-based tables", DB_TYPE_NDBCLUSTER, NULL},
{"EXAMPLE",&have_example_db,
"Example storage engine", DB_TYPE_EXAMPLE_DB},
"Example storage engine", DB_TYPE_EXAMPLE_DB, NULL},
{"ARCHIVE",&have_archive_db,
"Archive storage engine", DB_TYPE_ARCHIVE_DB},
"Archive storage engine", DB_TYPE_ARCHIVE_DB, NULL},
{"CSV",&have_csv_db,
"CSV storage engine", DB_TYPE_CSV_DB},
"CSV storage engine", DB_TYPE_CSV_DB, NULL},
{"FEDERATED",&have_federated_db,
"Federated MySQL storage engine", DB_TYPE_FEDERATED_DB},
"Federated MySQL storage engine", DB_TYPE_FEDERATED_DB, NULL},
{"BLACKHOLE",&have_blackhole_db,
"/dev/null storage engine (anything you write to it disappears)",
DB_TYPE_BLACKHOLE_DB},
{NullS, NULL, NullS, DB_TYPE_UNKNOWN}
DB_TYPE_BLACKHOLE_DB, NULL},
{NullS, NULL, NullS, DB_TYPE_UNKNOWN, NULL}
};
struct show_table_alias_st sys_table_aliases[]=
{
{"INNOBASE", "InnoDB", NULL },
{"NDB", "NDBCLUSTER", NULL},
{"BDB", "BERKELEYDB", NULL},
{"HEAP", "MEMORY", NULL},
{"MERGE", "MRG_MYISAM", NULL},
{NullS, NullS, NULL}
};
const char *ha_row_type[] = {
......@@ -124,16 +144,27 @@ uint known_extensions_id= 0;
enum db_type ha_resolve_by_name(const char *name, uint namelen)
{
THD *thd= current_thd;
show_table_alias_st *table_alias;
show_table_type_st *types;
if (thd && !my_strcasecmp(&my_charset_latin1, name, "DEFAULT")) {
return (enum db_type) thd->variables.table_type;
}
show_table_type_st *types;
for (types= sys_table_types; types->type; types++)
{
if (!my_strcasecmp(&my_charset_latin1, name, types->type))
return (enum db_type) types->db_type;
}
/*
We check for the historical aliases next.
*/
for (table_alias= sys_table_aliases; table_alias->type; table_alias++)
{
if (!my_strcasecmp(&my_charset_latin1, name, table_alias->alias) && table_alias->st)
return (enum db_type) table_alias->st->db_type;
}
return DB_TYPE_UNKNOWN;
}
......@@ -361,80 +392,165 @@ int ha_init()
{
int error= 0;
handlerton **ht= handlertons;
show_table_type_st *types;
show_table_alias_st *table_alias;
total_ha= savepoint_alloc_size= 0;
if (ha_init_errors())
return 1;
if (opt_bin_log)
for (types= sys_table_types; types->type; types++)
{
if (!(*ht= binlog_init())) // Always succeed
{
mysql_bin_log.close(LOG_CLOSE_INDEX); // Never used
opt_bin_log= 0; // Never used
error= 1; // Never used
}
else
ha_was_inited_ok(ht++);
}
switch (types->db_type) {
case DB_TYPE_HEAP:
types->ht= &heap_hton;
for (table_alias= sys_table_aliases; table_alias->type; table_alias++)
{
if (!my_strcasecmp(&my_charset_latin1, types->ht->name, table_alias->type))
table_alias->st= types;
}
break;
case DB_TYPE_MYISAM:
types->ht= &myisam_hton;
break;
case DB_TYPE_MRG_MYISAM:
types->ht= &myisammrg_hton;
for (table_alias= sys_table_aliases; table_alias->type; table_alias++)
{
if (!my_strcasecmp(&my_charset_latin1, types->ht->name, table_alias->type))
table_alias->st= types;
}
break;
#ifdef HAVE_BERKELEY_DB
if (have_berkeley_db == SHOW_OPTION_YES)
{
if (!(*ht= berkeley_init()))
{
have_berkeley_db= SHOW_OPTION_DISABLED; // If we couldn't use handler
error= 1;
}
else
ha_was_inited_ok(ht++);
}
case DB_TYPE_BERKELEY_DB:
if (have_berkeley_db == SHOW_OPTION_YES)
{
if (!(*ht= berkeley_init()))
{
have_berkeley_db= SHOW_OPTION_DISABLED; // If we couldn't use handler
error= 1;
}
else
{
types->ht= &berkeley_hton;
for (table_alias= sys_table_aliases; table_alias->type; table_alias++)
{
if (!my_strcasecmp(&my_charset_latin1, types->ht->name, table_alias->type))
table_alias->st= types;
}
ha_was_inited_ok(ht++);
}
}
break;
#endif
#ifdef HAVE_INNOBASE_DB
if (have_innodb == SHOW_OPTION_YES)
{
if (!(*ht= innobase_init()))
{
have_innodb= SHOW_OPTION_DISABLED; // If we couldn't use handler
error= 1;
}
else
ha_was_inited_ok(ht++);
}
case DB_TYPE_INNODB:
if (have_innodb == SHOW_OPTION_YES)
{
if (!(*ht= innobase_init()))
{
have_innodb= SHOW_OPTION_DISABLED; // If we couldn't use handler
error= 1;
}
else
{
ha_was_inited_ok(ht++);
types->ht= &innobase_hton;
for (table_alias= sys_table_aliases; table_alias->type; table_alias++)
{
if (!my_strcasecmp(&my_charset_latin1, types->ht->name, table_alias->type))
table_alias->st= types;
}
}
}
break;
#endif
#ifdef HAVE_NDBCLUSTER_DB
if (have_ndbcluster == SHOW_OPTION_YES)
{
if (!(*ht= ndbcluster_init()))
{
have_ndbcluster= SHOW_OPTION_DISABLED;
error= 1;
}
else
ha_was_inited_ok(ht++);
}
case DB_TYPE_NDBCLUSTER:
if (have_ndbcluster == SHOW_OPTION_YES)
{
if (!(*ht= ndbcluster_init()))
{
have_ndbcluster= SHOW_OPTION_DISABLED;
error= 1;
}
else
{
ha_was_inited_ok(ht++);
types->ht= &ndbcluster_hton;
for (table_alias= sys_table_aliases; table_alias->type; table_alias++)
{
if (!my_strcasecmp(&my_charset_latin1, types->ht->name, table_alias->type))
table_alias->st= types;
}
}
}
break;
#endif
#ifdef HAVE_EXAMPLE_DB
case DB_TYPE_EXAMPLE_DB:
types->ht= &example_hton;
break;
#endif
#ifdef HAVE_ARCHIVE_DB
case DB_TYPE_ARCHIVE_DB:
if (have_archive_db == SHOW_OPTION_YES)
{
if (!(*ht= archive_db_init()))
{
have_archive_db= SHOW_OPTION_DISABLED;
error= 1;
}
else
{
ha_was_inited_ok(ht++);
types->ht= &archive_hton;
}
}
break;
#endif
#ifdef HAVE_CSV_DB
case DB_TYPE_CSV_DB,:
types->ht= &tina_hton;
break;
#endif
#ifdef HAVE_FEDERATED_DB
if (have_federated_db == SHOW_OPTION_YES)
{
if (federated_db_init())
{
have_federated_db= SHOW_OPTION_DISABLED;
error= 1;
case DB_TYPE_FEDERATED_DB:
if (have_federated_db == SHOW_OPTION_YES)
{
if (federated_db_init())
{
have_federated_db= SHOW_OPTION_DISABLED;
error= 1;
}
else
{
types->ht= &federated_hton;
}
}
break;
#endif
#ifdef HAVE_BLACKHOLE_DB
case DB_TYPE_BLACKHOLE_DB:
types->ht= &blackhole_hton;
break;
#endif
default:
types->ht= NULL;
}
}
#endif
#ifdef HAVE_ARCHIVE_DB
if (have_archive_db == SHOW_OPTION_YES)
if (opt_bin_log)
{
if (!(*ht= archive_db_init()))
if (!(*ht= binlog_init())) // Always succeed
{
have_archive_db= SHOW_OPTION_DISABLED;
error= 1;
mysql_bin_log.close(LOG_CLOSE_INDEX); // Never used
opt_bin_log= 0; // Never used
error= 1; // Never used
}
else
ha_was_inited_ok(ht++);
}
#endif
DBUG_ASSERT(total_ha < MAX_HA);
/*
Check if there is a transaction-capable storage engine besides the
......
......@@ -177,13 +177,6 @@ enum db_type
DB_TYPE_DEFAULT // Must be last
};
struct show_table_type_st {
const char *type;
SHOW_COMP_OPTION *value;
const char *comment;
enum db_type db_type;
};
enum row_type { ROW_TYPE_NOT_USED=-1, ROW_TYPE_DEFAULT, ROW_TYPE_FIXED,
ROW_TYPE_DYNAMIC, ROW_TYPE_COMPRESSED,
ROW_TYPE_REDUNDANT, ROW_TYPE_COMPACT };
......@@ -363,6 +356,20 @@ typedef struct
uint32 flags; /* global handler flags */
} handlerton;
struct show_table_type_st {
const char *type;
SHOW_COMP_OPTION *value;
const char *comment;
enum db_type db_type;
handlerton *ht;
};
struct show_table_alias_st {
const char *alias;
const char *type;
show_table_type_st *st;
};
/* Possible flags of a handlerton */
#define HTON_NO_FLAGS 0
#define HTON_CLOSE_CURSORS_AT_COMMIT 1
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment