summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/Fragment.php4
-rw-r--r--src/Fragments/FieldDefFragment.php4
-rw-r--r--src/Fragments/OptionsFragment.php9
-rw-r--r--src/Statement.php25
-rw-r--r--src/Statements/CreateStatement.php31
-rw-r--r--tests/Builder/CreateStatementTest.php23
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()
);
}