diff --git a/README.md b/README.textile similarity index 100% rename from README.md rename to README.textile diff --git a/lib/Redmine/DB/CTX.pm b/lib/Redmine/DB/CTX.pm index e9d1634f78f9ef7c157d0533ec63562c6bd22af3..824b93304a5dea4bd1162bee7ffad289cedcf61b 100644 --- a/lib/Redmine/DB/CTX.pm +++ b/lib/Redmine/DB/CTX.pm @@ -109,7 +109,7 @@ sub get_DDL { return ($TABLE_sync_contexts, $TABLE_syncs); } =head2 $context->init_translation() -Read the known translation table for the give synchronisation context +Read the known translation table for the given synchronisation context and keep it around. =cut diff --git a/lib/Redmine/DB/MySQL.pm b/lib/Redmine/DB/MySQL.pm index cd49e17c20576fd86545dcf2e60b7397d6ac6ee8..ca7c36794a6befeabe9def8cbd63086de8f65028 100644 --- a/lib/Redmine/DB/MySQL.pm +++ b/lib/Redmine/DB/MySQL.pm @@ -98,6 +98,47 @@ sub get_all_x $tt; } +sub fetch_custom +{ + my $db= shift; + my $cfid= shift; + my $cfty= shift || 'Issue'; + + my $res= $db->get_all_x ('custom_values', + [ "custom_field_id=? and customized_type=?", $cfid, $cfty ]); + $res; +} + +sub change_custom_value +{ + my $db= shift; + my $cfid= shift; + my $cfty= shift || 'Issue'; + my $cfref= shift; # ticket number or whatever + my $cfrid= shift; # record id + my $cfval= shift; + + my $data= + { customized_type => $cfty, customized_id => $cfref, + custom_field_id => $cfid, value => $cfval }; + + print "change_custom_value: cfrid=[$cfrid] ", join (' ', %$data), "\n"; + # return 0; # TODO: add flag to supress changes + + my $res; + if (defined ($cfrid)) + { + $db->update ('custom_values', $cfrid, $data); + $res= $cfrid; + } + else + { + $res= $db->insert ('custom_values', $data); + } + + $res; +} + sub insert { my $self= shift; @@ -153,7 +194,7 @@ sub update } push (@vals, $id); - my $ssu= "UPDATE `$table` SET ". join (' ', map { $_.'=?' } @vars) . ' WHERE id=?'; + my $ssu= "UPDATE `$table` SET ". join (', ', map { $_.'=?' } @vars) . ' WHERE id=?'; print "ssu=[$ssu]\n"; print "vals: ", join (',', @vals), "\n"; my $sth= $dbh->prepare($ssu); diff --git a/lib/Redmine/Wrapper.pm b/lib/Redmine/Wrapper.pm new file mode 100644 index 0000000000000000000000000000000000000000..3fcad8887d17216c053027d6b8fea7e3d190d27d --- /dev/null +++ b/lib/Redmine/Wrapper.pm @@ -0,0 +1,123 @@ + +package Redmine::Wrapper; + +use strict; + +use WebService::Redmine; + +sub new +{ + my $class= shift; + + my $obj= {}; + bless $obj, $class; + + $obj->set (@_); + + $obj; +} + +sub set +{ + my $obj= shift; + my %par= @_; + + my %res; + foreach my $par (keys %par) + { + $res{$par}= $obj->{$par}; + $obj->{$par}= $par{$par}; + } + + (wantarray) ? %res : \%res; +} + +# TODO: attach or connect are not really good names +sub attach +{ + my $self= shift; + + return $self->{_rm} if (exists ($self->{_rm})); + + my $rm= new WebService::Redmine (%{$self->{'cfg'}->{'redmine'}}); + # print "rm: ", Dumper ($rm); + $self->{_rm}= $rm; +} + +sub fixup_issue +{ + my $self= shift; + my $issue= shift; + my $par= shift; + + foreach my $key (keys %$par) + { + if ($key eq 'custom_fields') + { + transcribe_custom_fields ($self->{'cfg'}->{'custom_field_ids'}, $issue, $par->{'custom_fields'}); + } + } +} + +=head1 INTERNAL FUNCTIONS + +=head2 transcribe_custom_fields ($custom_field_id_mapping_table, $issue, $key_value_hashref) + +transcribe custom fields from a simple key/value list in +$key_value_hashref into a hash_ref representing an issue +($issue) using a mapping table for custom field ids stored in +$custom_filed_id_mapping_table. + +=cut + +sub transcribe_custom_fields +{ + my $ids= shift; + my $issue= shift; + my $kv= shift; + + print "ids: ", main::Dumper($ids); + + $issue->{custom_fields}= [] unless (defined ($issue->{custom_fields})); + my $cf= $issue->{custom_fields}; + my %idx; + for (my $i= 0; $i <= $#$cf; $i++) + { + my $cf_i= $cf->[$i]; + $idx{$cf_i->{'name'}}= $i; + } + print "cf: ", main::Dumper($cf); + + # update incoming custom fields + AN: foreach my $an (keys %$kv) + { + unless (exists ($ids->{$an})) + { + print "an=[$an] not present in id mapping table\n"; + next AN; + } + + my $new_val= + { + 'value' => $kv->{$an}, + 'id' => $ids->{$an}, + 'name' => $an, + }; + + if (exists ($idx{$an})) + { + $cf->[$idx{$an}]= $new_val; + } + else + { + push (@$cf, $new_val); # TODO: maybe we should update %idx here as well + } + } + + print "issue: ", main::Dumper($issue); +} + +1; + +__END__ +