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

Reply via email to