Addshore has uploaded a new change for review.
https://gerrit.wikimedia.org/r/89528
Change subject: Add MYSQL AutoIncrement support
......................................................................
Add MYSQL AutoIncrement support
Change-Id: I52fd1791de70cd10193bdab92ae9c2c4ffac8cad
---
M src/MySQL/MySQLFieldSqlBuilder.php
M src/MySQL/MySQLTableDefinitionReader.php
M src/SQLite/SQLiteFieldSqlBuilder.php
M src/SQLite/SQLiteTableDefinitionReader.php
M tests/integration/MediaWiki/Schema/TableCreateReadDeleteTest.php
M tests/phpunit/MySQL/MySQLFieldSqlBuilderTest.php
M tests/phpunit/MySQL/MySQLTableDefinitionReaderTest.php
7 files changed, 96 insertions(+), 31 deletions(-)
git pull
ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/WikibaseDatabase
refs/changes/28/89528/1
diff --git a/src/MySQL/MySQLFieldSqlBuilder.php
b/src/MySQL/MySQLFieldSqlBuilder.php
index 0e5a64b..ccf67fd 100644
--- a/src/MySQL/MySQLFieldSqlBuilder.php
+++ b/src/MySQL/MySQLFieldSqlBuilder.php
@@ -33,8 +33,9 @@
$sql .= $this->getNull( $field->allowsNull() );
+ $sql .= $this->getAutoInc( $field->hasAutoIncrement() );
+
// TODO: add all field stuff relevant here
- //TODO use field->autoIncrement and add to sql if needed
return $sql;
}
@@ -51,6 +52,13 @@
return $allowsNull ? ' NULL' : ' NOT NULL';
}
+ protected function getAutoInc( $isAutoInc ){
+ if( $isAutoInc ){
+ return ' AUTO_INCREMENT';
+ }
+ return '';
+ }
+
/**
* Returns the MySQL field type for a given FieldDefinition type
constant.
*
diff --git a/src/MySQL/MySQLTableDefinitionReader.php
b/src/MySQL/MySQLTableDefinitionReader.php
index 43e62c6..cf77899 100644
--- a/src/MySQL/MySQLTableDefinitionReader.php
+++ b/src/MySQL/MySQLTableDefinitionReader.php
@@ -46,7 +46,7 @@
}
/**
- * @param $tableName string
+ * @param string $tableName
* @return FieldDefinition[]
*/
private function getFields( $tableName ) {
@@ -59,7 +59,10 @@
$field->name,
$this->getDataType( $field->type ),
$this->getNullable( $field->cannull ),
- $field->defaultvalue );
+ $field->defaultvalue,
+ FieldDefinition::NO_ATTRIB, //todo READ
ATTRIBUTES
+ $this->getAutoInc( $field->extra )
+ );
}
return $fields;
@@ -77,7 +80,9 @@
'name' => 'COLUMN_NAME',
'cannull' => 'IS_NULLABLE',
'type' => 'DATA_TYPE',
- 'defaultvalue' => 'COLUMN_DEFAULT', ),
+ 'defaultvalue' => 'COLUMN_DEFAULT',
+ 'extra' => 'EXTRA'
+ ),
array( 'TABLE_NAME' => $tableName )
);
}
@@ -103,7 +108,7 @@
}
/**
- * @param $nullable string
+ * @param string $nullable
* @return bool
*/
private function getNullable( $nullable ) {
@@ -115,6 +120,17 @@
}
/**
+ * @param string $extra
+ * @return bool
+ */
+ private function getAutoInc( $extra ){
+ if( strstr( $extra, 'auto_increment' ) ){
+ return FieldDefinition::AUTOINCREMENT;
+ }
+ return FieldDefinition::NO_AUTOINCREMENT;
+ }
+
+ /**
* @param $tableName string
* @throws QueryInterfaceException
* @return IndexDefinition[]
diff --git a/src/SQLite/SQLiteFieldSqlBuilder.php
b/src/SQLite/SQLiteFieldSqlBuilder.php
index d67bd8c..aedb1b3 100644
--- a/src/SQLite/SQLiteFieldSqlBuilder.php
+++ b/src/SQLite/SQLiteFieldSqlBuilder.php
@@ -2,6 +2,7 @@
namespace Wikibase\Database\SQLite;
+use LogicException;
use RuntimeException;
use Wikibase\Database\Escaper;
use Wikibase\Database\Schema\Definitions\FieldDefinition;
@@ -33,7 +34,10 @@
$sql .= $this->getNull( $field->allowsNull() );
- //TODO use field->autoIncrement and add to sql if needed
+ //TODO implement AutoIncrement Stuff for SQLite
+ if( $field->hasAutoIncrement() ){
+ throw new LogicException( 'AutoIncrement support not
yet implemented' );
+ }
return $sql;
}
diff --git a/src/SQLite/SQLiteTableDefinitionReader.php
b/src/SQLite/SQLiteTableDefinitionReader.php
index a256f24..3856c67 100644
--- a/src/SQLite/SQLiteTableDefinitionReader.php
+++ b/src/SQLite/SQLiteTableDefinitionReader.php
@@ -60,6 +60,8 @@
}
$fields = array();
+ //todo read auto increment
+
foreach( $results as $result ){
/** $createParts, 1 => tableName, 2 => fieldParts
(fields, keys, etc.) */
preg_match( '/CREATE TABLE ([^ ]+) \(([^\)]+)\)/',
$result->sql, $createParts );
diff --git a/tests/integration/MediaWiki/Schema/TableCreateReadDeleteTest.php
b/tests/integration/MediaWiki/Schema/TableCreateReadDeleteTest.php
index dbcc34f..862fd34 100644
--- a/tests/integration/MediaWiki/Schema/TableCreateReadDeleteTest.php
+++ b/tests/integration/MediaWiki/Schema/TableCreateReadDeleteTest.php
@@ -28,12 +28,23 @@
$this->dropTablesIfStillThere();
}
+ /**
+ * Use the tableProvider that is uses for the test and drop any tables
that already exist!
+ * This is a cleanup operation to be run before the tests
+ */
protected function dropTablesIfStillThere() {
$tableBuilder = $this->newTableBuilder();
- foreach ( array( 'different_field_types',
'default_field_values', 'not_null_fields' ) as $tableName ) {
- if ( $tableBuilder->tableExists( $tableName ) ) {
- $tableBuilder->dropTable( $tableName );
+ $tabeProvider = $this->tableProvider();
+ foreach( $tabeProvider as $provider ){
+ /** @var TableDefinition $tableDefinition */
+ foreach( $provider as $tableDefinition ){
+
+ $tableName = $tableDefinition->getName();
+ if ( $tableBuilder->tableExists( $tableName ) )
{
+ $tableBuilder->dropTable( $tableName );
+ }
+
}
}
}
@@ -58,31 +69,43 @@
return new MediaWikiQueryInterface( $connectionProvider );
}
+ /**
+ * @return string 'sqlite' or 'mysql'
+ */
+ protected function getType(){
+ $connectionProvider = new LazyDBConnectionProvider( DB_MASTER );
+
+ return $connectionProvider->getConnection()->getType();
+ }
+
public function tableProvider() {
$tables = array();
$tables[] = new TableDefinition( 'different_field_types', array(
- new FieldDefinition( 'intfield',
FieldDefinition::TYPE_INTEGER ),
- new FieldDefinition( 'floatfield',
FieldDefinition::TYPE_FLOAT ),
- new FieldDefinition( 'textfield',
FieldDefinition::TYPE_TEXT ),
- new FieldDefinition( 'boolfield',
FieldDefinition::TYPE_BOOLEAN ),
- ) );
+ new FieldDefinition( 'intfield',
FieldDefinition::TYPE_INTEGER ),
+ new FieldDefinition( 'floatfield',
FieldDefinition::TYPE_FLOAT ),
+ new FieldDefinition( 'textfield',
FieldDefinition::TYPE_TEXT ),
+ new FieldDefinition( 'boolfield',
FieldDefinition::TYPE_BOOLEAN ),
+ )
+ );
- $tables[] = new TableDefinition( 'default_field_values', array(
- new FieldDefinition( 'intfield',
FieldDefinition::TYPE_INTEGER, FieldDefinition::NULL, 42 ),
- ) );
+ if( $this->getType() === 'mysql' ){ //TODO add support for
AutoInc cols in sqlite and remove this condition
+ $tables[] = new TableDefinition( 'autoinc_field', array(
+ new FieldDefinition( 'autoinc',
FieldDefinition::TYPE_INTEGER, FieldDefinition::NOT_NULL,
FieldDefinition::NO_DEFAULT, FieldDefinition::NO_ATTRIB,
FieldDefinition::AUTOINCREMENT ),
+ ),
+ array(
+ new IndexDefinition( 'PRIMARY', array(
'autoinc' => 0 ), IndexDefinition::TYPE_PRIMARY ),
+ )
+ );
+ }
$tables[] = new TableDefinition( 'not_null_fields', array(
- new FieldDefinition( 'intfield',
FieldDefinition::TYPE_INTEGER, FieldDefinition::NOT_NULL ),
- new FieldDefinition( 'textfield',
FieldDefinition::TYPE_TEXT, FieldDefinition::NOT_NULL ),
- ) );
+ new FieldDefinition( 'intfield',
FieldDefinition::TYPE_INTEGER, FieldDefinition::NOT_NULL, 42 ),
+ new FieldDefinition( 'textfield',
FieldDefinition::TYPE_TEXT, FieldDefinition::NOT_NULL ),
+ )
+ );
- $tables[] = new TableDefinition( 'not_null_fields', array(
- new FieldDefinition( 'intfield',
FieldDefinition::TYPE_INTEGER, FieldDefinition::NOT_NULL ),
- new FieldDefinition( 'textfield',
FieldDefinition::TYPE_TEXT, FieldDefinition::NULL ),
- ) );
-
- $tables[] = new TableDefinition( 'default_field_values', array(
+ $tables[] = new TableDefinition(
'default_field_values_and_indexes', array(
new FieldDefinition( 'textfield',
FieldDefinition::TYPE_TEXT, FieldDefinition::NOT_NULL ),
new FieldDefinition( 'intfield',
FieldDefinition::TYPE_INTEGER, FieldDefinition::NULL, 3 ),
new FieldDefinition( 'floatfield',
FieldDefinition::TYPE_FLOAT, FieldDefinition::NOT_NULL ),
diff --git a/tests/phpunit/MySQL/MySQLFieldSqlBuilderTest.php
b/tests/phpunit/MySQL/MySQLFieldSqlBuilderTest.php
index b3a2f90..86e2a69 100644
--- a/tests/phpunit/MySQL/MySQLFieldSqlBuilderTest.php
+++ b/tests/phpunit/MySQL/MySQLFieldSqlBuilderTest.php
@@ -50,6 +50,18 @@
$argLists[] = array(
new FieldDefinition(
'fieldName',
+ FieldDefinition::TYPE_INTEGER,
+ FieldDefinition::NULL,
+ FieldDefinition::NO_DEFAULT,
+ FieldDefinition::NO_ATTRIB,
+ FieldDefinition::AUTOINCREMENT
+ ),
+ 'fieldName INT NULL AUTO_INCREMENT'
+ );
+
+ $argLists[] = array(
+ new FieldDefinition(
+ 'fieldName',
FieldDefinition::TYPE_FLOAT,
FieldDefinition::NOT_NULL
),
diff --git a/tests/phpunit/MySQL/MySQLTableDefinitionReaderTest.php
b/tests/phpunit/MySQL/MySQLTableDefinitionReaderTest.php
index 14e4ea9..43a8ef6 100644
--- a/tests/phpunit/MySQL/MySQLTableDefinitionReaderTest.php
+++ b/tests/phpunit/MySQL/MySQLTableDefinitionReaderTest.php
@@ -62,11 +62,11 @@
$argLists[] = array(
array(
array(
- (object)array( 'name' =>
'primaryField', 'type' => 'INT', 'cannull' => 'NO', 'defaultvalue' => null ),
- (object)array( 'name' => 'textField',
'type' => 'BLOB', 'cannull' => 'YES', 'defaultvalue' => null ),
- (object)array( 'name' => 'intField',
'type' => 'INT', 'cannull' => 'NO', 'defaultvalue' => 42 ),
- (object)array( 'name' => 'boolField',
'type' => 'TINYINT', 'cannull' => 'YES', 'defaultvalue' => null ),
- (object)array( 'name' => 'floatField',
'type' => 'FLOAT', 'cannull' => 'YES', 'defaultvalue' => null ),
+ (object)array( 'name' =>
'primaryField', 'type' => 'INT', 'cannull' => 'NO', 'defaultvalue' => null,
'extra' => '' ),
+ (object)array( 'name' => 'textField',
'type' => 'BLOB', 'cannull' => 'YES', 'defaultvalue' => null, 'extra' => '' ),
+ (object)array( 'name' => 'intField',
'type' => 'INT', 'cannull' => 'NO', 'defaultvalue' => 42, 'extra' => '' ),
+ (object)array( 'name' => 'boolField',
'type' => 'TINYINT', 'cannull' => 'YES', 'defaultvalue' => null, 'extra' => ''
),
+ (object)array( 'name' => 'floatField',
'type' => 'FLOAT', 'cannull' => 'YES', 'defaultvalue' => null, 'extra' => '' ),
),
//TODO test UNIQUE and PRIMARY keys
array( null ),
--
To view, visit https://gerrit.wikimedia.org/r/89528
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I52fd1791de70cd10193bdab92ae9c2c4ffac8cad
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/WikibaseDatabase
Gerrit-Branch: master
Gerrit-Owner: Addshore <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits