Mercurial > pub > Impl
changeset 270:3f59fd828d5f
merge
author | cin |
---|---|
date | Fri, 25 Jan 2013 00:25:02 +0400 |
parents | 4abda21186cd (current diff) dacfe7c0311a (diff) |
children | 56364d0c4b4f |
files | |
diffstat | 4 files changed, 179 insertions(+), 79 deletions(-) [+] |
line wrap: on
line diff
--- a/Lib/IMPL/SQL/Schema/Table.pm Mon Jan 21 02:08:17 2013 +0400 +++ b/Lib/IMPL/SQL/Schema/Table.pm Fri Jan 25 00:25:02 2013 +0400 @@ -115,12 +115,47 @@ return $this->{$columns}[$index]; } -sub ColumnsCount { - my ($this) = @_; +sub SetColumnPosition { + my ($this,$nameOrColumn,$pos) = @_; + + my $colName; + if (is($nameOrColumn,'IMPL::SQL::Schema::Column')) { + $colName = $nameOrColumn->name; + } elsif (not ref $nameOrColumn) { + $colName = $nameOrColumn; + } else { + die IMPL::InvalidArgumentException->new(column => 'The specified column isn\'t found in the table'); + } + + die IMPL::InvalidArgumentException->new( 'pos' => 'The specified position is invalid') + if not defined $pos || $pos < 0 || $pos >= $this->columnsCount; + + my $index = 0; + foreach my $column(@{$this->{$columns}}) { + last if $column->name eq $colName; + $index++; + } + + if ($pos != $index) { + #position needs to be changed; + + my ($column) = splice @{$this->{$columns}}, $index, 1; + splice @{$this->{$columns}}, $pos, 0, $column; + } + + return; +} + +sub columnsCount { + my ($this) = @_; return scalar(@{$this->{$columns}}); } +sub ColumnsCount { + goto &columnsCount; +} + sub AddConstraint { my $this = shift; if (@_ == 1) {
--- a/Lib/IMPL/SQL/Schema/Traits.pm Mon Jan 21 02:08:17 2013 +0400 +++ b/Lib/IMPL/SQL/Schema/Traits.pm Fri Jan 25 00:25:02 2013 +0400 @@ -224,6 +224,7 @@ BEGIN { public property tableName => prop_get | owner_set; public property column => prop_get | owner_set; + public property position => prop_get | owner_set; } sub CTOR { @@ -290,6 +291,7 @@ public property columnType => prop_all; public property defaultValue => prop_all; public property isNullable => prop_all; + public property position => prop_all; public property options => prop_all; # hash diff format, (keys have a prefix '+' - add or update value, '-' remove value) } @@ -405,15 +407,13 @@ Данные, которые содержаться в примитивных операциях не могут существовать независимо от схемы. -=head1 OPEARATIONS +=head1 OPERATIONS =head2 General Методы обще для всех примитивных операций. -=over - -=item C<apply($schema)> +=head3 C<apply($schema)> Пытается приминить операцию к указанной схеме. @@ -431,164 +431,132 @@ =back -=back - =head2 Primitive operations -=over - -=item C<IMPL::SQL::Schema::Traits::CreateTable> +=head3 C<IMPL::SQL::Schema::Traits::CreateTable> Создает таблицу -=over +=head4 C<CTOR($table)> -=item C<CTOR($table)> - -=item C<[get]table> +=head4 C<[get]table> C<IMPL::SQL::Schema::Traits::Table> - описание создаваемой таблицы -=back - -=item C<IMPL::SQL::Schema::Traits::DropTable> +=head3 C<IMPL::SQL::Schema::Traits::DropTable> Удалает таблицу по имени -=over +=head4 C<CTOR($tableName)> -=item C<CTOR($tableName)> - -=item C<[get]tableName> +=head4 C<[get]tableName> Имя удаляемой таблицы -=back - -=item C<IMPL::SQL::Schema::Traits::RenameTable> +=head3 C<IMPL::SQL::Schema::Traits::RenameTable> -=over +=head4 C<CTOR($tableName,$tableNewName)> -=item C<CTOR($tableName,$tableNewName)> - -=item C<[get]tableName> +=head4 C<[get]tableName> Имя таблицы, которую требуется переименовать -=item C<[get]tableNewName> +=head4 C<[get]tableNewName> Новое имя таблицы -=back - -=item C<IMPL::SQL::Schema::Traits::AlterTableAddColumn> +=head3 C<IMPL::SQL::Schema::Traits::AlterTableAddColumn> Добавляет столбец в таблицу -=over +=head4 C<CTOR($tableName,$column,$position)> -=item C<CTOR($tableName,$column)> - -=item C<[get]tableName> +=head4 C<[get]tableName> Имя таблицы в которую нужно добавить столбец -=item C<[get]column> +=head4 C<[get]column> -C<IMPL::SQL::Schema::Traits::Column> - описание столбца который нужно добавить +C<IMPL::SQL::Schema::Traits::Column> - описание столбца который нужно добавить -=back +=head4 C<[get]position> -=item C<IMPL::SQL::Schema::Traits::AlterTableDropColumn> +Позиция на которую нужно вставить столбец + +=head3 C<IMPL::SQL::Schema::Traits::AlterTableDropColumn> Удаляет столбец из таблицы -=over +=head4 C<CTOR($tableName,$columnName)> -=item C<CTOR($tableName,$columnName)> - -=item C<[get]tableName> +=head4 C<[get]tableName> Имя таблицы в которой нужно удалить столбец -=item C<[get]columnName> +=head4 C<[get]columnName> Имя столбца для удаления -=back - -=item C<IMPL::SQL::Schema::Traits::AlterTableChangeColumn> +=head3 C<IMPL::SQL::Schema::Traits::AlterTableChangeColumn> Меняет описание столбца -=over - -=item C<CTOR($tableName,$columnName,%args)> +=head4 C<CTOR($tableName,$columnName,%args)> C<%args> - хеш, ключами которого являются оставшиеся свойства создаваемого объекта. -=item C<[get]tableName> +=head4 C<[get]tableName> Имя таблицы в которой находится столбец. -=item C<[get]columnName> +=head4 C<[get]columnName> Имя столбца для изменения -=item C<[get]columnType> +=head4 C<[get]columnType> Новый тип столбца. Не задан, если тип не меняется -=item C<[get]defaultValue> +=head4 C<[get]defaultValue> Значение по умолчанию. Не задано, если не меняется -=item C<[get]isNullable> +=head4 C<[get]isNullable> Может ли столбец содержать C<NULL>. Не задано, если не меняется. -=item C<[get]options> - -Хеш опций, не задан, если опции не меняются +=head4 C<[get]options> -=back +Хеш опций, не задан, если опции не меняются. Данный хеш содержит разничу между +старыми и новыми значениями свойства C<tag> столбца. -=item C<IMPL::SQL::Schema::Traits::AlterTableAddConstraint> + +=head3 C<IMPL::SQL::Schema::Traits::AlterTableAddConstraint> Базовый класс для операций по добавлению ограничений -=over +=head4 C<CTOR($tableName,$constraint)> -=item C<CTOR($tableName,$constraint)> - -=item C<[get]tableName> +=head4 C<[get]tableName> Имя таблицы в которую добавляется ограничение. -=item C<[get]constraint> +=head4 C<[get]constraint> C<IMPL::SQL::Schema::Traits::Constraint> - описние ограничения, которое нужно добавить. -=back - -=item C<IMPL::SQL::Schema::Traits::AlterTableDropConstraint> +=head3 C<IMPL::SQL::Schema::Traits::AlterTableDropConstraint> Удаляет ограничение на таблицу -=over +=head4 C<CTOR($tableName,$constraintName)> -=item C<CTOR($tableName,$constraintName)> - -=item C<[get]tableName> +=head4 C<[get]tableName> Имя таблицы в которой требуется удалить ограничение. -=item C<[get]constraintName> +=head4 C<[get]constraintName> Имя ограничения для удаления. -=back - -=back - =cut
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/SQL/Schema/Traits/MysqlFormatter.pm Fri Jan 25 00:25:02 2013 +0400 @@ -0,0 +1,96 @@ +package IMPL::SQL::Schema::Traits::MysqlFormatter; +use strict; + +sub quote{ + my $self = shift; + + if (wantarray) { + return map { my $str=$_; $str=~ s/'/''/g; "'$str'"; } @_; + } else { + return join '',map { my $str=$_; $str=~ s/'/''/g; "'$str'"; } @_; + } +} + +sub quote_names { + my $self = shift; + + if (wantarray) { + return map { my $str=$_; $str=~ s/`/``/g; "`$str`"; } @_; + } else { + return join '',map { my $str=$_; $str=~ s/`/``/g; "`$str`"; } @_; + } +} + +sub FormatTypeName { + my ($self,$type) = @_; + +} + +sub FormatValue { + my ($self,$value,$type) = @_; +} + +sub FormatColumn { + my ($self, $column) = @_; + + my @parts = ( + $self->quote_names($column->{name}), + $self->FormatTypeName($column->{type}), + $column->isNullable ? 'NULL' : 'NOT NULL' + ); + + push @parts, $self->FormatValue( $column->{defaultValue}, $column->{type} ) + if $column->{defaultValue}; + + push @parts, 'AUTO_INCREMENT' + if $column->{tag} and $column->{tag}->{auto_increment}; + + return join ' ', @parts; +} + +sub FormatCreateTable { + my ($self,$op) = @_; + + my $table = $op->table; + + my @lines; + + push @lines, "CREATE TABLE ("; + + push @lines, map { " " . $self->FormatColumn($_) } @{$table->{columns}} + if $table->{columns}; + + push @lines, ");"; + + return join "\n",@lines; +} + +sub FormatDropTable { + my ($self,$op) = @_; + + return join ' ', + 'DROP TABLE', + $self->quote_names($op->{tableName}), + ';'; +} + +sub FormatRenameTable { + my ($self,$op) = @_; + + return join ' ', + 'ALTER TABLE', + $self->quote_names($op->{tableName}), + 'RENAME TO', + $self->quote_names($op->{tableNewName}), + ';'; +} + +sub FormatAlterTableAddColumn { + my ($this,$op,$schema) = @_; + + my @parts; + + $schema->GetTable($op->{tableName}) +} + +1; \ No newline at end of file