Estendere CREATE TABLE

A partire da MariaDB 5.2, gli Storage Engine possono dare la possibilità all'utente di specificare nuovi attributi per gli indici, i campi e le tabella. Lo SE deve dichiarare quali attributi introduce.

API

Ci sono tre nuovi membri nella struttura hanlerton, che possono essere impostati nella funzione di inizializzazione dell'engine nel modo seguente:

example_hton->table_options= example_table_option_array;
example_hton->field_options= example_field_option_array;
example_hton->index_options= example_index_option_array;

Gli array sono dichiarati staticamente, come nell'esempio seguente:

struct ha_table_option_struct
{
  char *strparam;
  ulonglong ullparam;
  uint enumparam;
  bool boolparam;
};

ha_create_table_option example_table_option_list[]=
{
  HA_TOPTION_NUMBER("NUMBER", ullparam, UINT_MAX32, 0, UINT_MAX32, 10),
  HA_TOPTION_STRING("STR", strparam),
  HA_TOPTION_ENUM("one_or_two", enumparam, "one,two", 0),
  HA_TOPTION_BOOL("YESNO", boolparam, 1),
  HA_TOPTION_END
};

L'engine dichiara una struttura ha_table_option_struct che contiene i valori di questi nuovi attributi.

E descrive gli attributi a MySQL creando un array di macroHA_TOPTION_* . Si noti un dettaglio: queste macro si aspettano una struttura chiamata ha_table_option_struct , se ha un nome differente occorrerà un #define .

Ecco i quattro tipi di attributi supportati:

TipoTipo  C  corrispondenteNome macroParametri macro aggiuntivi
un numero interounsigned long longHA_TOPTION_NUMBERvalore di default, valore minimo ammesso, valore massimo, un fattore del quale i valori devono essere multipli per poter essere ammessi.
una stringachar *HA_TOPTION_STRINGnessuno. Il valore di default è un puntatore null.
un valore da una lista di valori ammessiunsigned intHA_TOPTION_ENUMuna stringa contenente un elenco di valori ammessi separati da virgola e un valore di default che è un numero, il minimo è 0.
un booleanoboolHA_TOPTION_BOOLun valore di default

Non è permesso usare enum per i membri di una struttura C HA_TOPTION_ENUM , perché le dimensioni di enum dipendono dal compilatore e dalle opzioni di compilazione, mentre l'API dei plugin utilizza soltanto tipi le cui dimensioni sono note a priori.

In tutte le macro i primi due parametri sono il nome dell'attributo come verrà usato in SQL nell'istruzione CREATE TABLE, e il nome del membro corrispondente della struttura ha_table_option_struct.

L'array termina con una macro HA_TOPTION_END.

Gli attributi dei campi e degli indici (chiavi) si dichiarano in modo simile, usando le macro HA_FOPTION_* e HA_IOPTION_* macros.

Quando in un'istruzione CREATE TABLE viene chiamato il metodo handler ::create(), gli attributi di tabella sono disponibili in table_arg->s->option_struct; gli attributi dei campi nel membro option_struct o nei singoli campi (cioè oggetti della classe Field); le strutture degli indici nel membro option_struct delle singole chiavi (oggetti della classe KEY).

Sono inoltre disponibili nella maggior parte degli altri metodi handler: gli attributi vengono registrati nel file .frm e ogni MySQL li rende disponibili all'engine assegnandoli ai corrispondenti membri option_struct della tabella, dei campi e delle chiavi.

ALTER TABLE necessita di un particolare supporto da parte dell'engine. MySQL compara la vecchia e la nuova definizione per determinare se deve ricostruire la tabella o meno. Poiché la semantica dell'engine con cui sono stati dichiarati gli attributi non è nota, MySQL non può prendere questa decisione analizzando i valori degli attributi - questo compito è delegato all'engine. La struttura HA_CREATE_INFO ha tre nuovi membri:

ha_table_option_struct *option_struct;           ///< struttura con le opzioni di tabella già sottoposte a parsing
ha_field_option_struct **fields_option_struct;   ///< array delle strutture delle opzioni dei campi
ha_index_option_struct **indexes_option_struct;  ///< array delle strutture delle opzioni degli indici

L'engine (nel metodo ::check_if_incompatible_data()) ha la responsabilità di comparare i nuovi valori degli attributi presenti nella struttura HA_CREATE_INFO con i vecchi presenti nella tabella e restituire COMPATIBLE_DATA_NO se sono stati modificati in modo tale da dover ricostruire la tabella.

Nell'engine EXAMPLE si può trovare un esempio di come dichiarare gli attributi e confrontare i valori per ALTER TABLE.

SQL

Gli attributi dichiarati dall'engine possono essere specificati per campo, indice o tabella nelle istruzioni CREATE TABLE e ALTER TABLE. La sintassi è quella convenzionale:

CREATE TABLE ... (
  campo... [attributo=valore [attributo=valore ...]],
  ...
  indice... [attributo=valore [attributo=valore ...]],
  ...
) ...  [attributo=valore [attributo=valore ...]]

Tutti i valori devono essere specificati come letterali, non come espressioni. Il valore di un'opzione booleana può essere specificato come YES, NO, ON, OFF, 1 o 0. Un valore stringa può essere virgolettato oppure no, come un identificatore (se è un identificatore valido, naturalmente). Ad esempio:

CREATE TABLE ... (
) ENGINE=FEDERATED CONNECTION='mysql://[email protected]';

Il valore dell'attributo ENGINE non è virgolettato, mentre il valore di CONNECTION lo è.

Quando un attributo viene impostato, viene registrato nella definizione della tabella e mostrato nell'output di SHOW CREATE TABLE; . Se si vuole rimuovere un attributo dalla definizione si può usare ALTER TABLE per impostarlo a DEFAULT .

I valori degli attributi sconosciuti e i valori con valori non validi provocano un errore per default. Abilitando la modalità SQL IGNORE_BAD_TABLE_OPTIONS questo errore può essere convertito in un warning. In questo caso gli attributi non validi vengono registrati così come sono nel file .frm perché in futuro, se la tabella viene modificata e convertita a un altro Storage Engine, potrebbero essere validi per il nuovo engine. Questa modalità è abilitata implicitamente nel thread di replica dello slave.

Vedi anche

Commenti

Sto caricando i commenti......
Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.