Once a handler is instanced, the first operation that will likely
be required is the creation of a table.
Your storage engine must implement the
create()
virtual function:
virtual int create(const char *name, TABLE *form, HA_CREATE_INFO *info)=0;
This function should create all necessary files but does not need
to open the table. The MySQL server will call for the table to be
opened later on.
The *name
parameter is the name of the table.
The *form
parameter is a
TABLE
structure that defines the table and
matches the contents of the
tablename
.frm
file
already created by the MySQL server. Storage engines must not
modify the
tablename
.frm
file.
The *info
parameter is a structure containing
information on the CREATE TABLE
statement used
to create the table. The structure is defined in
handler.h
and copied here for your
convenience:
typedef struct st_ha_create_information
{
CHARSET_INFO *table_charset, *default_table_charset;
LEX_STRING connect_string;
const char *comment,*password;
const char *data_file_name, *index_file_name;
const char *alias;
ulonglong max_rows,min_rows;
ulonglong auto_increment_value;
ulong table_options;
ulong avg_row_length;
ulong raid_chunksize;
ulong used_fields;
SQL_LIST merge_list;
enum db_type db_type;
enum row_type row_type;
uint null_bits; /* NULL bits at start of record */
uint options; /* OR of HA_CREATE_ options */
uint raid_type,raid_chunks;
uint merge_insert_method;
uint extra_size; /* length of extra data segment */
bool table_existed; /* 1 in create if table existed */
bool frm_only; /* 1 if no ha_create_table() */
bool varchar; /* 1 if table has a VARCHAR */
} HA_CREATE_INFO;
A basic storage engine can ignore the contents of
*form
and *info
, as all that
is really required is the creation and possibly the initialization
of the data files used by the storage engine (assuming the storage
engine is file-based).
For example, here is the implementation from the
CSV
storage engine:
int ha_tina::create(const char *name, TABLE *table_arg,
HA_CREATE_INFO *create_info)
{
char name_buff[FN_REFLEN];
File create_file;
DBUG_ENTER("ha_tina::create");
if ((create_file= my_create(fn_format(name_buff, name, "", ".CSV",
MY_REPLACE_EXT|MY_UNPACK_FILENAME),0,
O_RDWR | O_TRUNC,MYF(MY_WME))) < 0)
DBUG_RETURN(-1);
my_close(create_file,MYF(0));
DBUG_RETURN(0);
}
In the preceding example, the CSV
engine does
not refer at all to the *table_arg
or
*create_info
parameters, but simply creates the
required data files, closes them, and returns.
The my_create
and my_close
functions are helper functions defined in
src/include/my_sys.h
.