| … | |
… | |
| 241 | Returns a new, empty password object. |
241 | Returns a new, empty password object. |
| 242 | |
242 | |
| 243 | =cut |
243 | =cut |
| 244 | |
244 | |
| 245 | sub newPassword { |
245 | sub newPassword { |
| 246 | my ($self, $prototype) = @_; |
246 | my ($self, @prototype) = @_; |
| 247 | return $self->{password}->{record}->new($prototype); |
247 | return $self->{password}->{record}->new(@prototype); |
| 248 | } |
248 | } |
| 249 | |
249 | |
| 250 | =item listPasswords() |
250 | =item listPasswords() |
| 251 | |
251 | |
| 252 | Returns a list of user IDs representing the records in the password table. |
252 | Returns a list of user IDs representing the records in the password table. |
| … | |
… | |
| 277 | |
277 | |
| 278 | croak "addPassword: requires 1 argument" |
278 | croak "addPassword: requires 1 argument" |
| 279 | unless @_ == 2; |
279 | unless @_ == 2; |
| 280 | croak "addPassword: argument 1 must be of type ", $self->{password}->{record} |
280 | croak "addPassword: argument 1 must be of type ", $self->{password}->{record} |
| 281 | unless ref $Password eq $self->{password}->{record}; |
281 | unless ref $Password eq $self->{password}->{record}; |
|
|
282 | |
|
|
283 | checkKeyfields($Password); |
|
|
284 | |
| 282 | croak "addPassword: password exists (perhaps you meant to use putPassword?)" |
285 | croak "addPassword: password exists (perhaps you meant to use putPassword?)" |
| 283 | if $self->{password}->exists($Password->user_id); |
286 | if $self->{password}->exists($Password->user_id); |
| 284 | croak "addPassword: user ", $Password->user_id, " not found" |
287 | croak "addPassword: user ", $Password->user_id, " not found" |
| 285 | unless $self->{user}->exists($Password->user_id); |
288 | unless $self->{user}->exists($Password->user_id); |
| 286 | |
289 | |
| 287 | checkKeyfields($Password); |
|
|
| 288 | |
|
|
| 289 | return $self->{password}->add($Password); |
290 | return $self->{password}->add($Password); |
| 290 | } |
291 | } |
| 291 | |
292 | |
| 292 | =item getPassword($userID) |
293 | =item getPassword($userID) |
| 293 | |
294 | |
| 294 | If a record with a matching user ID exists, a record object containting that |
295 | If a record with a matching user ID exists, a record object containting that |
| 295 | record's data will be returned. If no such record exists, an undefined value |
296 | record's data will be returned. If no such record exists, one will be created. |
| 296 | will be returned. |
|
|
| 297 | |
297 | |
| 298 | =cut |
298 | =cut |
| 299 | |
299 | |
| 300 | sub getPassword { |
300 | sub getPassword { |
| 301 | my ($self, $userID) = @_; |
301 | my ($self, $userID) = @_; |
| … | |
… | |
| 303 | croak "getPassword: requires 1 argument" |
303 | croak "getPassword: requires 1 argument" |
| 304 | unless @_ == 2; |
304 | unless @_ == 2; |
| 305 | croak "getPassword: argument 1 must contain a user_id" |
305 | croak "getPassword: argument 1 must contain a user_id" |
| 306 | unless defined $userID; |
306 | unless defined $userID; |
| 307 | |
307 | |
| 308 | return $self->{password}->get($userID); |
308 | #return $self->{password}->get($userID); |
|
|
309 | return ( $self->getPasswords($userID) )[0]; |
| 309 | } |
310 | } |
| 310 | |
311 | |
| 311 | =item getPasswords(@uesrIDs) |
312 | =item getPasswords(@uesrIDs) |
| 312 | |
313 | |
| 313 | Return a list of password records associated with the user IDs given. If there |
314 | Return a list of password records associated with the user IDs given. If there |
| 314 | is no record associated with a given user ID, that element of the list will be |
315 | is no record associated with a given user ID, one will be created. |
| 315 | undefined. |
|
|
| 316 | |
316 | |
| 317 | =cut |
317 | =cut |
| 318 | |
318 | |
| 319 | sub getPasswords { |
319 | sub getPasswords { |
| 320 | my ($self, @userIDs) = @_; |
320 | my ($self, @userIDs) = @_; |
| … | |
… | |
| 324 | foreach my $i (0 .. $#userIDs) { |
324 | foreach my $i (0 .. $#userIDs) { |
| 325 | croak "getPasswords: element $i of argument list must contain a user_id" |
325 | croak "getPasswords: element $i of argument list must contain a user_id" |
| 326 | unless defined $userIDs[$i]; |
326 | unless defined $userIDs[$i]; |
| 327 | } |
327 | } |
| 328 | |
328 | |
| 329 | return $self->{password}->gets(map { [$_] } @userIDs); |
329 | my @Passwords = $self->{password}->gets(map { [$_] } @userIDs); |
|
|
330 | |
|
|
331 | for (my $i = 0; $i < @Passwords; $i++) { |
|
|
332 | my $Password = $Passwords[$i]; |
|
|
333 | my $userID = $userIDs[$i]; |
|
|
334 | if (not defined $Password) { |
|
|
335 | #warn "not defined\n"; |
|
|
336 | if ($self->{user}->exists($userID)) { |
|
|
337 | #warn "user exists\n"; |
|
|
338 | $Password = $self->newPassword(user_id => $userID); |
|
|
339 | eval { $self->addPassword($Password) }; |
|
|
340 | if ($@ and $@ !~ m/password exists/) { |
|
|
341 | die "error while auto-creating password record for user $userID: \"$@\""; |
|
|
342 | } |
|
|
343 | } |
|
|
344 | } |
|
|
345 | } |
|
|
346 | |
|
|
347 | return @Passwords; |
| 330 | } |
348 | } |
| 331 | |
349 | |
| 332 | =item putPassword($Password) |
350 | =item putPassword($Password) |
| 333 | |
351 | |
| 334 | $Password is a record object. If a password record with the same user ID exists |
352 | $Password is a record object. If a password record with the same user ID exists |
| … | |
… | |
| 343 | |
361 | |
| 344 | croak "putPassword: requires 1 argument" |
362 | croak "putPassword: requires 1 argument" |
| 345 | unless @_ == 2; |
363 | unless @_ == 2; |
| 346 | croak "putPassword: argument 1 must be of type ", $self->{password}->{record} |
364 | croak "putPassword: argument 1 must be of type ", $self->{password}->{record} |
| 347 | unless ref $Password eq $self->{password}->{record}; |
365 | unless ref $Password eq $self->{password}->{record}; |
|
|
366 | |
|
|
367 | checkKeyfields($Password); |
|
|
368 | |
| 348 | croak "putPassword: password not found (perhaps you meant to use addPassword?)" |
369 | croak "putPassword: password not found (perhaps you meant to use addPassword?)" |
| 349 | unless $self->{password}->exists($Password->user_id); |
370 | unless $self->{password}->exists($Password->user_id); |
| 350 | |
|
|
| 351 | checkKeyfields($Password); |
|
|
| 352 | |
371 | |
| 353 | return $self->{password}->put($Password); |
372 | return $self->{password}->put($Password); |
| 354 | } |
373 | } |
| 355 | |
374 | |
| 356 | =item deletePassword($userID) |
375 | =item deletePassword($userID) |
| … | |
… | |
| 389 | Returns a new, empty permission level object. |
408 | Returns a new, empty permission level object. |
| 390 | |
409 | |
| 391 | =cut |
410 | =cut |
| 392 | |
411 | |
| 393 | sub newPermissionLevel { |
412 | sub newPermissionLevel { |
| 394 | my ($self, $prototype) = @_; |
413 | my ($self, @prototype) = @_; |
| 395 | return $self->{permission}->{record}->new($prototype); |
414 | return $self->{permission}->{record}->new(@prototype); |
| 396 | } |
415 | } |
| 397 | |
416 | |
| 398 | =item listPermissionLevels() |
417 | =item listPermissionLevels() |
| 399 | |
418 | |
| 400 | Returns a list of user IDs representing the records in the permission table. |
419 | Returns a list of user IDs representing the records in the permission table. |
| … | |
… | |
| 425 | |
444 | |
| 426 | croak "addPermissionLevel: requires 1 argument" |
445 | croak "addPermissionLevel: requires 1 argument" |
| 427 | unless @_ == 2; |
446 | unless @_ == 2; |
| 428 | croak "addPermissionLevel: argument 1 must be of type ", $self->{permission}->{record} |
447 | croak "addPermissionLevel: argument 1 must be of type ", $self->{permission}->{record} |
| 429 | unless ref $PermissionLevel eq $self->{permission}->{record}; |
448 | unless ref $PermissionLevel eq $self->{permission}->{record}; |
|
|
449 | |
|
|
450 | checkKeyfields($PermissionLevel); |
|
|
451 | |
| 430 | croak "addPermissionLevel: permission level exists (perhaps you meant to use putPermissionLevel?)" |
452 | croak "addPermissionLevel: permission level exists (perhaps you meant to use putPermissionLevel?)" |
| 431 | if $self->{permission}->exists($PermissionLevel->user_id); |
453 | if $self->{permission}->exists($PermissionLevel->user_id); |
| 432 | croak "addPermissionLevel: user ", $PermissionLevel->user_id, " not found" |
454 | croak "addPermissionLevel: user ", $PermissionLevel->user_id, " not found" |
| 433 | unless $self->{user}->exists($PermissionLevel->user_id); |
455 | unless $self->{user}->exists($PermissionLevel->user_id); |
| 434 | |
456 | |
| 435 | checkKeyfields($PermissionLevel); |
|
|
| 436 | |
|
|
| 437 | return $self->{permission}->add($PermissionLevel); |
457 | return $self->{permission}->add($PermissionLevel); |
| 438 | } |
458 | } |
| 439 | |
459 | |
| 440 | =item getPermissionLevel($userID) |
460 | =item getPermissionLevel($userID) |
| 441 | |
461 | |
| 442 | If a record with a matching user ID exists, a record object containting that |
462 | If a record with a matching user ID exists, a record object containting that |
| 443 | record's data will be returned. If no such record exists, an undefined value |
463 | record's data will be returned. If no such record exists, one will be created. |
| 444 | will be returned. |
|
|
| 445 | |
464 | |
| 446 | =cut |
465 | =cut |
| 447 | |
466 | |
| 448 | sub getPermissionLevel($$) { |
467 | sub getPermissionLevel($$) { |
| 449 | my ($self, $userID) = @_; |
468 | my ($self, $userID) = @_; |
| … | |
… | |
| 451 | croak "getPermissionLevel: requires 1 argument" |
470 | croak "getPermissionLevel: requires 1 argument" |
| 452 | unless @_ == 2; |
471 | unless @_ == 2; |
| 453 | croak "getPermissionLevel: argument 1 must contain a user_id" |
472 | croak "getPermissionLevel: argument 1 must contain a user_id" |
| 454 | unless defined $userID; |
473 | unless defined $userID; |
| 455 | |
474 | |
| 456 | return $self->{permission}->get($userID); |
475 | #return $self->{permission}->get($userID); |
|
|
476 | return ( $self->getPermissionLevels($userID) )[0]; |
| 457 | } |
477 | } |
| 458 | |
478 | |
| 459 | =item getPermissionLevels(@uesrIDs) |
479 | =item getPermissionLevels(@uesrIDs) |
| 460 | |
480 | |
| 461 | Return a list of permission level records associated with the user IDs given. If |
481 | Return a list of permission level records associated with the user IDs given. If |
| 462 | there is no record associated with a given user ID, that element of the list |
482 | there is no record associated with a given user ID, one will be created. |
| 463 | will be undefined. |
|
|
| 464 | |
483 | |
| 465 | =cut |
484 | =cut |
| 466 | |
485 | |
| 467 | sub getPermissionLevels { |
486 | sub getPermissionLevels { |
| 468 | my ($self, @userIDs) = @_; |
487 | my ($self, @userIDs) = @_; |
| … | |
… | |
| 472 | foreach my $i (0 .. $#userIDs) { |
491 | foreach my $i (0 .. $#userIDs) { |
| 473 | croak "getPermissionLevels: element $i of argument list must contain a user_id" |
492 | croak "getPermissionLevels: element $i of argument list must contain a user_id" |
| 474 | unless defined $userIDs[$i]; |
493 | unless defined $userIDs[$i]; |
| 475 | } |
494 | } |
| 476 | |
495 | |
| 477 | return $self->{permission}->gets(map { [$_] } @userIDs); |
496 | my @PermissionLevels = $self->{permission}->gets(map { [$_] } @userIDs); |
|
|
497 | |
|
|
498 | for (my $i = 0; $i < @PermissionLevels; $i++) { |
|
|
499 | my $PermissionLevel = $PermissionLevels[$i]; |
|
|
500 | my $userID = $userIDs[$i]; |
|
|
501 | if (not defined $PermissionLevel) { |
|
|
502 | #warn "not defined\n"; |
|
|
503 | if ($self->{user}->exists($userID)) { |
|
|
504 | #warn "user exists\n"; |
|
|
505 | $PermissionLevel = $self->newPermissionLevel(user_id => $userID); |
|
|
506 | warn $PermissionLevel->toString, "\n"; |
|
|
507 | eval { $self->addPermissionLevel($PermissionLevel) }; |
|
|
508 | if ($@ and $@ !~ m/permission level exists/) { |
|
|
509 | die "error while auto-creating permission level record for user $userID: \"$@\""; |
|
|
510 | } |
|
|
511 | } |
|
|
512 | } |
|
|
513 | } |
|
|
514 | |
|
|
515 | return @PermissionLevels; |
| 478 | } |
516 | } |
| 479 | |
517 | |
| 480 | =item putPermissionLevel($PermissionLevel) |
518 | =item putPermissionLevel($PermissionLevel) |
| 481 | |
519 | |
| 482 | $PermissionLevel is a record object. If a permission level record with the same |
520 | $PermissionLevel is a record object. If a permission level record with the same |
| … | |
… | |
| 491 | |
529 | |
| 492 | croak "putPermissionLevel: requires 1 argument" |
530 | croak "putPermissionLevel: requires 1 argument" |
| 493 | unless @_ == 2; |
531 | unless @_ == 2; |
| 494 | croak "putPermissionLevel: argument 1 must be of type ", $self->{permission}->{record} |
532 | croak "putPermissionLevel: argument 1 must be of type ", $self->{permission}->{record} |
| 495 | unless ref $PermissionLevel eq $self->{permission}->{record}; |
533 | unless ref $PermissionLevel eq $self->{permission}->{record}; |
|
|
534 | |
|
|
535 | checkKeyfields($PermissionLevel); |
|
|
536 | |
| 496 | croak "putPermissionLevel: permission level not found (perhaps you meant to use addPermissionLevel?)" |
537 | croak "putPermissionLevel: permission level not found (perhaps you meant to use addPermissionLevel?)" |
| 497 | unless $self->{permission}->exists($PermissionLevel->user_id); |
538 | unless $self->{permission}->exists($PermissionLevel->user_id); |
| 498 | |
|
|
| 499 | checkKeyfields($PermissionLevel); |
|
|
| 500 | |
539 | |
| 501 | return $self->{permission}->put($PermissionLevel); |
540 | return $self->{permission}->put($PermissionLevel); |
| 502 | } |
541 | } |
| 503 | |
542 | |
| 504 | =item deletePermissionLevel($userID) |
543 | =item deletePermissionLevel($userID) |
| … | |
… | |
| 533 | Returns a new, empty key object. |
572 | Returns a new, empty key object. |
| 534 | |
573 | |
| 535 | =cut |
574 | =cut |
| 536 | |
575 | |
| 537 | sub newKey { |
576 | sub newKey { |
| 538 | my ($self, $prototype) = @_; |
577 | my ($self, @prototype) = @_; |
| 539 | return $self->{key}->{record}->new($prototype); |
578 | return $self->{key}->{record}->new(@prototype); |
| 540 | } |
579 | } |
| 541 | |
580 | |
| 542 | =item listKeys() |
581 | =item listKeys() |
| 543 | |
582 | |
| 544 | Returns a list of user IDs representing the records in the key table. |
583 | Returns a list of user IDs representing the records in the key table. |
| … | |
… | |
| 569 | |
608 | |
| 570 | croak "addKey: requires 1 argument" |
609 | croak "addKey: requires 1 argument" |
| 571 | unless @_ == 2; |
610 | unless @_ == 2; |
| 572 | croak "addKey: argument 1 must be of type ", $self->{key}->{record} |
611 | croak "addKey: argument 1 must be of type ", $self->{key}->{record} |
| 573 | unless ref $Key eq $self->{key}->{record}; |
612 | unless ref $Key eq $self->{key}->{record}; |
|
|
613 | |
|
|
614 | checkKeyfields($Key); |
|
|
615 | |
| 574 | croak "addKey: key exists (perhaps you meant to use putKey?)" |
616 | croak "addKey: key exists (perhaps you meant to use putKey?)" |
| 575 | if $self->{key}->exists($Key->user_id); |
617 | if $self->{key}->exists($Key->user_id); |
| 576 | croak "addKey: user ", $Key->user_id, " not found" |
618 | croak "addKey: user ", $Key->user_id, " not found" |
| 577 | unless $self->{user}->exists($Key->user_id); |
619 | unless $self->{user}->exists($Key->user_id); |
| 578 | |
|
|
| 579 | checkKeyfields($Key); |
|
|
| 580 | |
620 | |
| 581 | return $self->{key}->add($Key); |
621 | return $self->{key}->add($Key); |
| 582 | } |
622 | } |
| 583 | |
623 | |
| 584 | =item getKey($userID) |
624 | =item getKey($userID) |
| … | |
… | |
| 634 | |
674 | |
| 635 | croak "putKey: requires 1 argument" |
675 | croak "putKey: requires 1 argument" |
| 636 | unless @_ == 2; |
676 | unless @_ == 2; |
| 637 | croak "putKey: argument 1 must be of type ", $self->{key}->{record} |
677 | croak "putKey: argument 1 must be of type ", $self->{key}->{record} |
| 638 | unless ref $Key eq $self->{key}->{record}; |
678 | unless ref $Key eq $self->{key}->{record}; |
|
|
679 | |
|
|
680 | checkKeyfields($Key); |
|
|
681 | |
| 639 | croak "putKey: key not found (perhaps you meant to use addKey?)" |
682 | croak "putKey: key not found (perhaps you meant to use addKey?)" |
| 640 | unless $self->{key}->exists($Key->user_id); |
683 | unless $self->{key}->exists($Key->user_id); |
| 641 | |
|
|
| 642 | checkKeyfields($Key); |
|
|
| 643 | |
684 | |
| 644 | return $self->{key}->put($Key); |
685 | return $self->{key}->put($Key); |
| 645 | } |
686 | } |
| 646 | |
687 | |
| 647 | =item deleteKey($userID) |
688 | =item deleteKey($userID) |
| … | |
… | |
| 676 | Returns a new, empty user object. |
717 | Returns a new, empty user object. |
| 677 | |
718 | |
| 678 | =cut |
719 | =cut |
| 679 | |
720 | |
| 680 | sub newUser { |
721 | sub newUser { |
| 681 | my ($self, $prototype) = @_; |
722 | my ($self, @prototype) = @_; |
| 682 | return $self->{user}->{record}->new($prototype); |
723 | return $self->{user}->{record}->new(@prototype); |
| 683 | } |
724 | } |
| 684 | |
725 | |
| 685 | =item listUsers() |
726 | =item listUsers() |
| 686 | |
727 | |
| 687 | Returns a list of user IDs representing the records in the user table. |
728 | Returns a list of user IDs representing the records in the user table. |
| … | |
… | |
| 711 | |
752 | |
| 712 | croak "addUser: requires 1 argument" |
753 | croak "addUser: requires 1 argument" |
| 713 | unless @_ == 2; |
754 | unless @_ == 2; |
| 714 | croak "addUser: argument 1 must be of type ", $self->{user}->{record} |
755 | croak "addUser: argument 1 must be of type ", $self->{user}->{record} |
| 715 | unless ref $User eq $self->{user}->{record}; |
756 | unless ref $User eq $self->{user}->{record}; |
|
|
757 | |
|
|
758 | checkKeyfields($User); |
|
|
759 | |
| 716 | croak "addUser: user exists (perhaps you meant to use putUser?)" |
760 | croak "addUser: user exists (perhaps you meant to use putUser?)" |
| 717 | if $self->{user}->exists($User->user_id); |
761 | if $self->{user}->exists($User->user_id); |
| 718 | |
|
|
| 719 | checkKeyfields($User); |
|
|
| 720 | |
762 | |
| 721 | return $self->{user}->add($User); |
763 | return $self->{user}->add($User); |
| 722 | } |
764 | } |
| 723 | |
765 | |
| 724 | =item getUser($userID) |
766 | =item getUser($userID) |
| … | |
… | |
| 774 | |
816 | |
| 775 | croak "putUser: requires 1 argument" |
817 | croak "putUser: requires 1 argument" |
| 776 | unless @_ == 2; |
818 | unless @_ == 2; |
| 777 | croak "putUser: argument 1 must be of type ", $self->{user}->{record} |
819 | croak "putUser: argument 1 must be of type ", $self->{user}->{record} |
| 778 | unless ref $User eq $self->{user}->{record}; |
820 | unless ref $User eq $self->{user}->{record}; |
|
|
821 | |
|
|
822 | checkKeyfields($User); |
|
|
823 | |
| 779 | croak "putUser: user not found (perhaps you meant to use addUser?)" |
824 | croak "putUser: user not found (perhaps you meant to use addUser?)" |
| 780 | unless $self->{user}->exists($User->user_id); |
825 | unless $self->{user}->exists($User->user_id); |
| 781 | |
|
|
| 782 | checkKeyfields($User); |
|
|
| 783 | |
826 | |
| 784 | return $self->{user}->put($User); |
827 | return $self->{user}->put($User); |
| 785 | } |
828 | } |
| 786 | |
829 | |
| 787 | =item deleteUser($userID) |
830 | =item deleteUser($userID) |
| … | |
… | |
| 826 | =over |
869 | =over |
| 827 | |
870 | |
| 828 | =cut |
871 | =cut |
| 829 | |
872 | |
| 830 | sub newGlobalSet { |
873 | sub newGlobalSet { |
| 831 | my ($self, $prototype) = @_; |
874 | my ($self, @prototype) = @_; |
| 832 | return $self->{set}->{record}->new($prototype); |
875 | return $self->{set}->{record}->new(@prototype); |
| 833 | } |
876 | } |
| 834 | |
877 | |
| 835 | sub listGlobalSets($) { |
878 | sub listGlobalSets($) { |
| 836 | my ($self) = @_; |
879 | my ($self) = @_; |
| 837 | |
880 | |
| … | |
… | |
| 847 | |
890 | |
| 848 | croak "addGlobalSet: requires 1 argument" |
891 | croak "addGlobalSet: requires 1 argument" |
| 849 | unless @_ == 2; |
892 | unless @_ == 2; |
| 850 | croak "addGlobalSet: argument 1 must be of type ", $self->{set}->{record} |
893 | croak "addGlobalSet: argument 1 must be of type ", $self->{set}->{record} |
| 851 | unless ref $GlobalSet eq $self->{set}->{record}; |
894 | unless ref $GlobalSet eq $self->{set}->{record}; |
|
|
895 | |
|
|
896 | checkKeyfields($GlobalSet); |
|
|
897 | |
| 852 | croak "addGlobalSet: global set exists (perhaps you meant to use putGlobalSet?)" |
898 | croak "addGlobalSet: global set exists (perhaps you meant to use putGlobalSet?)" |
| 853 | if $self->{set}->exists($GlobalSet->set_id); |
899 | if $self->{set}->exists($GlobalSet->set_id); |
| 854 | |
|
|
| 855 | checkKeyfields($GlobalSet); |
|
|
| 856 | |
900 | |
| 857 | return $self->{set}->add($GlobalSet); |
901 | return $self->{set}->add($GlobalSet); |
| 858 | } |
902 | } |
| 859 | |
903 | |
| 860 | sub getGlobalSet($$) { |
904 | sub getGlobalSet($$) { |
| … | |
… | |
| 894 | |
938 | |
| 895 | croak "putGlobalSet: requires 1 argument" |
939 | croak "putGlobalSet: requires 1 argument" |
| 896 | unless @_ == 2; |
940 | unless @_ == 2; |
| 897 | croak "putGlobalSet: argument 1 must be of type ", $self->{set}->{record} |
941 | croak "putGlobalSet: argument 1 must be of type ", $self->{set}->{record} |
| 898 | unless ref $GlobalSet eq $self->{set}->{record}; |
942 | unless ref $GlobalSet eq $self->{set}->{record}; |
|
|
943 | |
|
|
944 | checkKeyfields($GlobalSet); |
|
|
945 | |
| 899 | croak "putGlobalSet: global set not found (perhaps you meant to use addGlobalSet?)" |
946 | croak "putGlobalSet: global set not found (perhaps you meant to use addGlobalSet?)" |
| 900 | unless $self->{set}->exists($GlobalSet->set_id); |
947 | unless $self->{set}->exists($GlobalSet->set_id); |
| 901 | |
|
|
| 902 | checkKeyfields($GlobalSet); |
|
|
| 903 | |
948 | |
| 904 | return $self->{set}->put($GlobalSet); |
949 | return $self->{set}->put($GlobalSet); |
| 905 | } |
950 | } |
| 906 | |
951 | |
| 907 | sub deleteGlobalSet($$) { |
952 | sub deleteGlobalSet($$) { |
| … | |
… | |
| 936 | =over |
981 | =over |
| 937 | |
982 | |
| 938 | =cut |
983 | =cut |
| 939 | |
984 | |
| 940 | sub newUserSet { |
985 | sub newUserSet { |
| 941 | my ($self, $prototype) = @_; |
986 | my ($self, @prototype) = @_; |
| 942 | return $self->{set_user}->{record}->new($prototype); |
987 | return $self->{set_user}->{record}->new(@prototype); |
| 943 | } |
988 | } |
| 944 | |
989 | |
| 945 | sub listSetUsers($$) { |
990 | sub listSetUsers($$) { |
| 946 | my ($self, $setID) = @_; |
991 | my ($self, $setID) = @_; |
| 947 | |
992 | |
| … | |
… | |
| 971 | |
1016 | |
| 972 | croak "addUserSet: requires 1 argument" |
1017 | croak "addUserSet: requires 1 argument" |
| 973 | unless @_ == 2; |
1018 | unless @_ == 2; |
| 974 | croak "addUserSet: argument 1 must be of type ", $self->{set_user}->{record} |
1019 | croak "addUserSet: argument 1 must be of type ", $self->{set_user}->{record} |
| 975 | unless ref $UserSet eq $self->{set_user}->{record}; |
1020 | unless ref $UserSet eq $self->{set_user}->{record}; |
|
|
1021 | |
|
|
1022 | checkKeyfields($UserSet); |
|
|
1023 | |
| 976 | croak "addUserSet: user set exists (perhaps you meant to use putUserSet?)" |
1024 | croak "addUserSet: user set exists (perhaps you meant to use putUserSet?)" |
| 977 | if $self->{set_user}->exists($UserSet->user_id, $UserSet->set_id); |
1025 | if $self->{set_user}->exists($UserSet->user_id, $UserSet->set_id); |
| 978 | croak "addUserSet: user ", $UserSet->user_id, " not found" |
1026 | croak "addUserSet: user ", $UserSet->user_id, " not found" |
| 979 | unless $self->{user}->exists($UserSet->user_id); |
1027 | unless $self->{user}->exists($UserSet->user_id); |
| 980 | croak "addUserSet: set ", $UserSet->set_id, " not found" |
1028 | croak "addUserSet: set ", $UserSet->set_id, " not found" |
| 981 | unless $self->{set}->exists($UserSet->set_id); |
1029 | unless $self->{set}->exists($UserSet->set_id); |
| 982 | |
|
|
| 983 | checkKeyfields($UserSet); |
|
|
| 984 | |
1030 | |
| 985 | return $self->{set_user}->add($UserSet); |
1031 | return $self->{set_user}->add($UserSet); |
| 986 | } |
1032 | } |
| 987 | |
1033 | |
| 988 | sub getUserSet($$$) { |
1034 | sub getUserSet($$$) { |
| … | |
… | |
| 1030 | |
1076 | |
| 1031 | croak "putUserSet: requires 1 argument" |
1077 | croak "putUserSet: requires 1 argument" |
| 1032 | unless @_ == 2; |
1078 | unless @_ == 2; |
| 1033 | croak "putUserSet: argument 1 must be of type ", $self->{set_user}->{record} |
1079 | croak "putUserSet: argument 1 must be of type ", $self->{set_user}->{record} |
| 1034 | unless ref $UserSet eq $self->{set_user}->{record}; |
1080 | unless ref $UserSet eq $self->{set_user}->{record}; |
|
|
1081 | |
|
|
1082 | checkKeyfields($UserSet); |
|
|
1083 | |
| 1035 | croak "putUserSet: user set not found (perhaps you meant to use addUserSet?)" |
1084 | croak "putUserSet: user set not found (perhaps you meant to use addUserSet?)" |
| 1036 | unless $self->{set_user}->exists($UserSet->user_id, $UserSet->set_id); |
1085 | unless $self->{set_user}->exists($UserSet->user_id, $UserSet->set_id); |
| 1037 | croak "putUserSet: user ", $UserSet->user_id, " not found" |
1086 | croak "putUserSet: user ", $UserSet->user_id, " not found" |
| 1038 | unless $self->{user}->exists($UserSet->user_id); |
1087 | unless $self->{user}->exists($UserSet->user_id); |
| 1039 | croak "putUserSet: set ", $UserSet->set_id, " not found" |
1088 | croak "putUserSet: set ", $UserSet->set_id, " not found" |
| 1040 | unless $self->{set}->exists($UserSet->set_id); |
1089 | unless $self->{set}->exists($UserSet->set_id); |
| 1041 | |
1090 | |
| 1042 | checkKeyfields($UserSet); |
|
|
| 1043 | |
|
|
| 1044 | return $self->{set_user}->put($UserSet); |
1091 | return $self->{set_user}->put($UserSet); |
| 1045 | } |
1092 | } |
| 1046 | |
1093 | |
| 1047 | sub deleteUserSet($$$) { |
1094 | sub deleteUserSet($$$) { |
| 1048 | my ($self, $userID, $setID) = @_; |
1095 | my ($self, $userID, $setID) = @_; |
| … | |
… | |
| 1075 | =over |
1122 | =over |
| 1076 | |
1123 | |
| 1077 | =cut |
1124 | =cut |
| 1078 | |
1125 | |
| 1079 | sub newGlobalProblem { |
1126 | sub newGlobalProblem { |
| 1080 | my ($self, $prototype) = @_; |
1127 | my ($self, @prototype) = @_; |
| 1081 | return $self->{problem}->{record}->new($prototype); |
1128 | return $self->{problem}->{record}->new(@prototype); |
| 1082 | } |
1129 | } |
| 1083 | |
1130 | |
| 1084 | sub listGlobalProblems($$) { |
1131 | sub listGlobalProblems($$) { |
| 1085 | my ($self, $setID) = @_; |
1132 | my ($self, $setID) = @_; |
| 1086 | |
1133 | |
| … | |
… | |
| 1098 | |
1145 | |
| 1099 | croak "addGlobalProblem: requires 1 argument" |
1146 | croak "addGlobalProblem: requires 1 argument" |
| 1100 | unless @_ == 2; |
1147 | unless @_ == 2; |
| 1101 | croak "addGlobalProblem: argument 1 must be of type ", $self->{problem}->{record} |
1148 | croak "addGlobalProblem: argument 1 must be of type ", $self->{problem}->{record} |
| 1102 | unless ref $GlobalProblem eq $self->{problem}->{record}; |
1149 | unless ref $GlobalProblem eq $self->{problem}->{record}; |
|
|
1150 | |
|
|
1151 | checkKeyfields($GlobalProblem); |
|
|
1152 | |
| 1103 | croak "addGlobalProblem: global problem exists (perhaps you meant to use putGlobalProblem?)" |
1153 | croak "addGlobalProblem: global problem exists (perhaps you meant to use putGlobalProblem?)" |
| 1104 | if $self->{problem}->exists($GlobalProblem->set_id, $GlobalProblem->problem_id); |
1154 | if $self->{problem}->exists($GlobalProblem->set_id, $GlobalProblem->problem_id); |
| 1105 | croak "addGlobalProblem: set ", $GlobalProblem->set_id, " not found" |
1155 | croak "addGlobalProblem: set ", $GlobalProblem->set_id, " not found" |
| 1106 | unless $self->{set}->exists($GlobalProblem->set_id); |
1156 | unless $self->{set}->exists($GlobalProblem->set_id); |
| 1107 | |
|
|
| 1108 | checkKeyfields($GlobalProblem); |
|
|
| 1109 | |
1157 | |
| 1110 | return $self->{problem}->add($GlobalProblem); |
1158 | return $self->{problem}->add($GlobalProblem); |
| 1111 | } |
1159 | } |
| 1112 | |
1160 | |
| 1113 | sub getGlobalProblem($$$) { |
1161 | sub getGlobalProblem($$$) { |
| … | |
… | |
| 1154 | |
1202 | |
| 1155 | croak "putGlobalProblem: requires 1 argument" |
1203 | croak "putGlobalProblem: requires 1 argument" |
| 1156 | unless @_ == 2; |
1204 | unless @_ == 2; |
| 1157 | croak "putGlobalProblem: argument 1 must be of type ", $self->{problem}->{record} |
1205 | croak "putGlobalProblem: argument 1 must be of type ", $self->{problem}->{record} |
| 1158 | unless ref $GlobalProblem eq $self->{problem}->{record}; |
1206 | unless ref $GlobalProblem eq $self->{problem}->{record}; |
|
|
1207 | |
|
|
1208 | checkKeyfields($GlobalProblem); |
|
|
1209 | |
| 1159 | croak "putGlobalProblem: global problem not found (perhaps you meant to use addGlobalProblem?)" |
1210 | croak "putGlobalProblem: global problem not found (perhaps you meant to use addGlobalProblem?)" |
| 1160 | unless $self->{problem}->exists($GlobalProblem->set_id, $GlobalProblem->problem_id); |
1211 | unless $self->{problem}->exists($GlobalProblem->set_id, $GlobalProblem->problem_id); |
| 1161 | croak "putGlobalProblem: set ", $GlobalProblem->set_id, " not found" |
1212 | croak "putGlobalProblem: set ", $GlobalProblem->set_id, " not found" |
| 1162 | unless $self->{set}->exists($GlobalProblem->set_id); |
1213 | unless $self->{set}->exists($GlobalProblem->set_id); |
| 1163 | |
|
|
| 1164 | checkKeyfields($GlobalProblem); |
|
|
| 1165 | |
1214 | |
| 1166 | return $self->{problem}->put($GlobalProblem); |
1215 | return $self->{problem}->put($GlobalProblem); |
| 1167 | } |
1216 | } |
| 1168 | |
1217 | |
| 1169 | sub deleteGlobalProblem($$$) { |
1218 | sub deleteGlobalProblem($$$) { |
| … | |
… | |
| 1197 | =over |
1246 | =over |
| 1198 | |
1247 | |
| 1199 | =cut |
1248 | =cut |
| 1200 | |
1249 | |
| 1201 | sub newUserProblem { |
1250 | sub newUserProblem { |
| 1202 | my ($self, $prototype) = @_; |
1251 | my ($self, @prototype) = @_; |
| 1203 | return $self->{problem_user}->{record}->new($prototype); |
1252 | return $self->{problem_user}->{record}->new(@prototype); |
| 1204 | } |
1253 | } |
| 1205 | |
1254 | |
| 1206 | sub listProblemUsers($$$) { |
1255 | sub listProblemUsers($$$) { |
| 1207 | my ($self, $setID, $problemID) = @_; |
1256 | my ($self, $setID, $problemID) = @_; |
| 1208 | |
1257 | |
| … | |
… | |
| 1236 | |
1285 | |
| 1237 | croak "addUserProblem: requires 1 argument" |
1286 | croak "addUserProblem: requires 1 argument" |
| 1238 | unless @_ == 2; |
1287 | unless @_ == 2; |
| 1239 | croak "addUserProblem: argument 1 must be of type ", $self->{problem_user}->{record} |
1288 | croak "addUserProblem: argument 1 must be of type ", $self->{problem_user}->{record} |
| 1240 | unless ref $UserProblem eq $self->{problem_user}->{record}; |
1289 | unless ref $UserProblem eq $self->{problem_user}->{record}; |
|
|
1290 | |
|
|
1291 | checkKeyfields($UserProblem); |
|
|
1292 | |
| 1241 | croak "addUserProblem: user problem exists (perhaps you meant to use putUserProblem?)" |
1293 | croak "addUserProblem: user problem exists (perhaps you meant to use putUserProblem?)" |
| 1242 | if $self->{problem_user}->exists($UserProblem->user_id, $UserProblem->set_id, $UserProblem->problem_id); |
1294 | if $self->{problem_user}->exists($UserProblem->user_id, $UserProblem->set_id, $UserProblem->problem_id); |
| 1243 | croak "addUserProblem: user set ", $UserProblem->set_id, " for user ", $UserProblem->user_id, " not found" |
1295 | croak "addUserProblem: user set ", $UserProblem->set_id, " for user ", $UserProblem->user_id, " not found" |
| 1244 | unless $self->{set_user}->exists($UserProblem->user_id, $UserProblem->set_id); |
1296 | unless $self->{set_user}->exists($UserProblem->user_id, $UserProblem->set_id); |
| 1245 | croak "addUserProblem: problem ", $UserProblem->problem_id, " in set ", $UserProblem->set_id, " not found" |
1297 | croak "addUserProblem: problem ", $UserProblem->problem_id, " in set ", $UserProblem->set_id, " not found" |
| 1246 | unless $self->{problem}->exists($UserProblem->set_id, $UserProblem->problem_id); |
1298 | unless $self->{problem}->exists($UserProblem->set_id, $UserProblem->problem_id); |
| 1247 | |
|
|
| 1248 | checkKeyfields($UserProblem); |
|
|
| 1249 | |
1299 | |
| 1250 | return $self->{problem_user}->add($UserProblem); |
1300 | return $self->{problem_user}->add($UserProblem); |
| 1251 | } |
1301 | } |
| 1252 | |
1302 | |
| 1253 | sub getUserProblem($$$$) { |
1303 | sub getUserProblem($$$$) { |
| … | |
… | |
| 1299 | |
1349 | |
| 1300 | croak "putUserProblem: requires 1 argument" |
1350 | croak "putUserProblem: requires 1 argument" |
| 1301 | unless @_ == 2; |
1351 | unless @_ == 2; |
| 1302 | croak "putUserProblem: argument 1 must be of type ", $self->{problem_user}->{record} |
1352 | croak "putUserProblem: argument 1 must be of type ", $self->{problem_user}->{record} |
| 1303 | unless ref $UserProblem eq $self->{problem_user}->{record}; |
1353 | unless ref $UserProblem eq $self->{problem_user}->{record}; |
|
|
1354 | |
|
|
1355 | checkKeyfields($UserProblem); |
|
|
1356 | |
| 1304 | croak "putUserProblem: user set ", $UserProblem->set_id, " for user ", $UserProblem->user_id, " not found" |
1357 | croak "putUserProblem: user set ", $UserProblem->set_id, " for user ", $UserProblem->user_id, " not found" |
| 1305 | unless $self->{set_user}->exists($UserProblem->user_id, $UserProblem->set_id); |
1358 | unless $self->{set_user}->exists($UserProblem->user_id, $UserProblem->set_id); |
| 1306 | croak "putUserProblem: user problem not found (perhaps you meant to use addUserProblem?)" |
1359 | croak "putUserProblem: user problem not found (perhaps you meant to use addUserProblem?)" |
| 1307 | unless $self->{problem_user}->exists($UserProblem->user_id, $UserProblem->set_id, $UserProblem->problem_id); |
1360 | unless $self->{problem_user}->exists($UserProblem->user_id, $UserProblem->set_id, $UserProblem->problem_id); |
| 1308 | croak "putUserProblem: problem ", $UserProblem->problem_id, " in set ", $UserProblem->set_id, " not found" |
1361 | croak "putUserProblem: problem ", $UserProblem->problem_id, " in set ", $UserProblem->set_id, " not found" |
| 1309 | unless $self->{problem}->exists($UserProblem->set_id, $UserProblem->problem_id); |
1362 | unless $self->{problem}->exists($UserProblem->set_id, $UserProblem->problem_id); |
| 1310 | |
|
|
| 1311 | checkKeyfields($UserProblem); |
|
|
| 1312 | |
1363 | |
| 1313 | return $self->{problem_user}->put($UserProblem); |
1364 | return $self->{problem_user}->put($UserProblem); |
| 1314 | } |
1365 | } |
| 1315 | |
1366 | |
| 1316 | sub deleteUserProblem($$$$) { |
1367 | sub deleteUserProblem($$$$) { |
| … | |
… | |
| 1395 | and @{$userSetIDs[$i]} == 2 |
1446 | and @{$userSetIDs[$i]} == 2 |
| 1396 | and defined $userSetIDs[$i]->[0] |
1447 | and defined $userSetIDs[$i]->[0] |
| 1397 | and defined $userSetIDs[$i]->[1]; |
1448 | and defined $userSetIDs[$i]->[1]; |
| 1398 | } |
1449 | } |
| 1399 | |
1450 | |
| 1400 | my @UserSets = $self->getUserSets(@userSetIDs); |
1451 | my @UserSets = $self->getUserSets(@userSetIDs); # checked |
| 1401 | |
1452 | |
| 1402 | my @globalSetIDs = map { $_->[1] } @userSetIDs; |
1453 | my @globalSetIDs = map { $_->[1] } @userSetIDs; |
| 1403 | my @GlobalSets = $self->getGlobalSets(@globalSetIDs); |
1454 | my @GlobalSets = $self->getGlobalSets(@globalSetIDs); # checked |
| 1404 | |
1455 | |
| 1405 | my %globalSetFields = map { $_ => 1 } $self->newGlobalSet->FIELDS; |
1456 | my %globalSetFields = map { $_ => 1 } $self->newGlobalSet->FIELDS; |
| 1406 | my @commonFields = grep { exists $globalSetFields{$_} } $self->newUserSet->FIELDS; |
1457 | my @commonFields = grep { exists $globalSetFields{$_} } $self->newUserSet->FIELDS; |
| 1407 | |
1458 | |
| 1408 | for (my $i = 0; $i < @UserSets; $i++) { |
1459 | for (my $i = 0; $i < @UserSets; $i++) { |
| 1409 | my $UserSet = $UserSets[$i]; |
1460 | my $UserSet = $UserSets[$i]; |
| 1410 | my $GlobalSet = $GlobalSets[$i]; |
1461 | my $GlobalSet = $GlobalSets[$i]; |
| 1411 | next unless $UserSet and $GlobalSet; |
1462 | next unless defined $UserSet and defined $GlobalSet; |
| 1412 | #warn "---------- USER SET\n", $UserSet->toString, "---------- USER SET\n"; |
1463 | #warn "---------- USER SET\n", $UserSet->toString, "---------- USER SET\n"; |
| 1413 | #warn "---------- GLOBAL SET\n", $GlobalSet->toString, "---------- GLOBAL SET\n"; |
1464 | #warn "---------- GLOBAL SET\n", $GlobalSet->toString, "---------- GLOBAL SET\n"; |
| 1414 | foreach my $field (@commonFields) { |
1465 | foreach my $field (@commonFields) { |
| 1415 | next if defined $UserSet->$field; |
1466 | next if defined $UserSet->$field; |
| 1416 | #warn "using global value for field $field\n"; |
1467 | #warn "using global value for field $field\n"; |
| … | |
… | |
| 1510 | and defined $userProblemIDs[$i]->[0] |
1561 | and defined $userProblemIDs[$i]->[0] |
| 1511 | and defined $userProblemIDs[$i]->[1] |
1562 | and defined $userProblemIDs[$i]->[1] |
| 1512 | and defined $userProblemIDs[$i]->[2]; |
1563 | and defined $userProblemIDs[$i]->[2]; |
| 1513 | } |
1564 | } |
| 1514 | |
1565 | |
| 1515 | my @UserProblems = $self->getUserProblems(@userProblemIDs); |
1566 | my @UserProblems = $self->getUserProblems(@userProblemIDs); # checked |
| 1516 | |
1567 | |
| 1517 | my @globalProblemIDs = map { [ $_->[1], $_->[2] ] } @userProblemIDs; |
1568 | my @globalProblemIDs = map { [ $_->[1], $_->[2] ] } @userProblemIDs; |
| 1518 | my @GlobalProblems = $self->getGlobalProblems(@globalProblemIDs); |
1569 | my @GlobalProblems = $self->getGlobalProblems(@globalProblemIDs); # checked |
| 1519 | |
1570 | |
| 1520 | my %globalProblemFields = map { $_ => 1 } $self->newGlobalProblem->FIELDS; |
1571 | my %globalProblemFields = map { $_ => 1 } $self->newGlobalProblem->FIELDS; |
| 1521 | my @commonFields = grep { exists $globalProblemFields{$_} } $self->newUserProblem->FIELDS; |
1572 | my @commonFields = grep { exists $globalProblemFields{$_} } $self->newUserProblem->FIELDS; |
| 1522 | |
1573 | |
| 1523 | for (my $i = 0; $i < @UserProblems; $i++) { |
1574 | for (my $i = 0; $i < @UserProblems; $i++) { |
| 1524 | my $UserProblem = $UserProblems[$i]; |
1575 | my $UserProblem = $UserProblems[$i]; |
| 1525 | my $GlobalProblem = $GlobalProblems[$i]; |
1576 | my $GlobalProblem = $GlobalProblems[$i]; |
| 1526 | next unless $UserProblem and $GlobalProblem; |
1577 | next unless defined $UserProblem and defined $GlobalProblem; |
| 1527 | foreach my $field (@commonFields) { |
1578 | foreach my $field (@commonFields) { |
| 1528 | next if defined $UserProblem->$field; |
1579 | next if defined $UserProblem->$field; |
| 1529 | $UserProblem->$field($GlobalProblem->$field); |
1580 | $UserProblem->$field($GlobalProblem->$field); |
| 1530 | } |
1581 | } |
| 1531 | } |
1582 | } |
| … | |
… | |
| 1545 | # my ($self, $table) = @_; |
1596 | # my ($self, $table) = @_; |
| 1546 | # return $self->{$table}->dumpDB(); |
1597 | # return $self->{$table}->dumpDB(); |
| 1547 | #} |
1598 | #} |
| 1548 | |
1599 | |
| 1549 | ################################################################################ |
1600 | ################################################################################ |
| 1550 | # sanity checking |
1601 | # utilities |
| 1551 | ################################################################################ |
1602 | ################################################################################ |
| 1552 | |
1603 | |
| 1553 | sub checkKeyfields($) { |
1604 | sub checkKeyfields($) { |
| 1554 | my ($Record) = @_; |
1605 | my ($Record) = @_; |
| 1555 | foreach my $keyfield ($Record->KEYFIELDS) { |
1606 | foreach my $keyfield ($Record->KEYFIELDS) { |
| 1556 | my $value = $Record->$keyfield; |
1607 | my $value = $Record->$keyfield; |
| 1557 | croak "checkKeyfields: $keyfield is empty" |
1608 | croak "checkKeyfields: $keyfield is empty" |
| 1558 | unless defined $value and $value ne ""; |
1609 | unless defined $value and $value ne ""; |
| 1559 | |
1610 | |
| 1560 | if ($keyfield eq "problem_id") { |
1611 | if ($keyfield eq "problem_id") { |
| 1561 | croak "checkKeyfields: invalid characters in $keyfield field: $value (valid characters are [0-9])" |
1612 | croak "checkKeyfields: invalid characters in $keyfield field: $value (valid characters are [0-9])" |
| 1562 | unless $value =~ m/^\d*$/; |
1613 | unless $value =~ m/^\d*$/; |
| 1563 | } else { |
1614 | } else { |
| 1564 | croak "checkKeyfields: invalid characters in $keyfield field: $value (valid characters are [A-Za-z0-9_])" |
1615 | croak "checkKeyfields: invalid characters in $keyfield field: $value (valid characters are [A-Za-z0-9_])" |