wiki.techinc.nl/docs/abstract-schema-table.json
mainframe98 de0c4819d1 Add validation for abstract schema
This adds an option to the schema generating maintenance scripts to
validate abstract schemas and schema changes and a structure test to
validate exisiting schemas and schema changes. Schemas are also
validated when generating.

The validation for the schema doesn't impose limits on table, index or
column names as I couldn't find any reliable conventions for them.

The structure tests only cover MediaWiki itself as there is no
convention on where extensions store their abstract schema.
Ideally, auto detection would be possible for sql/, but for now
extensions have to define their own (thankfully trivial) tests.

A couple of invalid definitions were fixed thanks to these tests.

I aimed to be thorough, but not all parts of the abstract schema
are completely clear, and Doctrine's documentation is not complete.
As a result, not everything has a description field.

Bug: T298320
Change-Id: I681d265317d4d1584869142ebb23d4098c06885f
2022-02-22 17:41:08 +00:00

208 lines
4.4 KiB
JSON

{
"$schema": "https://json-schema.org/schema#",
"description": "Abstract description of a mediawiki database table",
"type": "object",
"additionalProperties": false,
"properties": {
"name": {
"type": "string",
"description": "Name of the table"
},
"comment": {
"type": "string",
"description": "Comment describing the table"
},
"columns": {
"type": "array",
"additionalItems": false,
"description": "Columns",
"minItems": 1,
"items": {
"type": "object",
"additionalProperties": false,
"properties": {
"name": {
"type": "string",
"description": "Name of the column"
},
"comment": {
"type": "string",
"description": "Comment describing the column"
},
"type": {
"type": "string",
"description": "Data type of the column",
"enum": [
"bigint",
"binary",
"blob",
"datetimetz",
"float",
"integer",
"mwenum",
"mwtimestamp",
"mwtinyint",
"smallint",
"string",
"text"
]
},
"options": {
"type": "object",
"description": "Additional options",
"additionalProperties": false,
"properties": {
"autoincrement": {
"type": "boolean",
"description": "Indicates if the field should use an autoincremented value if no value was provided",
"default": false
},
"default": {
"type": [
"number",
"string",
"null"
],
"description": "The default value of the column if no value was specified",
"default": null
},
"fixed": {
"type": "boolean",
"description": "Indicates if the column should have a fixed length",
"default": false
},
"length": {
"type": "number",
"description": "Length of the field.",
"default": null,
"minimum": 0
},
"notnull": {
"type": "boolean",
"description": "Indicates whether the column is nullable or not",
"default": true
},
"unsigned": {
"type": "boolean",
"description": "If the column should be an unsigned integer",
"default": false
},
"PlatformOptions": {
"type": "object",
"additionalProperties": false,
"properties": {
"version": {
"type": "boolean"
}
}
},
"CustomSchemaOptions": {
"type": "object",
"description": "Custom schema options",
"additionalProperties": false,
"properties": {
"allowInfinite": {
"type": "boolean"
},
"doublePrecision": {
"type": "boolean"
},
"enum_values": {
"type": "array",
"description": "Values to use with type 'mwenum'",
"additionalItems": false,
"items": {
"type": "string"
},
"uniqueItems": true
}
}
}
}
}
},
"required": [
"name",
"type"
]
}
},
"indexes": {
"type": "array",
"additionalItems": false,
"description": "Indexes",
"items": {
"type": "object",
"additionalProperties": false,
"properties": {
"name": {
"type": "string",
"description": "Index name"
},
"comment": {
"type": "string",
"description": "Comment describing the index"
},
"columns": {
"type": "array",
"additionalItems": false,
"description": "Columns used by the index",
"items": {
"type": "string"
},
"uniqueItems": true
},
"unique": {
"type": "boolean",
"description": "If the index is unique"
},
"flags": {
"type": "array",
"items": {
"type": "string"
}
},
"options": {
"type": "object",
"properties": {
"lengths": {
"type": "array",
"items": {
"type": [
"number",
"null"
]
},
"minItems": 1
}
}
}
},
"required": [
"name",
"columns"
]
}
},
"pk": {
"type": "array",
"additionalItems": false,
"description": "Array of column names used in the primary key",
"items": {
"type": "string"
},
"uniqueItems": true
},
"table_options": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"name",
"columns",
"indexes"
]
}