diff options
-rw-r--r-- | src/Fragment.php | 4 | ||||
-rw-r--r-- | src/Fragments/FieldDefFragment.php | 4 | ||||
-rw-r--r-- | src/Fragments/OptionsFragment.php | 9 | ||||
-rw-r--r-- | src/Statement.php | 25 | ||||
-rw-r--r-- | src/Statements/CreateStatement.php | 31 | ||||
-rw-r--r-- | tests/Builder/CreateStatementTest.php | 23 |
6 files changed, 84 insertions, 12 deletions
diff --git a/src/Fragment.php b/src/Fragment.php index 29ec8a9..d9c4c8f 100644 --- a/src/Fragment.php +++ b/src/Fragment.php @@ -35,6 +35,8 @@ abstract class Fragment */ public static function parse(Parser $parser, TokensList $list, array $options = array()) { + // This method should be abstract, but it can't be both static and + // abstract. return null; } @@ -50,6 +52,8 @@ abstract class Fragment */ public static function build($fragment) { + // This method should be abstract, but it can't be both static and + // abstract. return null; } } diff --git a/src/Fragments/FieldDefFragment.php b/src/Fragments/FieldDefFragment.php index 947a881..34932d5 100644 --- a/src/Fragments/FieldDefFragment.php +++ b/src/Fragments/FieldDefFragment.php @@ -231,6 +231,7 @@ class FieldDefFragment extends Fragment public static function build($fragment) { $ret = array(); + foreach ($fragment as $f) { $tmp = ''; @@ -258,6 +259,7 @@ class FieldDefFragment extends Fragment $ret[] = trim($tmp); } - return '(' . implode(', ', $ret) . ')'; + + return "(\n" . implode(",\n", $ret) . "\n)"; } } diff --git a/src/Fragments/OptionsFragment.php b/src/Fragments/OptionsFragment.php index 5384a77..b9a37d3 100644 --- a/src/Fragments/OptionsFragment.php +++ b/src/Fragments/OptionsFragment.php @@ -65,6 +65,11 @@ class OptionsFragment extends Fragment * @var array $lastOption */ $lastOption = null; + + /** + * The index of the option that was processed last time. + * @var int $lastOptionId + */ $lastOptionId = 0; $brackets = 0; @@ -87,8 +92,8 @@ class OptionsFragment extends Fragment } if ($lastOption === null) { - if (isset($options[strtoupper($token->value)])) { - $lastOption = $options[strtoupper($token->value)]; + if (isset($options[strtoupper($token->token)])) { + $lastOption = $options[strtoupper($token->token)]; $lastOptionId = is_array($lastOption) ? $lastOption[0] : $lastOption; // Checking for option conflicts. diff --git a/src/Statement.php b/src/Statement.php index 16b1819..11676be 100644 --- a/src/Statement.php +++ b/src/Statement.php @@ -6,7 +6,7 @@ * * A statement represents the result of parsing the lexemes. * - * @package SqlParser. + * @package SqlParser */ namespace SqlParser; @@ -24,6 +24,27 @@ abstract class Statement { /** + * Options for this statement. + * + * The option would be the key and the value can be an integer or an array. + * + * The integer represents only the index used. + * + * The array may have two keys: `0` is used to represent the index used and + * `1` is the type of the option (which may be 'var' or 'var='). Both + * options mean they expect a value after the option (e.g. `A = B` or `A B`, + * in which case `A` is the key and `B` is the value). The only difference + * is in the building process. `var` options are built as `A B` and `var=` + * options are built as `A = B` + * + * Two options that can be used together must have different values for + * indexes, else, when they will be used together, an error will occur. + * + * @var array + */ + public static $OPTIONS = array(); + + /** * The clauses of this statement, in order. * * The value attributed to each clause is used by the builder and it may @@ -157,7 +178,7 @@ abstract class Statement * default. * @var bool $parsedOptions */ - $parsedOptions = isset(static::$OPTIONS) ? false : true; + $parsedOptions = !empty(static::$OPTIONS) ? false : true; for (; $list->idx < $list->count; ++$list->idx) { /** diff --git a/src/Statements/CreateStatement.php b/src/Statements/CreateStatement.php index ede120e..55aad0a 100644 --- a/src/Statements/CreateStatement.php +++ b/src/Statements/CreateStatement.php @@ -65,6 +65,20 @@ class CreateStatement extends Statement ); /** + * All database options. + * + * @var array + */ + public static $DB_OPTIONS = array( + 'CHARACTER SET' => array(1, 'var='), + 'CHARSET' => array(1, 'var='), + 'DEFAULT CHARACTER SET' => array(1, 'var='), + 'DEFAULT CHARSET' => array(1, 'var='), + 'DEFAULT COLLATE' => array(2, 'var='), + 'COLLATE' => array(2, 'var='), + ); + + /** * All table options. * * @var array @@ -78,7 +92,7 @@ class CreateStatement extends Statement 'DEFAULT CHARACTER SET' => array(4, 'var='), 'DEFAULT CHARSET' => array(4, 'var='), 'CHECKSUM' => array(5, 'var'), - 'DEFAULT COLLATE' => array(5, 'var='), + 'DEFAULT COLLATE' => array(6, 'var='), 'COLLATE' => array(6, 'var='), 'COMMENT' => array(7, 'var='), 'CONNECTION' => array(8, 'var'), @@ -201,7 +215,12 @@ class CreateStatement extends Statement */ public function build() { - if ($this->options->has('TABLE')) { + if ($this->options->has('DATABASE')) { + return 'CREATE ' + . OptionsFragment::build($this->options) . ' ' + . FieldFragment::build($this->name) . ' ' + . OptionsFragment::build($this->entityOptions); + } elseif ($this->options->has('TABLE')) { return 'CREATE ' . OptionsFragment::build($this->options) . ' ' . FieldFragment::build($this->name) . ' ' @@ -266,7 +285,13 @@ class CreateStatement extends Statement ); ++$list->idx; // Skipping field. - if ($this->options->has('TABLE')) { + if ($this->options->has('DATABASE')) { + $this->entityOptions = OptionsFragment::parse( + $parser, + $list, + static::$DB_OPTIONS + ); + } elseif ($this->options->has('TABLE')) { $this->fields = FieldDefFragment::parse($parser, $list); ++$list->idx; diff --git a/tests/Builder/CreateStatementTest.php b/tests/Builder/CreateStatementTest.php index 408b7fb..575f587 100644 --- a/tests/Builder/CreateStatementTest.php +++ b/tests/Builder/CreateStatementTest.php @@ -22,6 +22,21 @@ class CreateStatementTest extends TestCase $this->assertEquals('', $stmt->build()); } + public function testBuilderDatabase() + { + $parser = new Parser( + 'CREATE DATABASE `mydb` ' . + 'DEFAULT CHARACTER SET = utf8 DEFAULT COLLATE = utf8_general_ci' + ); + $stmt = $parser->statements[0]; + + $this->assertEquals( + 'CREATE DATABASE `mydb` ' . + 'DEFAULT CHARACTER SET=utf8 DEFAULT COLLATE=utf8_general_ci', + $stmt->build() + ); + } + public function testBuilderTable() { $stmt = new CreateStatement(); @@ -42,10 +57,10 @@ class CreateStatementTest extends TestCase ); $this->assertEquals( - 'CREATE TABLE `test` (' . - '`id` INT (11) UNSIGNED NOT NULL AUTO_INCREMENT, ' . - 'PRIMARY KEY (`id`)' . - ') ', + "CREATE TABLE `test` (\n" . + "`id` INT (11) UNSIGNED NOT NULL AUTO_INCREMENT,\n" . + "PRIMARY KEY (`id`)\n" . + ") ", $stmt->build() ); } |