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.