public function testEncode() { $db = $this->getDb(); $adapter = new PostgresqlTypeAdapter($db); $this->assertSame('NULL', $adapter->encode(DataType::integer(), null)); $this->assertSame(15, $adapter->encode(DataType::integer(), '15')); $this->assertSame(33.0, $adapter->encode(DataType::float(), 33)); $this->assertSame('TRUE', $adapter->encode(DataType::boolean(), true)); $this->assertSame('FALSE', $adapter->encode(DataType::boolean(), false)); $this->assertRegExp('/^"\\d{4}-\\d{2}-\\d{2}"$/', $adapter->encode(DataType::date(), time())); $this->assertRegExp('/^"\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}"$/', $adapter->encode(DataType::dateTime(), time())); $this->assertSame('"foo bar baz"', $adapter->encode(DataType::string(), 'foo bar baz')); $this->assertSame('"[]"', $adapter->encode(DataType::object(), [])); }
public function testDecode() { $db = $this->getDb(); $adapter = new SqliteTypeAdapter($db); $this->assertNull($adapter->decode(DataType::integer(), null)); $this->assertSame(15, $adapter->decode(DataType::integer(), '15')); $this->assertSame(33.0, $adapter->decode(DataType::float(), 33)); $this->assertSame(true, $adapter->decode(DataType::boolean(), 1)); $this->assertSame(false, $adapter->decode(DataType::boolean(), 0)); $this->assertSame(4242, $adapter->decode(DataType::date(), 4242)); $this->assertSame(4242, $adapter->decode(DataType::dateTime(), 4242)); $this->assertSame('foo bar baz', $adapter->decode(DataType::string(), 'foo bar baz')); $this->assertSame([], $adapter->decode(DataType::object(), '[]')); }
/** * Convert output of SHOW COLUMN to DataType. * * @param array $row * Row result. * @throws TypeException If type unsupported. * @return DataType The type. */ private function toDataType($row) { $null = (isset($row['Null']) and $row['Null'] != 'NO'); $default = null; if (isset($row['Default'])) { $default = $row['Default']; } if (preg_match('/enum\\((.+)\\)/i', $row['Type'], $matches) === 1) { preg_match_all('/\'([^\']+)\'/', $matches[1], $matches); $values = $matches[1]; return DataType::enum($values, $null, $default); } preg_match('/ *([^ (]+) *(\\(([0-9]+)\\))? *(unsigned)? *?/i', $row['Type'], $matches); $actualType = strtolower($matches[1]); $length = isset($matches[3]) ? intval($matches[3]) : 0; $intFlags = 0; if (isset($matches[4])) { $intFlags |= DataType::UNSIGNED; } if (strpos($row['Extra'], 'auto_increment') !== false) { $intFlags |= DataType::SERIAL; } switch ($actualType) { case 'bigint': $intFlags |= DataType::BIG; return DataType::integer($intFlags, $null, isset($default) ? intval($default) : null); case 'smallint': $intFlags |= DataType::SMALL; return DataType::integer($intFlags, $null, isset($default) ? intval($default) : null); case 'tinyint': $intFlags |= DataType::TINY; return DataType::integer($intFlags, $null, isset($default) ? intval($default) : null); case 'int': return DataType::integer($intFlags, $null, isset($default) ? intval($default) : null); case 'double': return DataType::float($null, isset($default) ? floatval($default) : null); case 'varchar': return DataType::string($length, $null, $default); case 'blob': return DataType::binary($null, $default); case 'date': return DataType::date($null, isset($default) ? strtotime($default . ' UTC') : null); case 'datetime': return DataType::dateTime($null, isset($default) ? strtotime($default . ' UTC') : null); case 'text': return DataType::text($null, $default); } throw new TypeException('Unsupported MySQL type for column: ' . $row['Field']); }
/** * Convert output of SHOW COLUMN to DataType. * * @param array $row * Row result. * @throws TypeException If type unsupported. * @return DataType The type. */ private function toDataType($row) { $null = $row['is_nullable'] != 'NO'; $default = null; if (isset($row['column_default'])) { $default = $row['column_default']; } $type = $row['data_type']; if (strpos($type, 'int') !== false) { $intFlags = 0; if (preg_match('/^nextval\\(/', $default) === 1) { $intFlags = DataType::SERIAL; $default = null; } elseif (isset($default)) { $default = intval($default); } if (strpos($type, 'bigint') !== false) { return DataType::integer($intFlags | DataType::BIG, $null, $default); } if (strpos($type, 'smallint') !== false) { return DataType::integer($intFlags | DataType::SMALL, $null, $default); } return DataType::integer($intFlags, $null, $default); } if (strpos($type, 'double') !== false) { return DataType::float($null, isset($default) ? floatval($default) : null); } if (strpos($type, 'bool') !== false) { return DataType::boolean($null, isset($default) ? boolval($default) : null); } if (preg_match("/^'(.*)'::[a-z ]+\$/", $default, $matches) === 1) { $default = $matches[1]; } else { $default = null; } if (strpos($type, 'character') !== false) { $length = intval($row['character_maximum_length']); return DataType::string($length, $null, $default); } if (strpos($type, 'date') !== false) { return DataType::date($null, isset($default) ? strtotime($default . ' UTC') : null); } if (strpos($type, 'timestamp') !== false) { return DataType::dateTime($null, isset($default) ? strtotime($default . ' UTC') : null); } if (strpos($type, 'text') !== false) { return DataType::text($null, $default); } throw new TypeException('Unsupported PostgreSQL type "' . $row['data_type'] . '" for column: ' . $row['column_name']); }