/
MapType.php
117 lines (103 loc) · 3.72 KB
/
MapType.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
<?php
/**
* Licensed to CRATE Technology GmbH("Crate") under one or more contributor
* license agreements. See the NOTICE file distributed with this work for
* additional information regarding copyright ownership. Crate licenses
* this file to you under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. You may
* obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
* However, if you have executed another commercial license agreement
* with Crate these terms will supersede the license and you may use the
* software solely pursuant to the terms of the relevant commercial agreement.
*/
namespace Crate\DBAL\Types;
use Crate\DBAL\Platforms\CratePlatform;
use Crate\PDO\PDO;
use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;
/**
* Type that maps a PHP associative array (map) to an object SQL type.
*
* TODO: Add support for strict|dynamic|ignored object types
*
*/
class MapType extends Type
{
const NAME = 'map';
const STRICT = 'strict';
const DYNAMIC = 'dynamic';
const IGNORED = 'ignored';
/**
* Gets the name of this type.
*
* @return string
*/
public function getName()
{
return self::NAME;
}
/**
* Gets the (preferred) binding type for values of this type that
* can be used when binding parameters to prepared statements.
*
* @return integer
*/
public function getBindingType()
{
return PDO::PARAM_OBJECT;
}
public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
if (!is_array($value) || (count($value) > 0 && !(array_keys($value) !== range(0, count($value) - 1)))) {
return null;
}
return $value;
}
public function convertToPHPValue($value, AbstractPlatform $platform)
{
return $value == null ?: (array) $value;
}
/**
* Gets the SQL declaration snippet for a field of this type.
*
* @param array $fieldDeclaration The field declaration.
* @param AbstractPlatform $platform The currently used database platform.
* @return string
* @throws \Doctrine\DBAL\DBALException
*/
public function getSQLDeclaration(array $fieldDeclaration, AbstractPlatform $platform)
{
$options = !array_key_exists('platformOptions', $fieldDeclaration) ?
array() : $fieldDeclaration['platformOptions'];
return $this->getMapTypeDeclarationSQL($platform, $fieldDeclaration, $options);
}
/**
* Gets the SQL snippet used to declare an OBJECT column type.
*
* @param array $field
*
* @return string
* @throws \Doctrine\DBAL\DBALException
*/
public function getMapTypeDeclarationSQL(AbstractPlatform $platform, array $field, array $options)
{
$type = array_key_exists('type', $options) ? $options['type'] : MapType::DYNAMIC;
$fields = array_key_exists('fields', $options) ? $options['fields'] : array();
$columns = array();
foreach ($fields as $field) {
$columns[$field->getQuotedName($platform)] = CratePlatform::prepareColumnData($platform, $field);
}
$objectFields = $platform->getColumnDeclarationListSQL($columns);
$declaration = count($columns) > 0 ? ' AS ( ' . $objectFields . ' )' : '';
return 'OBJECT ( ' . $type . ' )' . $declaration ;
}
}