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; ...@@ -136,7 +136,7 @@ static HASH archive_open_tables;
#define ARCHIVE_CHECK_HEADER 254 // The number we use to determine corruption #define ARCHIVE_CHECK_HEADER 254 // The number we use to determine corruption
/* dummy handlerton - only to have something to return from archive_db_init */ /* dummy handlerton - only to have something to return from archive_db_init */
static handlerton archive_hton = { handlerton archive_hton = {
"archive", "archive",
0, /* slot */ 0, /* slot */
0, /* savepoint size. */ 0, /* savepoint size. */
......
...@@ -73,7 +73,7 @@ ...@@ -73,7 +73,7 @@
#include "ha_example.h" #include "ha_example.h"
static handlerton example_hton= { handlerton example_hton= {
"CSV", "CSV",
0, /* slot */ 0, /* slot */
0, /* savepoint size. */ 0, /* savepoint size. */
......
...@@ -54,7 +54,7 @@ pthread_mutex_t tina_mutex; ...@@ -54,7 +54,7 @@ pthread_mutex_t tina_mutex;
static HASH tina_open_tables; static HASH tina_open_tables;
static int tina_init= 0; static int tina_init= 0;
static handlerton tina_hton= { handlerton tina_hton= {
"CSV", "CSV",
0, /* slot */ 0, /* slot */
0, /* savepoint size. */ 0, /* savepoint size. */
......
...@@ -107,7 +107,7 @@ static int berkeley_close_connection(THD *thd); ...@@ -107,7 +107,7 @@ static int berkeley_close_connection(THD *thd);
static int berkeley_commit(THD *thd, bool all); static int berkeley_commit(THD *thd, bool all);
static int berkeley_rollback(THD *thd, bool all); static int berkeley_rollback(THD *thd, bool all);
static handlerton berkeley_hton = { handlerton berkeley_hton = {
"BerkeleyDB", "BerkeleyDB",
0, /* slot */ 0, /* slot */
0, /* savepoint size */ 0, /* savepoint size */
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
/* Blackhole storage engine handlerton */ /* Blackhole storage engine handlerton */
static handlerton blackhole_hton= { handlerton blackhole_hton= {
"BLACKHOLE", "BLACKHOLE",
0, /* slot */ 0, /* slot */
0, /* savepoint size. */ 0, /* savepoint size. */
......
...@@ -690,7 +690,7 @@ error: ...@@ -690,7 +690,7 @@ error:
/* Federated storage engine handlerton */ /* Federated storage engine handlerton */
static handlerton federated_hton= { handlerton federated_hton= {
"FEDERATED", "FEDERATED",
0, /* slot */ 0, /* slot */
0, /* savepoint size. */ 0, /* savepoint size. */
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
#include <myisampack.h> #include <myisampack.h>
#include "ha_heap.h" #include "ha_heap.h"
static handlerton heap_hton= { handlerton heap_hton= {
"MEMORY", "MEMORY",
0, /* slot */ 0, /* slot */
0, /* savepoint size. */ 0, /* savepoint size. */
......
...@@ -206,7 +206,7 @@ static int innobase_rollback_to_savepoint(THD* thd, void *savepoint); ...@@ -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_savepoint(THD* thd, void *savepoint);
static int innobase_release_savepoint(THD* thd, void *savepoint); static int innobase_release_savepoint(THD* thd, void *savepoint);
static handlerton innobase_hton = { handlerton innobase_hton = {
"InnoDB", "InnoDB",
0, /* slot */ 0, /* slot */
sizeof(trx_named_savept_t), /* savepoint size. TODO: use it */ sizeof(trx_named_savept_t), /* savepoint size. TODO: use it */
......
...@@ -46,7 +46,7 @@ TYPELIB myisam_recover_typelib= {array_elements(myisam_recover_names)-1,"", ...@@ -46,7 +46,7 @@ TYPELIB myisam_recover_typelib= {array_elements(myisam_recover_names)-1,"",
/* MyISAM handlerton */ /* MyISAM handlerton */
static handlerton myisam_hton= { handlerton myisam_hton= {
"MyISAM", "MyISAM",
0, /* slot */ 0, /* slot */
0, /* savepoint size. */ 0, /* savepoint size. */
......
...@@ -34,8 +34,8 @@ ...@@ -34,8 +34,8 @@
/* MyISAM MERGE handlerton */ /* MyISAM MERGE handlerton */
static handlerton myisammrg_hton= { handlerton myisammrg_hton= {
"MRG_MyISAM", "MRG_MYISAM",
0, /* slot */ 0, /* slot */
0, /* savepoint size. */ 0, /* savepoint size. */
NULL, /* close_connection */ NULL, /* close_connection */
......
...@@ -49,7 +49,7 @@ static int ndbcluster_close_connection(THD *thd); ...@@ -49,7 +49,7 @@ static int ndbcluster_close_connection(THD *thd);
static int ndbcluster_commit(THD *thd, bool all); static int ndbcluster_commit(THD *thd, bool all);
static int ndbcluster_rollback(THD *thd, bool all); static int ndbcluster_rollback(THD *thd, bool all);
static handlerton ndbcluster_hton = { handlerton ndbcluster_hton = {
"ndbcluster", "ndbcluster",
0, /* slot */ 0, /* slot */
0, /* savepoint size */ 0, /* savepoint size */
......
...@@ -27,31 +27,44 @@ ...@@ -27,31 +27,44 @@
#include "ha_myisammrg.h" #include "ha_myisammrg.h"
#ifdef HAVE_BERKELEY_DB #ifdef HAVE_BERKELEY_DB
#include "ha_berkeley.h" #include "ha_berkeley.h"
extern handlerton berkeley_hton;
#endif #endif
#ifdef HAVE_BLACKHOLE_DB #ifdef HAVE_BLACKHOLE_DB
#include "ha_blackhole.h" #include "ha_blackhole.h"
extern handlerton blackhole_hton;
#endif #endif
#ifdef HAVE_EXAMPLE_DB #ifdef HAVE_EXAMPLE_DB
#include "examples/ha_example.h" #include "examples/ha_example.h"
extern handlerton example_hton;
#endif #endif
#ifdef HAVE_ARCHIVE_DB #ifdef HAVE_ARCHIVE_DB
#include "examples/ha_archive.h" #include "examples/ha_archive.h"
extern handlerton archive_hton;
#endif #endif
#ifdef HAVE_CSV_DB #ifdef HAVE_CSV_DB
#include "examples/ha_tina.h" #include "examples/ha_tina.h"
extern handlerton tina_hton;
#endif #endif
#ifdef HAVE_INNOBASE_DB #ifdef HAVE_INNOBASE_DB
#include "ha_innodb.h" #include "ha_innodb.h"
extern handlerton innobase_hton;
#endif #endif
#ifdef HAVE_NDBCLUSTER_DB #ifdef HAVE_NDBCLUSTER_DB
#include "ha_ndbcluster.h" #include "ha_ndbcluster.h"
extern handlerton ndbcluster_hton;
#endif #endif
#ifdef HAVE_FEDERATED_DB #ifdef HAVE_FEDERATED_DB
#include "ha_federated.h" #include "ha_federated.h"
extern handlerton federated_hton;
#endif #endif
#include <myisampack.h> #include <myisampack.h>
#include <errno.h> #include <errno.h>
extern handlerton myisam_hton;
extern handlerton myisammrg_hton;
extern handlerton heap_hton;
/* static functions defined in this file */ /* static functions defined in this file */
static SHOW_COMP_OPTION have_yes= SHOW_OPTION_YES; static SHOW_COMP_OPTION have_yes= SHOW_OPTION_YES;
...@@ -66,46 +79,53 @@ ulong total_ha_2pc; ...@@ -66,46 +79,53 @@ ulong total_ha_2pc;
/* size of savepoint storage area (see ha_init) */ /* size of savepoint storage area (see ha_init) */
ulong savepoint_alloc_size; 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[]= struct show_table_type_st sys_table_types[]=
{ {
{"MyISAM", &have_yes, {"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, {"MEMORY", &have_yes,
"Hash based, stored in memory, useful for temporary tables", DB_TYPE_HEAP}, "Hash based, stored in memory, useful for temporary tables", DB_TYPE_HEAP,
{"HEAP", &have_yes, NULL},
"Alias for MEMORY", DB_TYPE_HEAP}, {"MRG_MYISAM", &have_yes,
{"MERGE", &have_yes, "Collection of identical MyISAM tables", DB_TYPE_MRG_MYISAM, NULL},
"Collection of identical MyISAM tables", DB_TYPE_MRG_MYISAM},
{"MRG_MYISAM",&have_yes,
"Alias for MERGE", DB_TYPE_MRG_MYISAM},
{"ISAM", &have_isam, {"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, {"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, {"InnoDB", &have_innodb,
"Supports transactions, row-level locking, and foreign keys", DB_TYPE_INNODB}, "Supports transactions, row-level locking, and foreign keys", DB_TYPE_INNODB,
{"INNOBASE", &have_innodb, NULL},
"Alias for INNODB", DB_TYPE_INNODB}, {"BERKELEYDB", &have_berkeley_db,
{"BDB", &have_berkeley_db, "Supports transactions and page-level locking", DB_TYPE_BERKELEY_DB, NULL},
"Supports transactions and page-level locking", DB_TYPE_BERKELEY_DB},
{"BERKELEYDB",&have_berkeley_db,
"Alias for BDB", DB_TYPE_BERKELEY_DB},
{"NDBCLUSTER", &have_ndbcluster, {"NDBCLUSTER", &have_ndbcluster,
"Clustered, fault-tolerant, memory-based tables", DB_TYPE_NDBCLUSTER}, "Clustered, fault-tolerant, memory-based tables", DB_TYPE_NDBCLUSTER, NULL},
{"NDB", &have_ndbcluster,
"Alias for NDBCLUSTER", DB_TYPE_NDBCLUSTER},
{"EXAMPLE",&have_example_db, {"EXAMPLE",&have_example_db,
"Example storage engine", DB_TYPE_EXAMPLE_DB}, "Example storage engine", DB_TYPE_EXAMPLE_DB, NULL},
{"ARCHIVE",&have_archive_db, {"ARCHIVE",&have_archive_db,
"Archive storage engine", DB_TYPE_ARCHIVE_DB}, "Archive storage engine", DB_TYPE_ARCHIVE_DB, NULL},
{"CSV",&have_csv_db, {"CSV",&have_csv_db,
"CSV storage engine", DB_TYPE_CSV_DB}, "CSV storage engine", DB_TYPE_CSV_DB, NULL},
{"FEDERATED",&have_federated_db, {"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, {"BLACKHOLE",&have_blackhole_db,
"/dev/null storage engine (anything you write to it disappears)", "/dev/null storage engine (anything you write to it disappears)",
DB_TYPE_BLACKHOLE_DB}, DB_TYPE_BLACKHOLE_DB, NULL},
{NullS, NULL, NullS, DB_TYPE_UNKNOWN} {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[] = { const char *ha_row_type[] = {
...@@ -124,16 +144,27 @@ uint known_extensions_id= 0; ...@@ -124,16 +144,27 @@ uint known_extensions_id= 0;
enum db_type ha_resolve_by_name(const char *name, uint namelen) enum db_type ha_resolve_by_name(const char *name, uint namelen)
{ {
THD *thd= current_thd; THD *thd= current_thd;
show_table_alias_st *table_alias;
show_table_type_st *types;
if (thd && !my_strcasecmp(&my_charset_latin1, name, "DEFAULT")) { if (thd && !my_strcasecmp(&my_charset_latin1, name, "DEFAULT")) {
return (enum db_type) thd->variables.table_type; return (enum db_type) thd->variables.table_type;
} }
show_table_type_st *types;
for (types= sys_table_types; types->type; types++) for (types= sys_table_types; types->type; types++)
{ {
if (!my_strcasecmp(&my_charset_latin1, name, types->type)) if (!my_strcasecmp(&my_charset_latin1, name, types->type))
return (enum db_type) types->db_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; return DB_TYPE_UNKNOWN;
} }
...@@ -361,80 +392,165 @@ int ha_init() ...@@ -361,80 +392,165 @@ int ha_init()
{ {
int error= 0; int error= 0;
handlerton **ht= handlertons; handlerton **ht= handlertons;
show_table_type_st *types;
show_table_alias_st *table_alias;
total_ha= savepoint_alloc_size= 0; total_ha= savepoint_alloc_size= 0;
if (ha_init_errors()) if (ha_init_errors())
return 1; return 1;
if (opt_bin_log) for (types= sys_table_types; types->type; types++)
{ {
if (!(*ht= binlog_init())) // Always succeed switch (types->db_type) {
{ case DB_TYPE_HEAP:
mysql_bin_log.close(LOG_CLOSE_INDEX); // Never used types->ht= &heap_hton;
opt_bin_log= 0; // Never used for (table_alias= sys_table_aliases; table_alias->type; table_alias++)
error= 1; // Never used {
} if (!my_strcasecmp(&my_charset_latin1, types->ht->name, table_alias->type))
else table_alias->st= types;
ha_was_inited_ok(ht++); }
} 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 #ifdef HAVE_BERKELEY_DB
if (have_berkeley_db == SHOW_OPTION_YES) case DB_TYPE_BERKELEY_DB:
{ if (have_berkeley_db == SHOW_OPTION_YES)
if (!(*ht= berkeley_init())) {
{ if (!(*ht= berkeley_init()))
have_berkeley_db= SHOW_OPTION_DISABLED; // If we couldn't use handler {
error= 1; have_berkeley_db= SHOW_OPTION_DISABLED; // If we couldn't use handler
} error= 1;
else }
ha_was_inited_ok(ht++); 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 #endif
#ifdef HAVE_INNOBASE_DB #ifdef HAVE_INNOBASE_DB
if (have_innodb == SHOW_OPTION_YES) case DB_TYPE_INNODB:
{ if (have_innodb == SHOW_OPTION_YES)
if (!(*ht= innobase_init())) {
{ if (!(*ht= innobase_init()))
have_innodb= SHOW_OPTION_DISABLED; // If we couldn't use handler {
error= 1; have_innodb= SHOW_OPTION_DISABLED; // If we couldn't use handler
} error= 1;
else }
ha_was_inited_ok(ht++); 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 #endif
#ifdef HAVE_NDBCLUSTER_DB #ifdef HAVE_NDBCLUSTER_DB
if (have_ndbcluster == SHOW_OPTION_YES) case DB_TYPE_NDBCLUSTER:
{ if (have_ndbcluster == SHOW_OPTION_YES)
if (!(*ht= ndbcluster_init())) {
{ if (!(*ht= ndbcluster_init()))
have_ndbcluster= SHOW_OPTION_DISABLED; {
error= 1; have_ndbcluster= SHOW_OPTION_DISABLED;
} error= 1;
else }
ha_was_inited_ok(ht++); 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 #endif
#ifdef HAVE_FEDERATED_DB #ifdef HAVE_FEDERATED_DB
if (have_federated_db == SHOW_OPTION_YES) case DB_TYPE_FEDERATED_DB:
{ if (have_federated_db == SHOW_OPTION_YES)
if (federated_db_init()) {
{ if (federated_db_init())
have_federated_db= SHOW_OPTION_DISABLED; {
error= 1; 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 (opt_bin_log)
if (have_archive_db == SHOW_OPTION_YES)
{ {
if (!(*ht= archive_db_init())) if (!(*ht= binlog_init())) // Always succeed
{ {
have_archive_db= SHOW_OPTION_DISABLED; mysql_bin_log.close(LOG_CLOSE_INDEX); // Never used
error= 1; opt_bin_log= 0; // Never used
error= 1; // Never used
} }
else else
ha_was_inited_ok(ht++); ha_was_inited_ok(ht++);
} }
#endif
DBUG_ASSERT(total_ha < MAX_HA); DBUG_ASSERT(total_ha < MAX_HA);
/* /*
Check if there is a transaction-capable storage engine besides the Check if there is a transaction-capable storage engine besides the
......
...@@ -177,13 +177,6 @@ enum db_type ...@@ -177,13 +177,6 @@ enum db_type
DB_TYPE_DEFAULT // Must be last 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, enum row_type { ROW_TYPE_NOT_USED=-1, ROW_TYPE_DEFAULT, ROW_TYPE_FIXED,
ROW_TYPE_DYNAMIC, ROW_TYPE_COMPRESSED, ROW_TYPE_DYNAMIC, ROW_TYPE_COMPRESSED,
ROW_TYPE_REDUNDANT, ROW_TYPE_COMPACT }; ROW_TYPE_REDUNDANT, ROW_TYPE_COMPACT };
...@@ -363,6 +356,20 @@ typedef struct ...@@ -363,6 +356,20 @@ typedef struct
uint32 flags; /* global handler flags */ uint32 flags; /* global handler flags */
} handlerton; } 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 */ /* Possible flags of a handlerton */
#define HTON_NO_FLAGS 0 #define HTON_NO_FLAGS 0
#define HTON_CLOSE_CURSORS_AT_COMMIT 1 #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