Definizione delle tabelle nel Protobuffer
Da Drizzle Wiki.
Indice |
[modifica] Definizione delle tabelle
Stiamo cercando di eliminare i file FRM. Dobbiamo definire un sistema di messaggi e allo stesso tempo aggiornare la definizione delle tabelle sezializzate. L'ultima proposta è quella di utilizzare il ProtoBuffer di Google:
http://code.google.com/apis/protocolbuffers/
Il formato è compatto e ha il vantaggio di supportare già il versioning. Inoltre intorno a esso si è formato un ambiente di sviluppo attivo. Sentiti libero di aggiornare questa proposta di formato (nella pagina in inglese, però). Puoi trovare un rapido tutorial qui: http://code.google.com/apis/protocolbuffers/docs/cpptutorial.html
[modifica] Most Recent Draft
package drizzle;
message Table {
enum TableType {
STANDARD = 0;
TEMPORARY = 1;
}
message StorageEngine {
message EngineOption {
enum EngineOptionType {
BOOL = 0;
INTEGER = 1;
STRING = 2;
}
required string name = 1;
required string value = 2;
required EngineOptionType type = 3;
}
required string name = 1;
repeated EngineOption option = 2;
}
message TableOptions {
optional uint64 auto_increment = 1;
optional string charset = 2;
optional string collation = 3;
}
message TableStats {
optional uint32 avg_row_length = 1;
optional uint64 max_rows = 2;
optional uint32 min_rows = 3;
}
message ForeignKeyConstraint {
required string name = 1;
required Field dependent = 2;
required Field parent = 3;
/** @TODO Finish this off... */
}
message Field {
enum FieldType {
DOUBLE = 0;
VARCHAR = 1;
TEXT = 2;
BLOB = 3;
ENUM = 4;
SET = 5;
TINYINT = 6;
SMALLINT = 7;
INTEGER = 8;
BIGINT = 9;
DECIMAL = 10;
VARBINARY = 11;
DATE = 12;
TIME = 13;
TIMESTAMP = 14;
DATETIME = 15;
}
message FieldOptions {
required bool is_autoincrement = 1 [default = false];
optional string default_value = 2;
}
message TimestampFieldOptions {
optional bool auto_updates = 1 [default = false];
}
message FieldConstraints {
required bool is_nullable = 1 [default = false];
optional bool is_unsigned = 2 [default = false];
repeated string expression = 16; /* Reserve 0-15 for frequenty accessed attributes */
}
message NumericFieldOptions {
optional int32 length = 1;
optional int32 scale = 2;
optional int32 precision = 3;
}
message StringFieldOptions {
required bool is_fixed_width = 1;
optional int32 length = 2;
optional string charset = 3; /* Perhaps this can go away soon...*/
optional string collation = 4;
}
message SetFieldOptions {
required int32 count_elements = 1;
repeated string value = 2;
}
required string name = 1;
required FieldType type = 2;
required FieldOptions options = 3;
required FieldConstraints constraints = 4;
optional NumericFieldOptions numeric_options = 5;
optional StringFieldOptions string_options = 6;
optional string comment = 16; /* Reserve 0-15 for frequently accessed attributes */
optional SetFieldOptions set_options = 17;
optional TimestampFieldOptions timestamp_options = 18;
}
message Index {
enum IndexType {
UNKNOWN = 0;
HASH = 1;
BTREE = 2;
RTREE = 3;
FULLTEXT = 4;
}
message IndexPart {
required Field field = 1;
optional int32 compare_length = 2;
optional bool in_reverse_order = 3 [default = false];
}
required string name = 1;
required bool is_primary = 2;
required bool is_unique = 3;
required IndexType type = 4 [default = UNKNOWN];
repeated IndexPart index_part = 5;
}
required string name = 1;
required TableType type = 5;
required StorageEngine engine = 2;
repeated Field field = 3;
repeated Index index = 4;
repeated ForeignKeyConstraint fk_constraint = 8;
optional TableOptions options = 9;
optional TableStats stats = 10;
optional string comment = 16;
}
message TableList {
repeated Table table = 1;
}
[modifica] Draft 1 Definition
package drizzle;
message Table {
required string name = 1;
required string engine = 2;
enum FieldType {
DOUBLE = 0;
VARCHAR = 1;
TEXT = 2;
BLOB = 3;
ENUM = 4;
SET = 5;
TINYINT = 6;
SMALLINT = 7;
INTEGER = 8;
BIGINT = 9;
DECIMAL = 10;
VARBINARY = 11;
DATE = 12;
TIME = 13;
TIMESTAMP = 14;
DATETIME = 15;
}
message Field {
required string name = 1;
optional FieldType type = 2 [default = VARCHAR];
optional string collation = 3;
optional string comment = 4;
optional bool column_format = 5; /* Fixed is true */
optional bool auto_increment = 6;
optional bool is_unsigned = 9;
optional string custom_name = 10;
optional bool is_nullable = 11;
optional int32 scale = 12;
optional int32 precision = 13;
optional int32 characterset = 14;
optional int32 length = 15;
optional string default = 16;
repeated string values = 17;
}
message KeyPart {
required string name = 1;
optional int32 length = 2;
}
enum IndexType {
ORDERED = 0;
HASH = 1;
}
message Index {
required string name = 1;
repeated KeyPart key = 2;
optional bool unique = 3;
optional string comment = 4;
optional int32 key_block_size = 5;
optional IndexType type = 6;
}
repeated Field field = 4;
repeated Index index = ?;
optional string primary = 5;
optional int32 auto_increment = 6;
optional int32 avg_row_length = 7;
optional string character_set = 8;
optional bool checksum = 9;
optional string collation = 10;
optional string comment = 11;
optional string connection = 12;
optional string data_directory = 13;
optional string index_directory = 14;
optional bool delay_key_write = 15;
optional int32 max_rows = 17;
optional int32 min_rows = 18;
optional bool pack_keys = 19;
optional string row_format = 20;
}
message TableList {
repeated Table table = 1;
}
[modifica] Alternate Definition from Jay
package drizzle;
message TableOptions {
}
message Table {
required string name = 1;
required string engine = 2;
enum FieldType {
DOUBLE = 0;
VARCHAR = 1;
TEXT = 2;
BLOB = 3;
ENUM = 4;
SET = 5;
TINYINT = 6;
SMALLINT = 7;
INTEGER = 8;
BIGINT = 9;
DECIMAL = 10;
VARBINARY = 11;
DATE = 12;
TIME = 13;
TIMESTAMP = 14;
DATETIME = 15;
}
message FieldOptions {
optional bool is_primary_key = 0 [default = false];
optional bool is_autoincrement = 1 [default = false];
optional bool is_key = 2 [default = false];
optional bool is_variable_width = 3;
optional string default_value = 4;
optional bool on_update = 16; /* Reserve 0 - 15 for most common */
}
message FieldConstraints {
optional bool is_unique = 0 [default = false];
optional bool is_unsigned = 1 [default = false];
optional bool is_nullable = 2 [default = false];
optional string expression = 16; /* Reserve 0 - 15 for most common */
}
message NumericOptions {
optional int32 scale = 0;
optional int32 precision = 1;
}
message StringOptions {
optional int32 length = 0;
optional string character_set = 1; /* Perhaps this can go away */
optional string collation = 2;
}
message Field {
required string name = 0;
required FieldType type = 1;
required FieldOptions = 2;
required FieldConstraints = 3;
optional NumericOptions numeric_options = 4;
optional StringOptions string_options = 5;
optional string custom_name = 6; /* What is this for? */
repeated string values = 7; /* Is this for ENUM and SET only? If so, move it out... */
optional string comment = 16; /* Reserve 0 - 15 for most common */
}
message KeyPart {
required string name = 1;
optional int32 length = 2;
}
enum IndexType {
ORDERED = 0; /* What is an "unordered" index?! */
HASH = 1;
}
message Index {
required string name = 1;
repeated KeyPart key = 2;
optional bool is_unique = 3;
optional int32 key_block_size = 5; /* This is MyISAM only, no? ...move it out. */
optional IndexType type = 6;
optional string comment = 16; /* Reserve 0 - 15 for most common */
}
repeated Field field = 4;
repeated Index index = ?;
/* The below are a hodge podge of engine-specific stuff and random attributes...they need cleaning up */
optional string primary = 5;
optional int32 auto_increment = 6;
optional int32 avg_row_length = 7;
optional string character_set = 8;
optional bool checksum = 9;
optional string collation = 10;
optional string connection = 12;
optional string data_directory = 13;
optional string index_directory = 14;
optional bool delay_key_write = 15;
optional int32 max_rows = 17;
optional int32 min_rows = 18;
optional bool pack_keys = 19;
optional string row_format = 20;
optional string comment = 16; /* Reserve 0 - 15 for most common */
}
message TableList {
repeated Table tables = 1;
}
