PageRenderTime 61ms CodeModel.GetById 26ms RepoModel.GetById 1ms app.codeStats 0ms

/web/modules/rhn/RHN/DB/ErrataEditor.pm

https://github.com/colloquium/spacewalk
Perl | 334 lines | 245 code | 75 blank | 14 comment | 7 complexity | dc3aa58a2606fd868ad1a639c26c47a3 MD5 | raw file
  1. #
  2. # Copyright (c) 2008--2010 Red Hat, Inc.
  3. #
  4. # This software is licensed to you under the GNU General Public License,
  5. # version 2 (GPLv2). There is NO WARRANTY for this software, express or
  6. # implied, including the implied warranties of MERCHANTABILITY or FITNESS
  7. # FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
  8. # along with this software; if not, see
  9. # http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
  10. #
  11. # Red Hat trademarks are not licensed under GPLv2. No permission is
  12. # granted to use or replicate Red Hat trademarks that are incorporated
  13. # in this software or its documentation.
  14. #
  15. use strict;
  16. package RHN::DB::ErrataEditor;
  17. use RHN::DB;
  18. use RHN::Errata;
  19. use RHN::ErrataTmp;
  20. use RHN::DataSource::Errata;
  21. use RHN::Exception qw/throw/;
  22. use Params::Validate qw/:all/;
  23. Params::Validate::validation_options(strip_leading => "-");
  24. sub publish_errata {
  25. my $class = shift;
  26. my $temp_errata = shift;
  27. my $transaction = shift;
  28. throw "RHN::ErrataEditor::publish_errata - no temp_errata param"
  29. unless ($temp_errata);
  30. my $dbh = $transaction || RHN::DB->connect;
  31. $dbh->nest_transactions;
  32. my $new_errata = RHN::Errata->create_errata;
  33. foreach my $meth ($temp_errata->method_names) {
  34. $new_errata->$meth($temp_errata->$meth());
  35. }
  36. $new_errata->commit(0, $dbh);
  37. my $temp_eid = $temp_errata->id;
  38. my $new_eid = $new_errata->id;
  39. my ($query, $sth);
  40. $query =<<EOQ;
  41. INSERT
  42. INTO rhnErrataBugList
  43. (errata_id, bug_id, summary)
  44. (SELECT :new_eid, BL.bug_id, BL.summary
  45. FROM rhnErrataBuglistTmp BL
  46. WHERE BL.errata_id = :temp_eid)
  47. EOQ
  48. $sth = $dbh->prepare($query);
  49. $sth->execute_h(new_eid => $new_eid, temp_eid => $temp_eid);
  50. $query =<<EOQ;
  51. DELETE FROM rhnErrataBugListTmp
  52. WHERE errata_id = :temp_eid
  53. EOQ
  54. $sth = $dbh->prepare($query);
  55. $sth->execute_h(temp_eid => $temp_eid);
  56. $query =<<EOQ;
  57. INSERT
  58. INTO rhnErrataPackage
  59. (errata_id, package_id)
  60. (SELECT :new_eid, EP.package_id
  61. FROM rhnErrataPackageTmp EP
  62. WHERE EP.errata_id = :temp_eid)
  63. EOQ
  64. $sth = $dbh->prepare($query);
  65. $sth->execute_h(new_eid => $new_eid, temp_eid => $temp_eid);
  66. $query =<<EOQ;
  67. DELETE FROM rhnErrataPackageTmp
  68. WHERE errata_id = :temp_eid
  69. EOQ
  70. $sth = $dbh->prepare($query);
  71. $sth->execute_h(temp_eid => $temp_eid);
  72. $query =<<EOQ;
  73. INSERT
  74. INTO rhnErrataKeyword
  75. (errata_id, keyword)
  76. (SELECT :new_eid, EK.keyword
  77. FROM rhnErrataKeywordTmp EK
  78. WHERE EK.errata_id = :temp_eid)
  79. EOQ
  80. $sth = $dbh->prepare($query);
  81. $sth->execute_h(new_eid => $new_eid, temp_eid => $temp_eid);
  82. $query =<<EOQ;
  83. DELETE FROM rhnErrataKeywordTmp
  84. WHERE errata_id = :temp_eid
  85. EOQ
  86. $sth = $dbh->prepare($query);
  87. $sth->execute_h(temp_eid => $temp_eid);
  88. $query =<<EOQ;
  89. INSERT
  90. INTO rhnErrataCloned
  91. (original_id, id)
  92. (SELECT ECT.original_id, :new_eid
  93. FROM rhnErrataClonedTmp ECT
  94. WHERE ECT.id = :temp_eid)
  95. EOQ
  96. $sth = $dbh->prepare($query);
  97. $sth->execute_h(new_eid => $new_eid, temp_eid => $temp_eid);
  98. $query =<<EOQ;
  99. DELETE
  100. FROM rhnErrataClonedTmp ECT
  101. WHERE ECT.id = :temp_eid
  102. OR ECT.original_id = :temp_eid
  103. EOQ
  104. $sth = $dbh->prepare($query);
  105. $sth->execute_h(temp_eid => $temp_eid);
  106. $query =<<EOQ;
  107. DELETE FROM rhnErrataTmp
  108. WHERE id = :temp_eid
  109. EOQ
  110. $sth = $dbh->prepare($query);
  111. $sth->execute_h(temp_eid => $temp_eid);
  112. $query =<<EOQ;
  113. INSERT INTO rhnErrataCve
  114. (errata_id, cve_id)
  115. (SELECT ECL.id, EC.cve_id
  116. FROM rhnErrataCVE EC, rhnErrataCloned ECL
  117. WHERE ECL.original_id = EC.errata_id
  118. AND ECL.id = :new_eid)
  119. EOQ
  120. $sth = $dbh->prepare($query);
  121. $sth->execute_h(new_eid => $new_eid);
  122. my $errata = RHN::ErrataTmp->lookup_managed_errata(-id => $new_eid);
  123. $errata->refresh_erratafiles();
  124. $dbh->nested_commit;
  125. return ($new_eid);
  126. }
  127. sub find_next_advisory {
  128. my $adv = shift || '';
  129. my $adv_name = shift || '';
  130. my $suffix = '';
  131. my $i = 1;
  132. $adv = 'CL' . substr($adv, 3);
  133. $adv_name = 'CL' . substr($adv_name, 3);
  134. if (advisory_exists($adv) || advisory_name_exists($adv_name)) {
  135. $suffix = sprintf("-%u", $i++);
  136. $adv = $adv . $suffix;
  137. $adv_name = $adv_name . $suffix;
  138. while (advisory_exists($adv) || advisory_name_exists($adv_name)) {
  139. substr($adv, -1, 1) = $i;
  140. substr($adv_name, -1, 1) = $i;
  141. $i++;
  142. }
  143. }
  144. return ($adv, $adv_name);
  145. }
  146. sub clone_into_org {
  147. my $class = shift;
  148. my $old_eid = shift;
  149. my $org_id = shift;
  150. throw "No eid" unless $old_eid;
  151. my $errata = RHN::Errata->lookup(-id => $old_eid);
  152. my $new = RHN::ErrataTmp->create_errata;
  153. my $update_date = $errata->update_date;
  154. foreach my $meth ($errata->method_names) {
  155. $new->$meth($errata->$meth());
  156. }
  157. my $new_update = $new->update_date;
  158. $new->org_id($org_id);
  159. my $adv = $new->advisory;
  160. my $adv_name = $new->advisory_name;
  161. ($adv, $adv_name) = find_next_advisory($adv, $adv_name);
  162. $new->advisory($adv);
  163. $new->advisory_name($adv_name);
  164. $new->commit(0);
  165. my $new_eid = $new->id;
  166. my $dbh = RHN::DB->connect;
  167. my ($query, $sth);
  168. $query =<<EOQ;
  169. INSERT
  170. INTO rhnErrataBugListTmp
  171. (errata_id, bug_id, summary)
  172. (SELECT :new_eid, BL.bug_id, BL.summary
  173. FROM rhnErrataBuglist BL
  174. WHERE BL.errata_id = :old_eid)
  175. EOQ
  176. $sth = $dbh->prepare($query);
  177. $sth->execute_h(new_eid => $new_eid, old_eid => $old_eid);
  178. $query =<<EOQ;
  179. INSERT
  180. INTO rhnErrataPackageTmp
  181. (errata_id, package_id)
  182. (SELECT :new_eid, EP.package_id
  183. FROM rhnErrataPackage EP
  184. WHERE EP.errata_id = :old_eid)
  185. EOQ
  186. $sth = $dbh->prepare($query);
  187. $sth->execute_h(new_eid => $new_eid, old_eid => $old_eid);
  188. $query =<<EOQ;
  189. INSERT
  190. INTO rhnErrataFileTmp
  191. (id, errata_id, type, checksum_id, filename)
  192. (SELECT rhn_erratafile_id_seq.nextval, :new_eid, EF.type, EF.checksum_id, EF.filename
  193. FROM rhnErrataFile EF
  194. WHERE EF.errata_id = :old_eid)
  195. EOQ
  196. $sth = $dbh->prepare($query);
  197. $sth->execute_h(new_eid => $new_eid, old_eid => $old_eid);
  198. $query =<<EOQ;
  199. INSERT
  200. INTO rhnErrataKeywordTmp
  201. (errata_id, keyword)
  202. (SELECT :new_eid, EK.keyword
  203. FROM rhnErrataKeyword EK
  204. WHERE EK.errata_id = :old_eid)
  205. EOQ
  206. $sth = $dbh->prepare($query);
  207. $sth->execute_h(new_eid => $new_eid, old_eid => $old_eid);
  208. $query =<<EOQ;
  209. INSERT
  210. INTO rhnErrataClonedTmp
  211. (original_id, id)
  212. VALUES
  213. (:old_eid, :new_eid)
  214. EOQ
  215. $sth = $dbh->prepare($query);
  216. $sth->execute_h(new_eid => $new_eid, old_eid => $old_eid);
  217. return ($new_eid);
  218. }
  219. sub advisory_exists {
  220. my $adv = shift;
  221. my $dbh = RHN::DB->connect;
  222. my $query =<<EOQ;
  223. SELECT 1
  224. FROM dual
  225. WHERE EXISTS (SELECT 1 FROM rhnErrata E WHERE E.advisory = :advisory)
  226. OR EXISTS (SELECT 1 FROM rhnErrataTmp ET WHERE ET.advisory = :advisory)
  227. EOQ
  228. my $sth = $dbh->prepare($query);
  229. $sth->execute_h(advisory => $adv);
  230. my ($exists) = $sth->fetchrow;
  231. $sth->finish;
  232. return ($exists ? 1 : 0);
  233. }
  234. sub advisory_name_exists {
  235. my $adv_name = shift;
  236. my $dbh = RHN::DB->connect;
  237. my $query =<<EOQ;
  238. SELECT 1
  239. FROM dual
  240. WHERE EXISTS (SELECT 1 FROM rhnErrata E WHERE E.advisory_name = :advisory_name)
  241. OR EXISTS (SELECT 1 FROM rhnErrataTmp ET WHERE ET.advisory_name = :advisory_name)
  242. EOQ
  243. my $sth = $dbh->prepare($query);
  244. $sth->execute_h(advisory_name => $adv_name);
  245. my ($exists) = $sth->fetchrow;
  246. $sth->finish;
  247. return ($exists ? 1 : 0);
  248. }
  249. sub find_clones_of_errata {
  250. my $class = shift;
  251. my %attr = validate(@_, {eid => 1, org_id => 1});
  252. my $ds1 = new RHN::DataSource::Errata (-mode => 'published_clones_of_errata');
  253. my $data = $ds1->execute_query(-eid => $attr{eid}, -org_id => $attr{org_id});
  254. my $ds2 = new RHN::DataSource::Errata (-mode => 'unpublished_clones_of_errata');
  255. my $data2 = $ds2->execute_query(-eid => $attr{eid}, -org_id => $attr{org_id});
  256. push @{$data}, @{$data2};
  257. return $data;
  258. }
  259. 1;