summaryrefslogtreecommitdiffstats
path: root/Bugzilla/Object.pm
diff options
context:
space:
mode:
authormkanat%bugzilla.org <>2006-08-11 02:53:07 +0200
committermkanat%bugzilla.org <>2006-08-11 02:53:07 +0200
commit91986ae4f25eed69862b8d0b5f176e84339c6052 (patch)
treeb407cef033d75245170e635d95bd7ba40caa4eea /Bugzilla/Object.pm
parent84c1e818ec0e777390042ab89cce496cdc7358a9 (diff)
downloadbugzilla-91986ae4f25eed69862b8d0b5f176e84339c6052.tar.gz
bugzilla-91986ae4f25eed69862b8d0b5f176e84339c6052.tar.xz
Bug 347061: Create Bugzilla::Object->create and make Bugzilla::Keyword use it
Patch By Max Kanat-Alexander <mkanat@bugzilla.org> r=bkor, a=myk
Diffstat (limited to 'Bugzilla/Object.pm')
-rw-r--r--Bugzilla/Object.pm71
1 files changed, 71 insertions, 0 deletions
diff --git a/Bugzilla/Object.pm b/Bugzilla/Object.pm
index 56789f584..c250f80fd 100644
--- a/Bugzilla/Object.pm
+++ b/Bugzilla/Object.pm
@@ -108,6 +108,45 @@ sub name { return $_[0]->{'name'}; }
#### Subroutines ######
###############################
+sub create {
+ my ($class, $params) = @_;
+ my $dbh = Bugzilla->dbh;
+
+ my $required = $class->REQUIRED_CREATE_FIELDS;
+ my $validators = $class->VALIDATORS;
+ my $table = $class->DB_TABLE;
+
+ foreach my $field ($class->REQUIRED_CREATE_FIELDS) {
+ ThrowCodeError('param_required',
+ { function => "${class}->create", param => $field })
+ if !exists $params->{$field};
+ }
+
+ my (@field_names, @values);
+ # We do the sort just to make sure that validation always
+ # happens in a consistent order.
+ foreach my $field (sort keys %$params) {
+ my $value;
+ if (exists $validators->{$field}) {
+ $value = &{$validators->{$field}}($params->{$field});
+ }
+ else {
+ $value = $params->{$field};
+ }
+ trick_taint($value);
+ push(@field_names, $field);
+ push(@values, $value);
+ }
+
+ my $qmarks = '?,' x @values;
+ chop($qmarks);
+ $dbh->do("INSERT INTO $table (" . join(', ', @field_names)
+ . ") VALUES ($qmarks)", undef, @values);
+ my $id = $dbh->bz_last_key($table, 'id');
+
+ return $class->new($id);
+}
+
sub get_all {
my $class = shift;
my $dbh = Bugzilla->dbh;
@@ -173,6 +212,19 @@ The order that C<new_from_list> and C<get_all> should return objects
in. This should be the name of a database column. Defaults to
C<name>.
+=item C<REQUIRED_CREATE_FIELDS>
+
+The list of fields that B<must> be specified when the user calls
+C<create()>. This should be an array.
+
+=item C<VALIDATORS>
+
+A hashref that points to a function that will validate each param to
+C<create()>. Each function in this hashref will be passed a single
+argument, the value passed to C<create()> for that field. These
+functions should call L<Bugzilla::Error/ThrowUserError> if they fail.
+They must return the validated value.
+
=back
=head1 METHODS
@@ -210,6 +262,25 @@ C<name>.
=over
+=item C<create($params)>
+
+Description: Creates a new item in the database.
+ Throws a User Error if any of the passed-in params
+ are invalid.
+
+Params: C<$params> - hashref - A value to put in each database
+ field for this object. Certain values must be set (the
+ ones specified in L</REQUIRED_CREATE_FIELDS>), and
+ the function will throw a Code Error if you don't set
+ them.
+
+Returns: The Object just created in the database.
+
+Notes: In order for this function to work in your subclass,
+ your subclass's C<id> field must be of C<SERIAL>
+ type in the database. Your subclass also must
+ define L</REQUIRED_CREATE_FIELDS> and L</VALIDATORS>.
+
=item C<get_all>
Description: Returns all objects in this table from the database.