public function type_to_sql($type, $options = array())
{
$natives = $this->native_database_types();
if (!array_key_exists($type, $natives)) {
$error = sprintf("Error: I dont know what column type of '%s' maps to for Postgres.", $type);
$error .= "\nYou provided: {$type}\n";
$error .= "Valid types are: \n";
$types = array_keys($natives);
foreach ($types as $t) {
if ($t == 'primary_key') {
continue;
}
$error .= "\t{$t}\n";
}
throw new Ruckusing_Exception($error, Ruckusing_Exception::INVALID_ARGUMENT);
}
$scale = null;
$precision = null;
$limit = null;
if (isset($options['precision'])) {
$precision = $options['precision'];
}
if (isset($options['scale'])) {
$scale = $options['scale'];
}
if (isset($options['limit'])) {
$limit = $options['limit'];
}
$native_type = $natives[$type];
if (is_array($native_type) && array_key_exists('name', $native_type)) {
$column_type_sql = $native_type['name'];
} else {
return $native_type;
}
if ($type == "decimal") {
//ignore limit, use precison and scale
if ($precision == null && array_key_exists('precision', $native_type)) {
$precision = $native_type['precision'];
}
if ($scale == null && array_key_exists('scale', $native_type)) {
$scale = $native_type['scale'];
}
if ($precision != null) {
if (is_int($scale)) {
$column_type_sql .= sprintf("(%d, %d)", $precision, $scale);
} else {
$column_type_sql .= sprintf("(%d)", $precision);
}
//scale
} else {
if ($scale) {
throw new Ruckusing_Exception("Error adding decimal column: precision cannot be empty if scale is specified", Ruckusing_Exception::INVALID_ARGUMENT);
}
}
//pre
}
// integer columns dont support limit (sizing)
if ($native_type['name'] != "integer") {
if ($limit == null && array_key_exists('limit', $native_type)) {
$limit = $native_type['limit'];
}
if ($limit) {
$column_type_sql .= sprintf("(%d)", $limit);
}
}
return $column_type_sql;
}