}
}
-my ( %translate, %index_name );
+my ( %translate );
BEGIN {
memo => 'text',
);
}
-my %global_names;
my %truncated;
=pod
: join ('', @output);
}
-sub mk_name {
- my $basename = shift || '';
- my $type = shift || '';
- my $scope = shift || '';
- my $critical = shift || '';
- my $basename_orig = $basename;
-
- my $max_name = $type
- ? MAX_ID_LENGTH - (length($type) + 1)
- : MAX_ID_LENGTH;
- $basename = substr( $basename, 0, $max_name )
- if length( $basename ) > $max_name;
- my $name = $type ? "${type}_$basename" : $basename;
-
- if ( $basename ne $basename_orig and $critical ) {
- my $show_type = $type ? "+'$type'" : "";
- warn "Truncating '$basename_orig'$show_type to ", MAX_ID_LENGTH,
- " character limit to make '$name'\n" if $WARN;
- $truncated{ $basename_orig } = $name;
- }
+{
+ my %global_names;
+ sub mk_name {
+ my $basename = shift || '';
+ my $type = shift || '';
+ my $scope = shift || '';
+ my $critical = shift || '';
+ my $basename_orig = $basename;
+
+ my $max_name = $type
+ ? MAX_ID_LENGTH - (length($type) + 1)
+ : MAX_ID_LENGTH;
+ $basename = substr( $basename, 0, $max_name )
+ if length( $basename ) > $max_name;
+ my $name = $type ? "${type}_$basename" : $basename;
+
+ if ( $basename ne $basename_orig and $critical ) {
+ my $show_type = $type ? "+'$type'" : "";
+ warn "Truncating '$basename_orig'$show_type to ", MAX_ID_LENGTH,
+ " character limit to make '$name'\n" if $WARN;
+ $truncated{ $basename_orig } = $name;
+ }
- $scope ||= \%global_names;
- if ( my $prev = $scope->{ $name } ) {
- my $name_orig = $name;
- $name .= sprintf( "%02d", ++$prev );
- substr($name, MAX_ID_LENGTH - 3) = "00"
- if length( $name ) > MAX_ID_LENGTH;
+ $scope ||= \%global_names;
+ if ( my $prev = $scope->{ $name } ) {
+ my $name_orig = $name;
+ $name .= sprintf( "%02d", ++$prev );
+ substr($name, MAX_ID_LENGTH - 3) = "00"
+ if length( $name ) > MAX_ID_LENGTH;
- warn "The name '$name_orig' has been changed to ",
- "'$name' to make it unique.\n" if $WARN;
+ warn "The name '$name_orig' has been changed to ",
+ "'$name' to make it unique.\n" if $WARN;
- $scope->{ $name_orig }++;
- }
+ $scope->{ $name_orig }++;
+ }
- $scope->{ $name }++;
- return $name;
+ $scope->{ $name }++;
+ return $name;
+ }
}
sub is_geometry
return @constraints;
}
-sub create_index
{
- my ($index, $options) = @_;
+ my %index_name;
+ sub create_index
+ {
+ my ($index, $options) = @_;
- my $generator = _generator($options);
- my $table_name = $index->table->name;
-
- my ($index_def, @constraint_defs);
-
- my $name
- = $index->name
- || join('_', $table_name, 'idx', ++$index_name{ $table_name });
-
- my $type = $index->type || NORMAL;
- my @fields = $index->fields;
- return unless @fields;
-
- my $index_using;
- my $index_where;
- for my $opt ( $index->options ) {
- if ( ref $opt eq 'HASH' ) {
- foreach my $key (keys %$opt) {
- my $value = $opt->{$key};
- next unless defined $value;
- if ( uc($key) eq 'USING' ) {
- $index_using = "USING $value";
- }
- elsif ( uc($key) eq 'WHERE' ) {
- $index_where = "WHERE $value";
- }
+ my $generator = _generator($options);
+ my $table_name = $index->table->name;
+
+ my ($index_def, @constraint_defs);
+
+ my $name
+ = $index->name
+ || join('_', $table_name, 'idx', ++$index_name{ $table_name });
+
+ my $type = $index->type || NORMAL;
+ my @fields = $index->fields;
+ return unless @fields;
+
+ my $index_using;
+ my $index_where;
+ for my $opt ( $index->options ) {
+ if ( ref $opt eq 'HASH' ) {
+ foreach my $key (keys %$opt) {
+ my $value = $opt->{$key};
+ next unless defined $value;
+ if ( uc($key) eq 'USING' ) {
+ $index_using = "USING $value";
+ }
+ elsif ( uc($key) eq 'WHERE' ) {
+ $index_where = "WHERE $value";
+ }
+ }
+ }
}
- }
- }
- my $def_start = 'CONSTRAINT ' . $generator->quote($name) . ' ';
- my $field_names = '(' . join(", ", (map { $_ =~ /\(.*\)/ ? $_ : ( $generator->quote($_) ) } @fields)) . ')';
- if ( $type eq PRIMARY_KEY ) {
- push @constraint_defs, "${def_start}PRIMARY KEY ".$field_names;
- }
- elsif ( $type eq UNIQUE ) {
- push @constraint_defs, "${def_start}UNIQUE " .$field_names;
- }
- elsif ( $type eq NORMAL ) {
- $index_def =
- 'CREATE INDEX ' . $generator->quote($name) . ' on ' . $generator->quote($table_name) . ' ' .
- join ' ', grep { defined } $index_using, $field_names, $index_where;
- }
- else {
- warn "Unknown index type ($type) on table $table_name.\n"
- if $WARN;
- }
+ my $def_start = 'CONSTRAINT ' . $generator->quote($name) . ' ';
+ my $field_names = '(' . join(", ", (map { $_ =~ /\(.*\)/ ? $_ : ( $generator->quote($_) ) } @fields)) . ')';
+ if ( $type eq PRIMARY_KEY ) {
+ push @constraint_defs, "${def_start}PRIMARY KEY ".$field_names;
+ }
+ elsif ( $type eq UNIQUE ) {
+ push @constraint_defs, "${def_start}UNIQUE " .$field_names;
+ }
+ elsif ( $type eq NORMAL ) {
+ $index_def =
+ 'CREATE INDEX ' . $generator->quote($name) . ' on ' . $generator->quote($table_name) . ' ' .
+ join ' ', grep { defined } $index_using, $field_names, $index_where;
+ }
+ else {
+ warn "Unknown index type ($type) on table $table_name.\n"
+ if $WARN;
+ }
- return $index_def, \@constraint_defs;
+ return $index_def, \@constraint_defs;
+ }
}
sub create_constraint
sub alter_field
{
- my ($from_field, $to_field) = @_;
+ my ($from_field, $to_field, $options) = @_;
die "Can't alter field in another table"
if($from_field->table->name ne $to_field->table->name);
+ my $generator = _generator($options);
my @out;
# drop geometry column and constraints
# BUT: drop geometry is done before the rename, cause it work's on the
# $from_field directly
push @out, sprintf('ALTER TABLE %s RENAME COLUMN %s TO %s',
- $to_field->table->name,
- $from_field->name,
- $to_field->name) if($from_field->name ne $to_field->name);
+ map($generator->quote($_),
+ $to_field->table->name,
+ $from_field->name,
+ $to_field->name,
+ ),
+ )
+ if($from_field->name ne $to_field->name);
push @out, sprintf('ALTER TABLE %s ALTER COLUMN %s SET NOT NULL',
- $to_field->table->name,
- $to_field->name) if(!$to_field->is_nullable and
- $from_field->is_nullable);
+ map($generator->quote($_),
+ $to_field->table->name,
+ $to_field->name
+ ),
+ )
+ if(!$to_field->is_nullable and $from_field->is_nullable);
push @out, sprintf('ALTER TABLE %s ALTER COLUMN %s DROP NOT NULL',
- $to_field->table->name,
- $to_field->name)
- if ( !$from_field->is_nullable and $to_field->is_nullable );
+ map($generator->quote($_),
+ $to_field->table->name,
+ $to_field->name
+ ),
+ )
+ if (!$from_field->is_nullable and $to_field->is_nullable);
my $from_dt = convert_datatype($from_field);
my $to_dt = convert_datatype($to_field);
push @out, sprintf('ALTER TABLE %s ALTER COLUMN %s TYPE %s',
- $to_field->table->name,
- $to_field->name,
- $to_dt) if($to_dt ne $from_dt);
+ map($generator->quote($_),
+ $to_field->table->name,
+ $to_field->name
+ ),
+ $to_dt,
+ )
+ if($to_dt ne $from_dt);
my $old_default = $from_field->default_value;
my $new_default = $to_field->default_value;
}
push @out, sprintf('ALTER TABLE %s ALTER COLUMN %s SET DEFAULT %s',
- $to_field->table->name,
- $to_field->name,
- $default_value)
+ map($generator->quote($_),
+ $to_field->table->name,
+ $to_field->name,
+ ),
+ $default_value,
+ )
if ( defined $new_default &&
(!defined $old_default || $old_default ne $new_default) );
# would result in no change
push @out, sprintf('ALTER TABLE %s ALTER COLUMN %s DROP DEFAULT',
- $to_field->table->name,
- $to_field->name)
+ map($generator->quote($_),
+ $to_field->table->name,
+ $to_field->name,
+ ),
+ )
if ( !defined $new_default && defined $old_default );
# add geometry column and constraints
sub add_field
{
- my ($new_field) = @_;
+ my ($new_field,$options) = @_;
my $out = sprintf('ALTER TABLE %s ADD COLUMN %s',
- $new_field->table->name,
- create_field($new_field));
+ _generator($options)->quote($new_field->table->name),
+ create_field($new_field, $options));
$out .= "\n".add_geometry_column($new_field) if is_geometry($new_field);
$out .= "\n".add_geometry_constraints($new_field) if is_geometry($new_field);
return $out;
sub alter_drop_index {
my ($index, $options) = @_;
- my $index_name = $index->name;
- return "DROP INDEX $index_name";
+ return 'DROP INDEX '. _generator($options)->quote($index->name);
}
sub alter_drop_constraint {
# table as prefix and fkey or pkey as suffix, concatenated by an underscore
my $c_name;
if( $c->name ) {
- # Already has a name, just quote it
- $c_name = $generator->quote($c->name);
+ # Already has a name, just use it
+ $c_name = $c->name;
} elsif ( $c->type eq FOREIGN_KEY ) {
# Doesn't have a name, and is foreign key, append '_fkey'
- $c_name = $generator->quote($c->table->name . '_' .
- ($c->fields)[0] . '_fkey');
+ $c_name = $c->table->name . '_' . ($c->fields)[0] . '_fkey';
} elsif ( $c->type eq PRIMARY_KEY ) {
# Doesn't have a name, and is primary key, append '_pkey'
- $c_name = $generator->quote($c->table->name . '_pkey');
+ $c_name = $c->table->name . '_pkey';
}
return sprintf(
'ALTER TABLE %s DROP CONSTRAINT %s',
- $generator->quote($c->table->name), $c_name
+ map { $generator->quote($_) } $c->table->name, $c_name,
);
}