Before any read or write operations are performed on a table, the
MySQL server will call the
handler::open()
method to open the table data and index files (if they exist).
int open(const char *name, int mode, int test_if_locked);
The first parameter is the name of the table to be opened. The
second parameter determines what file to open or what operation to
take. The values are defined in handler.h
and
are copied here for your convenience:
O_RDONLY - Open read only
O_RDWR - Open read/write
The final option dictates whether the handler should check for a
lock on the table before opening it. The following options are
available:
#define HA_OPEN_ABORT_IF_LOCKED 0 /* default */
#define HA_OPEN_WAIT_IF_LOCKED 1
#define HA_OPEN_IGNORE_IF_LOCKED 2
#define HA_OPEN_TMP_TABLE 4 /* Table is a temp table */
#define HA_OPEN_DELAY_KEY_WRITE 8 /* Don't update index */
#define HA_OPEN_ABORT_IF_CRASHED 16
#define HA_OPEN_FOR_REPAIR 32 /* open even if crashed */
Typically your storage engine will need to implement some form of
shared access control to prevent file corruption is a
multi-threaded environment. For an example of how to implement
file locking, see the get_share()
and
free_share()
methods of
sql/examples/ha_tina.cc
.