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
--- a/_doc/make.pl	Mon Jan 21 02:08:17 2013 +0400
+++ b/_doc/make.pl	Fri Jan 25 00:25:02 2013 +0400
@@ -4,6 +4,7 @@
 use Pod::POM;
 use Pod::POM::View::HTML;
 use File::Spec;
+use utf8;
 
 our $LibDir = '../Lib/IMPL';
 our $OutDir = 'html';