Mercurial > pub > Impl
comparison Lib/IMPL/SQL/Schema/Traits.pm @ 271:56364d0c4b4f
+IMPL::SQL::Schema::MySQL: added basic support for MySQL
| author | cin |
|---|---|
| date | Mon, 28 Jan 2013 02:43:14 +0400 |
| parents | dacfe7c0311a |
| children | 47db27ed5b43 |
comparison
equal
deleted
inserted
replaced
| 270:3f59fd828d5f | 271:56364d0c4b4f |
|---|---|
| 112 | 112 |
| 113 use base qw(IMPL::SQL::Schema::Traits::Constraint); | 113 use base qw(IMPL::SQL::Schema::Traits::Constraint); |
| 114 use fields qw( | 114 use fields qw( |
| 115 foreignTable | 115 foreignTable |
| 116 foreignColumns | 116 foreignColumns |
| 117 onUpdate | |
| 118 onDelete | |
| 117 ); | 119 ); |
| 118 | 120 |
| 119 use constant { constraintClass => typeof IMPL::SQL::Schema::Constraint::ForeignKey }; | 121 use constant { constraintClass => typeof IMPL::SQL::Schema::Constraint::ForeignKey }; |
| 120 | 122 |
| 121 our %CTOR = ( | 123 our %CTOR = ( |
| 122 'IMPL::SQL::Schema::Traits::Constraint' => sub { @_[0..1] } | 124 'IMPL::SQL::Schema::Traits::Constraint' => sub { @_[0..1] } |
| 123 ); | 125 ); |
| 124 | 126 |
| 125 sub CTOR { | 127 sub CTOR { |
| 126 my ($this,$foreignTable,$foreignColumns) = @_[0,3,4]; | 128 my ($this,$foreignTable,$foreignColumns,%args) = @_[0,3..$#_]; |
| 127 | 129 |
| 128 $this->{foreignTable} = $foreignTable; | 130 $this->{foreignTable} = $foreignTable; |
| 129 $this->{foreignColunms} = $foreignColumns; | 131 $this->{foreignColumns} = $foreignColumns; |
| 132 | |
| 133 $this->{onDelete} = $args{onDelete} if $args{onDelete}; | |
| 134 $this->{onUpdate} = $args{onUpdate} if $args{onUpdate}; | |
| 130 } | 135 } |
| 131 | 136 |
| 132 | 137 |
| 133 ################################################## | 138 ################################################## |
| 134 | 139 |
| 135 package IMPL::SQL::Schema::Traits::CreateTable; | 140 package IMPL::SQL::Schema::Traits::CreateTable; |
| 136 | 141 |
| 137 use parent qw(-norequire IMPL::SQL::Schema::Traits); | 142 use IMPL::Const qw(:prop); |
| 138 use IMPL::Class::Property; | 143 use IMPL::declare { |
| 144 require => { | |
| 145 Table => '-IMPL::SQL::Schema::Traits::Table', | |
| 146 ArgException => '-IMPL::InvalidArgumentException', | |
| 147 OpException => '-IMPL::InvalidOperationException' | |
| 148 }, | |
| 149 base => [ | |
| 150 '-IMPL::SQL::Schema::Traits' => undef | |
| 151 ], | |
| 152 props => [ | |
| 153 table => PROP_RO, | |
| 154 ] | |
| 155 }; | |
| 139 use IMPL::lang; | 156 use IMPL::lang; |
| 140 | 157 |
| 141 BEGIN { | |
| 142 public property table => prop_get | owner_set; | |
| 143 } | |
| 144 | |
| 145 sub CTOR { | 158 sub CTOR { |
| 146 my ($this,$table) = @_; | 159 my ($this,$table) = @_; |
| 147 | 160 |
| 148 die new IMPL::InvalidArgumentException("table", "An object of IMPL::SQL::Schema::Traits::Table type is required") | 161 die ArgException->new("table", "An object of IMPL::SQL::Schema::Traits::Table type is required") |
| 149 unless is $table, typeof IMPL::SQL::Schema::Traits::Table; | 162 unless is($table, Table); |
| 150 | 163 |
| 151 $this->table($table); | 164 $this->table($table); |
| 152 } | 165 } |
| 153 | 166 |
| 154 sub apply { | 167 sub CanApply { |
| 155 my ($this,$schema) = @_; | 168 my ($this,$schema) = @_; |
| 156 | 169 |
| 157 return 0 if ( $schema->GetTable( $this->table->{name} ) ); | 170 return( $schema->GetTable( $this->table->{name} ) ? 0 : 1 ); |
| 158 | 171 } |
| 159 $schema->AddTable($this->table); | 172 |
| 160 return 1; | 173 sub Apply { |
| 174 my ($this,$schema) = @_; | |
| 175 | |
| 176 my $args = {%{$this->table}}; | |
| 177 | |
| 178 my $constraints = delete $args->{constraints} || []; | |
| 179 | |
| 180 my $table = $schema->AddTable($args); | |
| 181 | |
| 182 $table->AddConstraint($_->constraintClass, $_) foreach @{$constraints}; | |
| 161 } | 183 } |
| 162 | 184 |
| 163 ################################################## | 185 ################################################## |
| 164 | 186 |
| 165 package IMPL::SQL::Schema::Traits::DropTable; | 187 package IMPL::SQL::Schema::Traits::DropTable; |
| 166 use parent qw(-norequire IMPL::SQL::Schema::Traits); | 188 use IMPL::Const qw(:prop); |
| 167 use IMPL::Class::Property; | 189 use IMPL::declare { |
| 168 | 190 require => { |
| 169 BEGIN { | 191 ArgException => '-IMPL::InvalidArgumentException' |
| 170 public property tableName => prop_get | owner_set; | 192 }, |
| 171 } | 193 base => [ |
| 194 '-IMPL::SQL::Schema::Traits' => undef | |
| 195 ], | |
| 196 props => [ | |
| 197 tableName => PROP_RO, | |
| 198 ] | |
| 199 }; | |
| 172 | 200 |
| 173 sub CTOR { | 201 sub CTOR { |
| 174 my ($this,$tableName) = @_; | 202 my ($this,$tableName) = @_; |
| 175 | 203 |
| 176 $this->tableName($tableName) or die new IMPL::InvalidArgumentException("tableName is required"); | 204 $this->tableName($tableName) or die ArgException->new("tableName is required"); |
| 177 } | 205 } |
| 178 | 206 |
| 179 sub apply { | 207 sub CanApply { |
| 180 my ($this,$schema) = @_; | 208 my ($this,$schema) = @_; |
| 181 | 209 |
| 182 return 0 if $schema->GetTable( $this->tableName ); | 210 return $schema->GetTable( $this->tableName ) ? 1 : 0; |
| 211 } | |
| 212 | |
| 213 sub Apply { | |
| 214 my ($this,$schema) = @_; | |
| 183 | 215 |
| 184 $schema->RemoveTable($this->tableName); | 216 $schema->RemoveTable($this->tableName); |
| 185 | |
| 186 return 1; | |
| 187 } | 217 } |
| 188 | 218 |
| 189 ################################################## | 219 ################################################## |
| 190 | 220 |
| 191 package IMPL::SQL::Schema::Traits::RenameTable; | 221 package IMPL::SQL::Schema::Traits::RenameTable; |
| 192 use parent qw(-norequire IMPL::SQL::Schema::Traits); | 222 use IMPL::Const qw(:prop); |
| 193 use IMPL::Class::Property; | 223 use IMPL::declare { |
| 194 | 224 require => { |
| 195 BEGIN { | 225 ArgException => '-IMPL::InvalidArgumentException' |
| 196 public property tableName => prop_get | owner_set; | 226 }, |
| 197 public property tableNewName => prop_get | owner_set; | 227 base => [ |
| 198 } | 228 '-IMPL::SQL::Schema::Traits' => undef |
| 229 ], | |
| 230 props => [ | |
| 231 tableName => PROP_RO, | |
| 232 tableNewName => PROP_RO, | |
| 233 ] | |
| 234 }; | |
| 199 | 235 |
| 200 sub CTOR { | 236 sub CTOR { |
| 201 my ($this, $oldName, $newName) = @_; | 237 my ($this, $oldName, $newName) = @_; |
| 202 | 238 |
| 203 $this->tableName($oldName) or die new IMPL::InvalidArgumentException("A table name is required"); | 239 $this->tableName($oldName) or die ArgException->new("A table name is required"); |
| 204 $this->tableNewName($newName) or die new IMPL::InvalidArgumentException("A new table name is required"); | 240 $this->tableNewName($newName) or die ArgException->new("A new table name is required"); |
| 205 } | 241 } |
| 206 | 242 |
| 207 sub apply { | 243 sub CanApply { |
| 208 my ($this,$schema) = @_; | 244 my ($this, $schema) = @_; |
| 209 | 245 |
| 210 return 0 if not $schema->GetTable($this->tableName) or $schema->GetTable($this->tableNewName); | 246 return ($schema->GetTable($this->tableName) and not $schema->GetTable($this->tableNewName) ? 1 : 0 ); |
| 211 | 247 } |
| 212 $this->RenameTable($this->tableName, $this->tableNewName); | 248 |
| 213 | 249 sub Apply { |
| 214 return 1; | 250 my ($this,$schema) = @_; |
| 251 | |
| 252 $schema->RenameTable($this->tableName, $this->tableNewName); | |
| 253 | |
| 215 } | 254 } |
| 216 | 255 |
| 217 ################################################# | 256 ################################################# |
| 218 | 257 |
| 219 package IMPL::SQL::Schema::Traits::AlterTableAddColumn; | 258 package IMPL::SQL::Schema::Traits::AlterTableAddColumn; |
| 220 use parent qw(-norequire IMPL::SQL::Schema::Traits); | 259 |
| 221 use IMPL::Class::Property; | 260 use IMPL::Const qw(:prop); |
| 261 use IMPL::declare { | |
| 262 require => { | |
| 263 Column => '-IMPL::SQL::Schema::Traits::Column', | |
| 264 ArgException => '-IMPL::InvalidArgumentException', | |
| 265 OpException => '-IMPL::InvalidOperationException' | |
| 266 }, | |
| 267 base => [ | |
| 268 '-IMPL::SQL::Schema::Traits' => undef | |
| 269 ], | |
| 270 props => [ | |
| 271 tableName => PROP_RO, | |
| 272 column => PROP_RO, | |
| 273 position => PROP_RO | |
| 274 ] | |
| 275 }; | |
| 222 use IMPL::lang; | 276 use IMPL::lang; |
| 223 | 277 |
| 224 BEGIN { | |
| 225 public property tableName => prop_get | owner_set; | |
| 226 public property column => prop_get | owner_set; | |
| 227 public property position => prop_get | owner_set; | |
| 228 } | |
| 229 | 278 |
| 230 sub CTOR { | 279 sub CTOR { |
| 231 my ($this,$tableName,$column) = @_; | 280 my ($this,$tableName,$column) = @_; |
| 232 | 281 |
| 233 $this->tableName($tableName) or die new IMPL::InvalidArgumentException("A table name is required"); | 282 $this->tableName($tableName) or die ArgException->new("A table name is required"); |
| 234 | 283 |
| 235 die new IMPL::InvalidArgumentException("A column should be a IMPL::SQL::Schema::Traits::Column object") | 284 die ArgException->new("A column should be a IMPL::SQL::Schema::Traits::Column object") |
| 236 unless is $column, typeof IMPL::SQL::Schema::Traits::Column; | 285 unless is($column, Column); |
| 237 | 286 |
| 238 $this->column($column); | 287 $this->column($column); |
| 239 } | 288 } |
| 240 | 289 |
| 241 sub apply { | 290 sub CanApply { |
| 242 my ($this,$schema) = @_; | 291 my ($this,$schema) = @_; |
| 243 | 292 |
| 244 my $table = $schema->GetTable($this->tableName) or return 0; | 293 my $table = $schema->GetTable($this->tableName) |
| 245 | 294 or return 0; |
| 246 return 0 if $table->GetColumn( $this->column->{name} ); | 295 |
| 247 | 296 return $table->GetColumn( $this->column->{name} ) ? 0 : 1; |
| 248 $table->AddColumn($this->column); | 297 } |
| 249 | 298 |
| 250 return 1; | 299 sub Apply { |
| 300 my ($this,$schema) = @_; | |
| 301 | |
| 302 my $table = $schema->GetTable($this->tableName) | |
| 303 or die OpException->new("The specified table doesn't exists", $this->tableName); | |
| 304 | |
| 305 if ($this->position) { | |
| 306 $table->AddColumn($this->column); | |
| 307 } else { | |
| 308 $table->InsertColumn($this->column,$this->position); | |
| 309 } | |
| 251 } | 310 } |
| 252 | 311 |
| 253 ################################################# | 312 ################################################# |
| 254 | 313 |
| 255 package IMPL::SQL::Schema::Traits::AlterTableDropColumn; | 314 package IMPL::SQL::Schema::Traits::AlterTableDropColumn; |
| 256 use parent qw(-norequire IMPL::SQL::Schema::Traits); | 315 |
| 257 use IMPL::Class::Property; | 316 use IMPL::Const qw(:prop); |
| 258 | 317 use IMPL::declare { |
| 259 BEGIN { | 318 require => { |
| 260 public property tableName => prop_get | owner_set; | 319 FK => '-IMPL::SQL::Schema::Constraint::ForeignKey', |
| 261 public property columnName => prop_get | owner_set; | 320 ArgException => '-IMPL::InvalidArgumentException', |
| 262 } | 321 OpException => '-IMPL::InvalidOperationException' |
| 322 }, | |
| 323 base => [ | |
| 324 '-IMPL::SQL::Schema::Traits' => undef | |
| 325 ], | |
| 326 props => [ | |
| 327 tableName => PROP_RO, | |
| 328 columnName => PROP_RO, | |
| 329 ] | |
| 330 }; | |
| 331 use IMPL::lang; | |
| 332 | |
| 263 | 333 |
| 264 sub CTOR { | 334 sub CTOR { |
| 265 my ($this,$table,$column) = @_; | 335 my ($this,$table,$column) = @_; |
| 266 | 336 |
| 267 $this->tableName($table) or die new IMPL::InvalidArgumentException(tableName => "A table name should be specified"); | 337 $this->tableName($table) or die ArgException->new(tableName => "A table name should be specified"); |
| 268 $this->columnName($column) or die new IMPL::InvalidArgumentException(columnName => "A column name should be specified"); | 338 $this->columnName($column) or die ArgException->new(columnName => "A column name should be specified"); |
| 269 } | 339 } |
| 270 | 340 |
| 271 sub apply { | 341 sub CanApply { |
| 272 my ($this,$schema) = @_; | 342 my ($this,$schema) = @_; |
| 273 | 343 |
| 274 local $@; | 344 my $table = $schema->GetTable($this->tableName) |
| 275 | 345 or return 0; |
| 276 return eval { | 346 |
| 277 $schema->GetTable($this->tableName)->RemoveColumn($this->columnName); | 347 $table->GetColumn($this->columnName) or |
| 278 return 1; | 348 return 0; |
| 279 } || 0; | 349 |
| 350 # столбец | |
| 351 return $table->GetColumnConstraints($this->columnName) | |
| 352 ? 0 | |
| 353 : 1 | |
| 354 ; | |
| 355 } | |
| 356 | |
| 357 sub Apply { | |
| 358 my ($this,$schema) = @_; | |
| 359 | |
| 360 my $table = $schema->GetTable($this->tableName) | |
| 361 or die OpException->new("The specified table doesn't exists", $this->tableName); | |
| 362 | |
| 363 $table->RemoveColumn($this->columnName); | |
| 280 } | 364 } |
| 281 | 365 |
| 282 ################################################# | 366 ################################################# |
| 283 | 367 |
| 284 package IMPL::SQL::Schema::Traits::AlterTableChangeColumn; | 368 package IMPL::SQL::Schema::Traits::AlterTableChangeColumn; |
| 285 use parent qw(-norequire IMPL::SQL::Schema::Traits); | 369 |
| 286 use IMPL::Class::Property; | 370 use IMPL::Const qw(:prop); |
| 287 | 371 use IMPL::declare { |
| 288 BEGIN { | 372 require => { |
| 289 public property tableName => prop_get | owner_set; | 373 Constraint => '-IMPL::SQL::Schema::Traits::Constraint', |
| 290 public property columnName => prop_get | owner_set; | 374 ArgException => '-IMPL::InvalidArgumentException', |
| 291 public property columnType => prop_all; | 375 OpException => '-IMPL::InvalidOperationException' |
| 292 public property defaultValue => prop_all; | 376 }, |
| 293 public property isNullable => prop_all; | 377 base => [ |
| 294 public property position => prop_all; | 378 '-IMPL::SQL::Schema::Traits' => undef |
| 295 public property options => prop_all; # hash diff format, (keys have a prefix '+' - add or update value, '-' remove value) | 379 ], |
| 296 } | 380 props => [ |
| 381 tableName => PROP_RO, | |
| 382 columnName => PROP_RO, | |
| 383 columnType => PROP_RW, | |
| 384 defaultValue => PROP_RW, | |
| 385 isNullable => PROP_RW, | |
| 386 position => PROP_RW, | |
| 387 options => PROP_RW # hash diff format, (keys have a prefix '+' - add or update value, '-' remove value) | |
| 388 ] | |
| 389 }; | |
| 390 use IMPL::lang; | |
| 297 | 391 |
| 298 sub CTOR { | 392 sub CTOR { |
| 299 my ($this, $table,$column,%args) = @_; | 393 my ($this, $table,$column,%args) = @_; |
| 300 | 394 |
| 301 $this->tableName($table) or die new IMPL::InvalidArgumentException(tableName => "A table name is required"); | 395 $this->tableName($table) or die ArgException->new(tableName => "A table name is required"); |
| 302 $this->columnName($column) or die new IMPL::InvalidArgumentException(columnName => "A column name is required"); | 396 $this->columnName($column) or die ArgException->new(columnName => "A column name is required"); |
| 303 | 397 |
| 304 $this->$_($args{$_}) | 398 $this->$_($args{$_}) |
| 305 for (grep exists $args{$_}, qw(columnType defaultValue isNullable options)); | 399 for (grep exists $args{$_}, qw(columnType defaultValue isNullable options)); |
| 306 } | 400 } |
| 307 | 401 |
| 308 sub apply { | 402 sub CanApply { |
| 309 my ($this,$schema) = @_; | 403 my ($this,$schema) = @_; |
| 310 | 404 |
| 311 local $@; | 405 my $table = $schema->GetTable($this->tableName) |
| 312 | 406 or return 0; |
| 313 return eval { | 407 |
| 314 my $column = $schema->GetTable($this->tableName)->GetColumn($this->columnName); | 408 return $table->GetColumn($this->columnName) ? 1 : 0; |
| 315 $column->SetType($this->columnType) if defined $this->columnType; | 409 } |
| 316 $column->SetNullable($this->isNullable) if defined $this->isNullable; | 410 |
| 317 $column->SetDefaultValue($this->defaultValue) if defined $this->defaultValue; | 411 sub Apply { |
| 318 $column->SetOptions($this->options) if defined $this->options; | 412 my ($this,$schema) = @_; |
| 319 | 413 |
| 320 return 1; | 414 my $table = $schema->GetTable($this->tableName) |
| 321 } || 0; | 415 or die OpException->new("The specified table doesn't exists", $this->tableName); |
| 416 | |
| 417 my $column = $table->GetColumn($this->columnName) | |
| 418 or die OpException->new("The specified column doesn't exists", $this->tableName, $this->columnName); | |
| 419 | |
| 420 $column->SetType($this->columnType) if defined $this->columnType; | |
| 421 $column->SetNullable($this->isNullable) if defined $this->isNullable; | |
| 422 $column->SetDefaultValue($this->defaultValue) if defined $this->defaultValue; | |
| 423 $column->SetOptions($this->options) if defined $this->options; | |
| 424 | |
| 425 $table->SetColumnPosition($this->position) | |
| 426 if ($this->position); | |
| 427 | |
| 322 } | 428 } |
| 323 | 429 |
| 324 ################################################# | 430 ################################################# |
| 325 | 431 |
| 326 package IMPL::SQL::Schema::Traits::AlterTableAddConstraint; | 432 package IMPL::SQL::Schema::Traits::AlterTableAddConstraint; |
| 327 use parent qw(-norequire IMPL::SQL::Schema::Traits); | 433 |
| 328 use IMPL::Class::Property; | 434 use IMPL::Const qw(:prop); |
| 435 use IMPL::declare { | |
| 436 require => { | |
| 437 Constraint => '-IMPL::SQL::Schema::Traits::Constraint', | |
| 438 ArgException => '-IMPL::InvalidArgumentException', | |
| 439 FK => '-IMPL::SQL::Schema::Traits::ForeignKey' | |
| 440 }, | |
| 441 base => [ | |
| 442 '-IMPL::SQL::Schema::Traits' => undef | |
| 443 ], | |
| 444 props => [ | |
| 445 tableName => PROP_RO, | |
| 446 constraint => PROP_RO | |
| 447 ] | |
| 448 }; | |
| 329 use IMPL::lang; | 449 use IMPL::lang; |
| 330 | 450 |
| 331 BEGIN { | |
| 332 public property tableName => prop_get | owner_set; | |
| 333 public property constraint => prop_get | owner_set; | |
| 334 } | |
| 335 | |
| 336 sub CTOR { | 451 sub CTOR { |
| 337 my ($this,$table,$constraint) = @_; | 452 my ($this,$table,$constraint) = @_; |
| 338 | 453 |
| 339 $this->tableName($table) or die new IMPL::InvalidArgumentException( tableName => "A table name is required"); | 454 $this->tableName($table) or die ArgException->new( tableName => "A table name is required"); |
| 340 | 455 |
| 341 die new IMPL::InvalidArgumentException(constaraint => "A valid IMPL::SQL::Schema::Traits::Constarint is required") | 456 die ArgException->new(constaraint => "A valid " . Constraint . " is required") |
| 342 unless is $constraint, typeof IMPL::SQL::Schema::Traits::Constraint; | 457 unless is($constraint, Constraint); |
| 343 | 458 |
| 344 $this->constraint($constraint); | 459 $this->constraint($constraint); |
| 345 } | 460 } |
| 346 | 461 |
| 347 sub apply { | 462 sub CanApply { |
| 348 my ($this,$schema) = @_; | 463 my ($this, $schema) = @_; |
| 349 | 464 |
| 350 local $@; | 465 my $table = $schema->GetTable($this->tableName) |
| 351 | 466 or return 0; |
| 352 return eval { | 467 |
| 353 $schema->GetTable($this->tableName)->AddConstraint($this->constraint->constraintClass, $this->constraint); | 468 my $constraint = $this->constraint; |
| 354 return 1; | 469 |
| 355 } || 0; | 470 my @columns = map $table->GetColumn($_), @{$constraint->{columns} || []}; |
| 471 | |
| 472 # проверяем, что в таблице есть все столбцы для создания ограничения | |
| 473 return 0 if grep not($_), @columns; | |
| 474 | |
| 475 if (is($constraint,FK)) { | |
| 476 warn "FK"; | |
| 477 my $foreignTable = $schema->GetTable($constraint->{foreignTable}) | |
| 478 or return 0; | |
| 479 | |
| 480 warn "Table OK"; | |
| 481 my @foreignColumns = map $foreignTable->GetColumn($_), @{$constraint->{foreignColumns}||[]}; | |
| 482 | |
| 483 # внешняя таблица имеет нужные столбцы | |
| 484 return 0 | |
| 485 if grep not($_), @foreignColumns; | |
| 486 | |
| 487 warn "FK Columns OK"; | |
| 488 | |
| 489 return 0 | |
| 490 if grep not($columns[$_]->type->SameValue($foreignColumns[$_]->type)), (0 .. $#columns); | |
| 491 | |
| 492 warn "FK Columns types OK"; | |
| 493 } | |
| 494 | |
| 495 return 1; | |
| 496 } | |
| 497 | |
| 498 sub Apply { | |
| 499 my ($this,$schema) = @_; | |
| 500 | |
| 501 my $table = $schema->GetTable($this->tableName) | |
| 502 or die IMPL::InvalidOperationException->new("The specified table doesn't exists", $this->tableName); | |
| 503 | |
| 504 my $constraint = $this->constraint; | |
| 505 | |
| 506 if (is($constraint,FK)) { | |
| 507 my $args = { %$constraint }; | |
| 508 $args->{referencedTable} = $schema->GetTable(delete $args->{foreignTable}); | |
| 509 $args->{referencedColumns} = delete $args->{foreignColumns}; | |
| 510 $table->AddConstraint($constraint->constraintClass, $args); | |
| 511 } else { | |
| 512 $table->AddConstraint($constraint->constraintClass, $constraint); | |
| 513 } | |
| 356 | 514 |
| 357 } | 515 } |
| 358 | 516 |
| 359 ################################################# | 517 ################################################# |
| 360 | 518 |
| 361 package IMPL::SQL::Schema::Traits::AlterTableDropConstraint; | 519 package IMPL::SQL::Schema::Traits::AlterTableDropConstraint; |
| 362 use parent qw(-norequire IMPL::SQL::Schema::Traits); | 520 use IMPL::Const qw(:prop); |
| 363 use IMPL::Class::Property; | 521 use IMPL::declare { |
| 364 | 522 require => { |
| 365 BEGIN { | 523 PK => '-IMPL::SQL::Schema::Constraint::PrimaryKey' |
| 366 public property tableName => prop_get | owner_set; | 524 }, |
| 367 public property constraintName => prop_get | owner_set; | 525 base => [ |
| 368 } | 526 '-IMPL::SQL::Schema::Traits' => undef |
| 527 ], | |
| 528 props => [ | |
| 529 tableName => PROP_RO, | |
| 530 constraintName => PROP_RO | |
| 531 ] | |
| 532 }; | |
| 533 use IMPL::lang qw(is); | |
| 369 | 534 |
| 370 sub CTOR { | 535 sub CTOR { |
| 371 my ($this,$table,$constraint) = @_; | 536 my ($this,$table,$constraint) = @_; |
| 372 | 537 |
| 373 die new IMPL::InvalidArgumentException( tableName => "A table name is required" ) unless $table; | 538 die new IMPL::InvalidArgumentException( tableName => "A table name is required" ) unless $table; |
| 375 | 540 |
| 376 $this->tableName($table); | 541 $this->tableName($table); |
| 377 $this->constraintName($constraint); | 542 $this->constraintName($constraint); |
| 378 } | 543 } |
| 379 | 544 |
| 380 sub apply { | 545 sub CanApply { |
| 381 my ($this,$schema) = @_; | 546 my ($this,$schema) = @_; |
| 382 | 547 |
| 383 my $table = $schema->GetTable($this->tableName) or return 0; | 548 my $table = $schema->GetTable($this->tableName); |
| 384 | 549 |
| 385 return 0 unless $table->GetConstraint($this->constraintName); | 550 my $constraint = $table->GetConstraint($this->constraintName) |
| 551 or return 0; | |
| 552 | |
| 553 # есть ли внешние ключи на данную таблицу | |
| 554 return ( | |
| 555 is($constraint,PK) | |
| 556 && values( %{$constraint->connectedFK || {}} ) | |
| 557 ? 0 | |
| 558 : 1 | |
| 559 ); | |
| 560 } | |
| 561 | |
| 562 sub Apply { | |
| 563 my ($this,$schema) = @_; | |
| 564 | |
| 565 my $table = $schema->GetTable($this->tableName) | |
| 566 or die IMPL::InvalidOperationException->new("The specified table doesn't exists", $this->tableName); | |
| 386 | 567 |
| 387 $table->RemoveConstraint($this->constraintName); | 568 $table->RemoveConstraint($this->constraintName); |
| 388 return 1; | |
| 389 } | 569 } |
| 390 | 570 |
| 391 | 571 |
| 392 1; | 572 1; |
| 393 | 573 |
| 411 | 591 |
| 412 =head2 General | 592 =head2 General |
| 413 | 593 |
| 414 Методы обще для всех примитивных операций. | 594 Методы обще для всех примитивных операций. |
| 415 | 595 |
| 416 =head3 C<apply($schema)> | 596 =head3 C<CanApply($schema)> |
| 417 | 597 |
| 418 Пытается приминить операцию к указанной схеме. | 598 Определяет возможность применения операции к указанной схеме. |
| 419 | 599 |
| 420 Возвращаемое значение: | 600 Возвращаемое значение: |
| 421 | 601 |
| 422 =over | 602 =over |
| 423 | 603 |
| 424 =item C<true> | 604 =item C<true> |
| 425 | 605 |
| 426 Операция успешно применена к схеме. | 606 Операция приминима к схеме. |
| 427 | 607 |
| 428 =item C<false> | 608 =item C<false> |
| 429 | 609 |
| 430 Операция не может быть применена к схеме. | 610 Операция не может быть применена к схеме. |
| 431 | 611 |
| 432 =back | 612 =back |
| 613 | |
| 614 =head3 C<Apply($schema)> | |
| 615 | |
| 616 Применяет операцию к указанной схеме. | |
| 433 | 617 |
| 434 =head2 Primitive operations | 618 =head2 Primitive operations |
| 435 | 619 |
| 436 =head3 C<IMPL::SQL::Schema::Traits::CreateTable> | 620 =head3 C<IMPL::SQL::Schema::Traits::CreateTable> |
| 437 | 621 |
