Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions src/xPDO/Om/mysql/xPDOManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -416,8 +416,18 @@ protected function getColumnDef($class, $name, $meta, array $options = array())
$notNull= !isset ($meta['null']) ? false : ($meta['null'] === 'false' || empty($meta['null']));
$null= $notNull ? ' NOT NULL' : ' NULL';
$extra= '';
if (isset($meta['index']) && $meta['index'] == 'pk' && !is_array($pk) && $pktype == 'integer' && isset ($meta['generated']) && $meta['generated'] == 'native') {
$extra= ' AUTO_INCREMENT';
$isGeneratedPkField = isset($meta['index']) && $meta['index'] == 'pk'
&& isset($meta['generated']) && $meta['generated'] == 'native';
if ($isGeneratedPkField && ($meta['phptype'] ?? '') === 'integer') {
if (!is_array($pk)) {
$extra = ' AUTO_INCREMENT';
} else {
$primaryColumns = $this->xpdo->getIndexMeta($class)['PRIMARY']['columns'] ?? [];
reset($primaryColumns);
if (key($primaryColumns) === $name) {
$extra = ' AUTO_INCREMENT';
}
}
}
if (empty ($extra) && isset ($meta['extra'])) {
$extra= ' ' . $meta['extra'];
Expand Down
18 changes: 16 additions & 2 deletions src/xPDO/Om/xPDOObject.php
Original file line number Diff line number Diff line change
Expand Up @@ -1470,15 +1470,29 @@ public function save($cacheFlag= null) {
if ($result) {
if ($pkn && !$pk) {
if ($pkGenerated) {
$this->_fields[$this->getPK()]= $this->getGeneratedKey();
if (is_array($pkn)) {
$generatedKey = $this->getGeneratedKey();
foreach ($pkn as $pkField => $v) {
if (isset($this->_fieldMeta[$pkField]['generated'])
&& $this->_fieldMeta[$pkField]['generated'] === 'native') {
$this->_fields[$pkField] = $generatedKey;
break;
}
}
} else {
$this->_fields[$this->getPK()] = $this->getGeneratedKey();
}
}
$pk= $this->getPrimaryKey();
$pk = $this->getPrimaryKey();
}
if ($pk || !$this->getPK()) {
$this->_dirty= array();
$this->_validated= array();
$this->_new= false;
}
if (!$pk && $pkGenerated) {
$this->xpdo->log(xPDO::LOG_LEVEL_WARN, "Could not retrieve generated key for class {$this->_class}.", '', __METHOD__, __FILE__, __LINE__);
}
$callback = $this->getOption(xPDO::OPT_CALLBACK_ON_SAVE);
if ($callback && is_callable($callback)) {
call_user_func($callback, array('className' => $this->_class, 'criteria' => $criteria, 'object' => $this));
Expand Down
10 changes: 10 additions & 0 deletions test/model/schema/xPDO.Test.Sample.mysql.schema.xml
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,16 @@
<column key="color" length="" collation="A" null="false" />
</index>
</object>
<object class="NumberSeq" table="number_seq" extends="xPDO\Om\xPDOObject">
<field key="level" dbtype="varchar" precision="1" phptype="string" null="false" index="pk" />
<field key="number" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" index="pk" generated="native" />

<!-- MySQL: AUTO_INCREMENT column must be first in composite PK -->
<index alias="PRIMARY" name="PRIMARY" primary="true" unique="true" type="BTREE">
<column key="number" collation="A" null="false" />
<column key="level" collation="A" null="false" />
</index>
</object>
<object class="SecureObject" extends="xPDO\Om\xPDOSimpleObject" />
<object class="SecureItem" table="secure_items" extends="xPDO\Test\Sample\SecureObject">
<field key="name" dbtype="varchar" precision="255" phptype="string" null="false" />
Expand Down
1 change: 0 additions & 1 deletion test/model/schema/xPDO.Test.Sample.pgsql.schema.xml
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,6 @@
<column key="color" length="" collation="A" null="false" />
</index>
</object>

<object class="SecureObject" extends="xPDO\Om\xPDOSimpleObject" />
<object class="SecureItem" table="secure_items" extends="xPDO\Test\Sample\SecureObject">
<field key="name" dbtype="varchar" precision="255" phptype="string" null="false" />
Expand Down
14 changes: 14 additions & 0 deletions test/model/xPDO/Test/Sample/NumberSeq.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php
namespace xPDO\Test\Sample;

use xPDO\xPDO;

/**
* Class NumberSeq
*
*
* @package xPDO\Test\Sample
*/
class NumberSeq extends \xPDO\Om\xPDOObject
{
}
9 changes: 5 additions & 4 deletions test/model/xPDO/Test/Sample/metadata.mysql.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,23 @@
'version' => '3.0',
'namespace' => 'xPDO\\Test\\Sample',
'namespacePrefix' => '',
'class_map' =>
'class_map' =>
array (
'xPDO\\Om\\xPDOSimpleObject' =>
'xPDO\\Om\\xPDOSimpleObject' =>
array (
0 => 'xPDO\\Test\\Sample\\Person',
1 => 'xPDO\\Test\\Sample\\Phone',
2 => 'xPDO\\Test\\Sample\\xPDOSample',
3 => 'xPDO\\Test\\Sample\\Item',
4 => 'xPDO\\Test\\Sample\\SecureObject',
),
'xPDO\\Om\\xPDOObject' =>
'xPDO\\Om\\xPDOObject' =>
array (
0 => 'xPDO\\Test\\Sample\\PersonPhone',
1 => 'xPDO\\Test\\Sample\\BloodType',
2 => 'xPDO\\Test\\Sample\\NumberSeq',
),
'xPDO\\Test\\Sample\\SecureObject' =>
'xPDO\\Test\\Sample\\SecureObject' =>
array (
0 => 'xPDO\\Test\\Sample\\SecureItem',
),
Expand Down
8 changes: 4 additions & 4 deletions test/model/xPDO/Test/Sample/metadata.pgsql.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,22 @@
'version' => '3.0',
'namespace' => 'xPDO\\Test\\Sample',
'namespacePrefix' => '',
'class_map' =>
'class_map' =>
array (
'xPDO\\Om\\xPDOSimpleObject' =>
'xPDO\\Om\\xPDOSimpleObject' =>
array (
0 => 'xPDO\\Test\\Sample\\Person',
1 => 'xPDO\\Test\\Sample\\Phone',
2 => 'xPDO\\Test\\Sample\\xPDOSample',
3 => 'xPDO\\Test\\Sample\\Item',
4 => 'xPDO\\Test\\Sample\\SecureObject',
),
'xPDO\\Om\\xPDOObject' =>
'xPDO\\Om\\xPDOObject' =>
array (
0 => 'xPDO\\Test\\Sample\\PersonPhone',
1 => 'xPDO\\Test\\Sample\\BloodType',
),
'xPDO\\Test\\Sample\\SecureObject' =>
'xPDO\\Test\\Sample\\SecureObject' =>
array (
0 => 'xPDO\\Test\\Sample\\SecureItem',
),
Expand Down
8 changes: 4 additions & 4 deletions test/model/xPDO/Test/Sample/metadata.sqlite.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,22 @@
'version' => '3.0',
'namespace' => 'xPDO\\Test\\Sample',
'namespacePrefix' => '',
'class_map' =>
'class_map' =>
array (
'xPDO\\Om\\xPDOSimpleObject' =>
'xPDO\\Om\\xPDOSimpleObject' =>
array (
0 => 'xPDO\\Test\\Sample\\Person',
1 => 'xPDO\\Test\\Sample\\Phone',
2 => 'xPDO\\Test\\Sample\\xPDOSample',
3 => 'xPDO\\Test\\Sample\\Item',
4 => 'xPDO\\Test\\Sample\\SecureObject',
),
'xPDO\\Om\\xPDOObject' =>
'xPDO\\Om\\xPDOObject' =>
array (
0 => 'xPDO\\Test\\Sample\\PersonPhone',
1 => 'xPDO\\Test\\Sample\\BloodType',
),
'xPDO\\Test\\Sample\\SecureObject' =>
'xPDO\\Test\\Sample\\SecureObject' =>
array (
0 => 'xPDO\\Test\\Sample\\SecureItem',
),
Expand Down
65 changes: 65 additions & 0 deletions test/model/xPDO/Test/Sample/mysql/NumberSeq.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
<?php
namespace xPDO\Test\Sample\mysql;

use xPDO\xPDO;

class NumberSeq extends \xPDO\Test\Sample\NumberSeq
{

public static $metaMap = array (
'package' => 'xPDO\\Test\\Sample',
'version' => '3.0',
'table' => 'number_seq',
'extends' => 'xPDO\\Om\\xPDOObject',
'fields' =>
array (
'level' => NULL,
'number' => NULL,
),
'fieldMeta' =>
array (
'level' =>
array (
'dbtype' => 'varchar',
'precision' => '1',
'phptype' => 'string',
'null' => false,
'index' => 'pk',
),
'number' =>
array (
'dbtype' => 'int',
'precision' => '10',
'attributes' => 'unsigned',
'phptype' => 'integer',
'null' => false,
'index' => 'pk',
'generated' => 'native',
),
),
'indexes' =>
array (
'PRIMARY' =>
array (
'alias' => 'PRIMARY',
'primary' => true,
'unique' => true,
'type' => 'BTREE',
'columns' =>
array (
'number' =>
array (
'collation' => 'A',
'null' => false,
),
'level' =>
array (
'collation' => 'A',
'null' => false,
),
),
),
),
);

}
62 changes: 62 additions & 0 deletions test/model/xPDO/Test/Sample/pgsql/NumberSeq.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<?php
namespace xPDO\Test\Sample\pgsql;

use xPDO\xPDO;

class NumberSeq extends \xPDO\Test\Sample\NumberSeq
{

public static $metaMap = array (
'package' => 'xPDO\\Test\\Sample',
'version' => '3.0',
'table' => 'number_seq',
'extends' => 'xPDO\\Om\\xPDOObject',
'fields' =>
array (
'level' => NULL,
'number' => NULL,
),
'fieldMeta' =>
array (
'level' =>
array (
'dbtype' => 'varchar',
'precision' => '1',
'phptype' => 'string',
'null' => false,
'index' => 'pk',
),
'number' =>
array (
'dbtype' => 'integer',
'phptype' => 'integer',
'null' => false,
'index' => 'pk',
),
),
'indexes' =>
array (
'PRIMARY' =>
array (
'alias' => 'PRIMARY',
'primary' => true,
'unique' => true,
'type' => 'BTREE',
'columns' =>
array (
'level' =>
array (
'collation' => 'A',
'null' => false,
),
'number' =>
array (
'collation' => 'A',
'null' => false,
),
),
),
),
);

}
62 changes: 62 additions & 0 deletions test/model/xPDO/Test/Sample/sqlite/NumberSeq.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<?php
namespace xPDO\Test\Sample\sqlite;

use xPDO\xPDO;

class NumberSeq extends \xPDO\Test\Sample\NumberSeq
{

public static $metaMap = array (
'package' => 'xPDO\\Test\\Sample',
'version' => '3.0',
'table' => 'number_seq',
'extends' => 'xPDO\\Om\\xPDOObject',
'fields' =>
array (
'level' => NULL,
'number' => NULL,
),
'fieldMeta' =>
array (
'level' =>
array (
'dbtype' => 'varchar',
'precision' => '1',
'phptype' => 'string',
'null' => false,
'index' => 'pk',
),
'number' =>
array (
'dbtype' => 'int',
'precision' => '10',
'phptype' => 'integer',
'null' => false,
'index' => 'pk',
),
),
'indexes' =>
array (
'PRIMARY' =>
array (
'alias' => 'PRIMARY',
'primary' => true,
'unique' => true,
'columns' =>
array (
'level' =>
array (
'collation' => 'A',
'null' => false,
),
'number' =>
array (
'collation' => 'A',
'null' => false,
),
),
),
),
);

}
Loading
Loading