Subversion Repositories DevTools

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
221 vnguyen 1
CREATE PACKAGE BODY "RELEASE_MANAGER"."PK_RMAPI" 
2
IS
3
/*
4
------------------------------
5
||  Last Modified:  Jeremy Tweddle
6
||  Modified Date:  08/Feb/2008
7
||  Body Version:   3.3
8
------------------------------
9
*/
10
 
11
   /*-------------------------------------------------------------------------------------------------------*/
12
   FUNCTION package_dependencies (pkgname VARCHAR2, pkgversion VARCHAR2)
13
      RETURN typecur
14
   IS
15
      npvid     NUMBER  := 0;
16
      RECORDS   typecur;
17
   BEGIN
18
      BEGIN
19
         -- Get PV_ID --
20
         SELECT pv.pv_id
21
           INTO npvid
22
           FROM PACKAGES pkg, package_versions pv
23
          WHERE pv.pkg_id = pkg.pkg_id
24
            AND pkg.pkg_name = pkgname
25
            AND pv.pkg_version = pkgversion;
26
      EXCEPTION
27
         WHEN NO_DATA_FOUND
28
         THEN
29
            raise_application_error (-20000, 'Package Not Found!');
30
            --WHEN OTHERS THEN
31
                  -- Consider logging the error and then re-raise
32
            RAISE;
33
      END;
34
 
35
      -- Finally get package dependencies --
36
      OPEN RECORDS FOR
37
         SELECT dpv.pv_id, dpkg.pkg_name, dpv.pkg_version
38
           FROM package_dependencies dep, PACKAGES dpkg, package_versions dpv
39
          WHERE dep.pv_id = npvid
40
            AND dpv.pkg_id = dpkg.pkg_id
41
            AND dpv.pv_id = dep.dpv_id;
42
 
43
      RETURN RECORDS;
44
   END;
45
 
46
/*-------------------------------------------------------------------------------------------------------*/
47
   FUNCTION wip_iteration_package (
48
      projname        VARCHAR2,
49
      iterationname   VARCHAR2,
50
      pkgname         VARCHAR2
51
   )
52
      RETURN typecur
53
   IS
54
      nrtagid   NUMBER  := 0;
55
      RECORDS   typecur;
56
   BEGIN
57
      BEGIN
58
         -- Get latest rtag_id --
59
         SELECT rt.rtag_id
60
           INTO nrtagid
61
           FROM projects proj, release_tags rt
62
          WHERE rt.proj_id = proj.proj_id
63
            AND UPPER (proj.proj_name) = UPPER (projname)
64
            AND UPPER (rt.rtag_name) = UPPER (iterationname);
65
 
66
         IF (nrtagid IS NULL)
67
         THEN
68
            raise_application_error (-20000,
69
                                     'Work In Progress is Not Found!');
70
         END IF;
71
      EXCEPTION
72
         WHEN NO_DATA_FOUND
73
         THEN
74
            raise_application_error (-20000,
75
                                     'Work In Progress is Not Found!');
76
            RAISE;
77
      END;
78
 
79
      -- Finally get package dependencies --
80
      OPEN RECORDS FOR
81
         SELECT pv.pkg_version, pv.dlocked AS is_official, pv.pkg_label,
82
                pv.src_path
83
           FROM PACKAGES pkg, package_versions pv, work_in_progress wip
84
          WHERE pv.pkg_id = pkg.pkg_id
85
            AND wip.pv_id = pv.pv_id
86
            AND wip.rtag_id = nrtagid
87
            AND pkg.pkg_name = pkgname;
88
 
89
      RETURN RECORDS;
90
   END;
91
 
92
/*-------------------------------------------------------------------------------------------------------*/
93
   FUNCTION auto_make_release (
94
      rtagid                   IN   NUMBER,
95
      pkgname                  IN   VARCHAR2,
96
      vext                     IN   VARCHAR2,
97
      newpkgversion            IN   VARCHAR2,
98
      label                    IN   VARCHAR2,
99
      dependenciesimportlist   IN   VARCHAR2,
100
      isrippled                IN   NUMBER,
101
      username                 IN   VARCHAR2
102
   )
103
      RETURN NUMBER
104
   IS
105
      pkgid                           NUMBER;
106
      pvid                            NUMBER                        := 0;
107
      userid                          NUMBER;
108
      dlocked                         VARCHAR2 (20)                 := NULL;
109
      clonefrompvid                   NUMBER;
110
      ssv_mm                          package_versions.v_mm%TYPE;
111
      ssv_nmm                         package_versions.v_nmm%TYPE;
112
      ssv_ext                         package_versions.v_ext%TYPE;
113
      return_package_not_found        NUMBER                        := -1;
114
      return_package_already_exists   NUMBER                        := -2;
115
      return_not_approved             NUMBER                        := -3;
116
   BEGIN
117
      /*--------------- Business Rules Here -------------------*/
118
      IF (rtagid IS NULL)
119
      THEN
120
         raise_application_error (-20000, 'RtagId must be supplied.');
121
      END IF;
122
 
123
      IF (pkgname IS NULL)
124
      THEN
125
         raise_application_error (-20000, 'PkgName must be supplied.');
126
      END IF;
127
 
128
      IF (newpkgversion IS NULL)
129
      THEN
130
         raise_application_error (-20000, 'PkgVersion must be supplied.');
131
      END IF;
132
 
133
      IF (label IS NULL)
134
      THEN
135
         raise_application_error (-20000, 'Label must be supplied.');
136
      END IF;
137
 
138
      IF (isrippled IS NULL) OR (isrippled < 0) OR (isrippled > 1)
139
      THEN
140
         raise_application_error
141
            (-20000,
142
             'IsRippled must be set to 1 (Is rippled build) or 0 (Is planned build).'
143
            );
144
      END IF;
145
 
146
      IF (username IS NULL)
147
      THEN
148
         raise_application_error (-20000, 'UserName must be supplied.');
149
      END IF;
150
 
151
      -- Get user_id
152
      BEGIN
153
         SELECT usr.user_id
154
           INTO userid
155
           FROM users usr
156
          WHERE UPPER (usr.user_name) = UPPER (username)
157
            AND usr.is_disabled IS NULL;
158
      EXCEPTION
159
         WHEN NO_DATA_FOUND
160
         THEN
161
            raise_application_error (-20000,
162
                                        'UserName '
163
                                     || username
164
                                     || ' is not valid or disabled.'
165
                                    );
166
      END;
167
 
168
/*-------------------------------------------------------*/
169
 
170
      -- Create package if necessary
171
      IF isrippled = 1
172
      THEN
173
         /* Ripple Build */
174
         BEGIN
175
            -- Make sure that package does not exist
176
            SELECT pv.pv_id
177
              INTO pvid
178
              FROM package_versions pv, PACKAGES pkg
179
             WHERE pv.pkg_id = pkg.pkg_id
180
               AND pkg.pkg_name = pkgname
181
               AND pv.pkg_version = newpkgversion;
182
         EXCEPTION
183
            WHEN NO_DATA_FOUND
184
            THEN
185
               pvid := 0;
186
         END;
187
 
188
         IF (pvid = 0)
189
         THEN
190
            -- Split current version in parts
191
            split_version (newpkgversion, ssv_mm, ssv_nmm, ssv_ext);
192
 
193
            BEGIN
194
               -- Find package to be replaced with thie ripple package
195
               IF NVL (vext, '|LINK_A_NULL|') = NVL (ssv_ext, '|LINK_A_NULL|')
196
               THEN
197
                  SELECT pv.pv_id
198
                    INTO clonefrompvid
199
                    FROM PACKAGES pkg, package_versions pv,
200
                         release_content rc
201
                   WHERE rc.pv_id = pv.pv_id
202
                     AND pv.pkg_id = pkg.pkg_id
203
                     AND rc.rtag_id = rtagid
204
                     AND pkg.pkg_name = pkgname
205
                     AND NVL (pv.v_ext, '|LINK_A_NULL|') = NVL (ssv_ext, '|LINK_A_NULL|');
206
               ELSE
207
                  SELECT pv.pv_id
208
                    INTO clonefrompvid
209
                    FROM PACKAGES pkg, package_versions pv,
210
                         release_content rc
211
                   WHERE rc.pv_id = pv.pv_id
212
                     AND pv.pkg_id = pkg.pkg_id
213
                     AND rc.rtag_id = rtagid
214
                     AND pkg.pkg_name = pkgname
215
                     AND NVL (pv.v_ext, '|LINK_A_NULL|') = NVL (vext, '|LINK_A_NULL|');
216
               END IF;
217
            EXCEPTION
218
               WHEN NO_DATA_FOUND
219
               THEN
220
                  raise_application_error
221
                                        (-20000,
222
                                            'Cannot get CloneFromPvId. VExt='
223
                                         || vext
224
                                         || ', RtagId='
225
                                         || rtagid
226
                                         || ', PkgName='
227
                                         || pkgname
228
                                         || ', SSV_EXT='
229
                                         || ssv_ext
230
                                        );
231
            END;
232
 
233
            IF NVL (vext, '|LINK_A_NULL|') = NVL (ssv_ext, '|LINK_A_NULL|')
234
            THEN
235
 
236
-- Create package
237
               seed_package_names_versions (pkgname,
238
                                            newpkgversion,
239
                                            userid,
240
                                            pvid,
241
                                            clonefrompvid
242
                                           );
243
            ELSE
244
               -- Create package
245
               seed_package_names_versions2 (pkgname,
246
                                             newpkgversion,
247
                                             userid,
248
                                             pvid,
249
                                             clonefrompvid
250
                                            );
251
            END IF;
252
 
253
            -- Update Package reason for release
254
            UPDATE package_versions pv
255
               SET pv.comments = 'Rippled Build.',
256
                   pv.build_type = 'Y'
257
             WHERE pv.pv_id = pvid;
258
         ELSE
259
            -- Package already exists, hence cannot be used for ripple build
260
            RETURN return_package_already_exists;
261
         END IF;
262
      ELSE
263
         /* Auto build from Pending area */
264
 
265
         -- Find package in pending area
266
         BEGIN
267
            SELECT pv.pv_id, pv.dlocked
268
              INTO pvid, dlocked
269
              FROM planned pl, package_versions pv, PACKAGES pkg
270
             WHERE pl.pv_id = pv.pv_id
271
               AND pv.pkg_id = pkg.pkg_id
272
               AND pl.rtag_id = rtagid
273
               AND pkg.pkg_name = pkgname
274
               AND pv.dlocked = 'A'
275
               AND NVL (pv.v_ext, '|LINK_A_NULL|') = NVL (vext, '|LINK_A_NULL|');
276
         EXCEPTION
277
            WHEN NO_DATA_FOUND
278
            THEN
279
               pvid := 0;
280
         END;
281
 
282
         IF (pvid = 0)
283
         THEN
284
            -- Package does not exist in pending area, hence report it
285
            RETURN return_package_not_found;
286
         ELSIF (dlocked != 'A')
287
         THEN
288
            -- Package is not approved for autobuild
289
            RETURN return_not_approved;
290
         END IF;
291
      END IF;
292
 
293
      BEGIN
294
         -- Import Dependencies
295
         import_dependencies (pvid, dependenciesimportlist, userid);
296
      END;
297
 
298
      BEGIN
299
         -- Split current version in parts
300
         split_version (newpkgversion, ssv_mm, ssv_nmm, ssv_ext);
301
 
302
         -- Update Package Details
303
         UPDATE package_versions pv
304
            SET pv.pkg_version = newpkgversion,
305
                pv.v_ext = ssv_ext,
306
                pv.v_mm = ssv_mm,
307
                pv.v_nmm = ssv_nmm,
308
                pv.pkg_label = label
309
          WHERE pv.pv_id = pvid;
310
      EXCEPTION
311
         WHEN DUP_VAL_ON_INDEX
312
         THEN
313
            -- Package already exists, hence cannot be used for ripple build
314
            RETURN return_package_already_exists;
315
      END;
316
 
317
      -- Update the is_autobuildable
318
      UPDATE package_versions
319
         SET is_autobuildable = 'Y'
320
       WHERE pv_id = pvid;
321
 
322
      -- Now release package
323
      pk_environment.auto_make_release (pvid,
324
                                        rtagid,
325
                                        userid,
326
                                        vext,
327
                                        ssv_ext,
328
                                        clonefrompvid
329
                                       );
330
 
331
      --Now clean the PLANNED_VERSIONS table
332
      SELECT pkg_id
333
        INTO pkgid
334
        FROM PACKAGES
335
       WHERE pkg_name = pkgname;
336
 
337
      DELETE FROM planned_versions
338
            WHERE pkg_id = pkgid AND pkg_version = newpkgversion;
339
 
340
      RETURN pvid;
341
   END;
342
 
343
/*-------------------------------------------------------------------------------------------------------*/
344
   PROCEDURE import_dependencies (
345
      pvid                     IN   NUMBER,
346
      dependenciesimportlist   IN   VARCHAR2,
347
      userid                   IN   NUMBER
348
   )
349
   IS
350
/*
351
|| DependenciesImportList Format:
352
|| "pkgA","1.0.0";"pkgB","2.0.0";
353
||  OR 'pkgA','1.0.0';'pkgB','2.0.0';
354
*/
355
      TYPE tdictionary IS TABLE OF VARCHAR2 (4000)
356
         INDEX BY VARCHAR2 (4000);
357
 
358
      seperator         VARCHAR2 (2)           := '||';
359
      pkgname           VARCHAR2 (4000);
360
      pkgversion        VARCHAR2 (4000);
361
      buildtype         VARCHAR2 (50);
362
      pkgid             NUMBER;
363
      vext              VARCHAR2 (4000);
364
      dpvid             NUMBER;
365
      slist             VARCHAR2 (4000);
366
      cbuildtypes       tdictionary;
367
      dependencyrow     NUMBER;
368
      sdependency       VARCHAR2 (4000);
369
      first_pos         VARCHAR2 (4000);
370
      second_pos        VARCHAR2 (4000);
371
      third_pos         VARCHAR2 (4000);
372
      forth_pos         VARCHAR2 (4000);
373
      citemcollection   relmgr_varchar2_tab_t  := relmgr_varchar2_tab_t ();
374
 
375
      CURSOR curbuildtype
376
      IS
377
         SELECT dpv.pkg_id || seperator || dpv.v_ext AS pkgid_ext,
378
                dep.build_type
379
           FROM package_dependencies dep, package_versions dpv
380
          WHERE dep.pv_id = pvid AND dep.dpv_id = dpv.pv_id;
381
 
382
      recbuildtype      curbuildtype%ROWTYPE;
383
   BEGIN
384
      slist := dependenciesimportlist;
385
 
386
      -- Preformat String
387
      IF NOT slist IS NULL
388
      THEN
389
         slist := REPLACE (slist, ' ');                      -- Remove spaces
390
         slist := REPLACE (slist, UTL_TCP.crlf);
391
         -- Remove new line and carriage-return characters
392
         slist := REPLACE (slist, '''', '"');             -- Replace ' with "
393
      END IF;
394
 
395
      -- Get Current Dependencies
396
      OPEN curbuildtype;
397
 
398
      FETCH curbuildtype
399
       INTO recbuildtype;
400
 
401
      WHILE curbuildtype%FOUND
402
      LOOP
403
         cbuildtypes (recbuildtype.pkgid_ext) := recbuildtype.build_type;
404
 
405
         FETCH curbuildtype
406
          INTO recbuildtype;
407
      END LOOP;
408
 
409
      CLOSE curbuildtype;
410
 
411
      -- Separate dependencies with ; separator
412
      citemcollection := in_list_varchar2 (slist, ';');
413
 
414
      BEGIN
415
         -- Remove old dependencies
416
         DELETE FROM package_dependencies dep
417
               WHERE dep.pv_id = pvid;
418
 
419
         -- Loop through dependencies
420
         FOR dependencyrow IN 1 .. citemcollection.COUNT
421
         LOOP
422
            -- Extract pkg_name and pkg_version
423
            sdependency := citemcollection (dependencyrow);
424
            first_pos := INSTR (sdependency, '"', 1, 1);
425
            second_pos := INSTR (sdependency, '"', 1, 2);
426
            third_pos := INSTR (sdependency, '"', 1, 3);
427
            forth_pos := INSTR (sdependency, '"', 1, 4);
428
            pkgname :=
429
               SUBSTR (sdependency,
430
                       (first_pos + 1),
431
                       (second_pos - first_pos - 1)
432
                      );
433
            pkgversion :=
434
               SUBSTR (sdependency,
435
                       (third_pos + 1),
436
                       (forth_pos - third_pos - 1)
437
                      );
438
 
439
            -- Dependency must exits to be linked against
440
            BEGIN
441
               SELECT pv.pv_id, pv.pkg_id, pv.v_ext
442
                 INTO dpvid, pkgid, vext
443
                 FROM package_versions pv, PACKAGES pkg
444
                WHERE pv.pkg_id = pkg.pkg_id
445
                  AND pkg.pkg_name = pkgname
446
                  AND pv.pkg_version = pkgversion;
447
            EXCEPTION
448
               WHEN NO_DATA_FOUND
449
               THEN
450
                  raise_application_error
451
                                  (-20000,
452
                                      'Dependency ['
453
                                   || pkgname
454
                                   || ' '
455
                                   || pkgversion
456
                                   || '] does not exist yet and cannot be used!'
457
                                  );
458
            END;
459
 
460
            -- Get Build Type (i.e. BuildPackageArchive or LinkPackageArchive)
461
            BEGIN
462
               buildtype := cbuildtypes (pkgid || seperator || vext);
463
 
464
               IF buildtype IS NULL
465
               THEN
466
                  -- Set build type to LinkPackageArchive by default
467
                  buildtype := 'L';
468
               END IF;
469
            EXCEPTION
470
               WHEN NO_DATA_FOUND
471
               THEN
472
                  buildtype := 'L';
473
            END;
474
 
475
            -- Insert Dependencies
476
 
477
update_package_dependency (pvid,
478
                                       pkgname,
479
                                       pkgversion,
480
                                       buildtype,
481
                                       userid,
482
 
483
                                      );
484
         END LOOP;
485
      END;
486
   END;
487
 
488
/*-------------------------------------------------------------------------------------------------------*/
489
   FUNCTION return_last_package_version (pkgname IN VARCHAR2, rtagid IN NUMBER)
490
      RETURN VARCHAR2
491
   IS
492
      pkgversion   VARCHAR2 (4000);
493
   BEGIN
494
      BEGIN
495
         SELECT pv.pkg_version
496
           INTO pkgversion
497
           FROM PACKAGES pkg, release_content rc, package_versions pv
498
          WHERE pv.pv_id = rc.pv_id
499
            AND pkg.pkg_id = pv.pkg_id
500
            AND pkg.pkg_name = pkgname
501
            AND rc.rtag_id = rtagid;
502
 
503
         RETURN pkgversion;
504
      END;
505
   END;
506
 
507
/*-------------------------------------------------------------------------------------------------------*/
508
   FUNCTION return_wip (pkgname IN VARCHAR2, rtagid IN NUMBER)
509
      RETURN VARCHAR2
510
   IS
511
      pkgversion   VARCHAR2 (4000);
512
   BEGIN
513
      BEGIN
514
         SELECT pv.pkg_version
515
           INTO pkgversion
516
           FROM PACKAGES pkg, work_in_progress wip, package_versions pv
517
          WHERE pv.pv_id = wip.pv_id
518
            AND pkg.pkg_id = pv.pkg_id
519
            AND pkg.pkg_name = pkgname
520
            AND wip.rtag_id = rtagid;
521
 
522
         IF pkgversion IS NULL
523
         THEN
524
            SELECT pv.pkg_version
525
              INTO pkgversion
526
              FROM PACKAGES pkg, planned pl, package_versions pv
527
             WHERE pv.pv_id = pl.pv_id
528
               AND pkg.pkg_id = pv.pkg_id
529
               AND pkg.pkg_name = pkgname
530
               AND pl.rtag_id = rtagid;
531
         END IF;
532
 
533
         RETURN pkgversion;
534
      END;
535
   END;
536
 
537
/*-------------------------------------------------------------------------------------------------------*/
538
   PROCEDURE update_dash_board (rtagid IN NUMBER)
539
   IS
540
      projid       NUMBER;
541
      projiddb     NUMBER;
542
      total        NUMBER;
543
      auto_total   NUMBER;
544
      rtagiddb     NUMBER;
545
   BEGIN
546
      SELECT COUNT (*)
547
        INTO total
548
        FROM release_content rc, package_versions pv
549
       WHERE pv.pv_id = rc.pv_id AND rc.rtag_id = rtagid;
550
 
551
      SELECT COUNT (*)
552
        INTO auto_total
553
        FROM release_content rc, package_versions pv
554
       WHERE pv.pv_id = rc.pv_id
555
         AND pv.is_autobuildable = 'Y'
556
         AND rc.rtag_id = rtagid;
557
 
558
      BEGIN
559
         SELECT rtag_id
560
           INTO rtagiddb
561
           FROM dash_board
562
          WHERE rtag_id = rtagid;
563
 
564
         SELECT proj_id
565
           INTO projiddb
566
           FROM dash_board
567
          WHERE rtag_id = rtagid;
568
      EXCEPTION
569
         WHEN NO_DATA_FOUND
570
         THEN
571
            rtagiddb := '';
572
      END;
573
 
574
      IF rtagiddb IS NULL
575
      THEN
576
         SELECT proj_id
577
           INTO projid
578
           FROM release_tags
579
          WHERE rtag_id = rtagid;
580
 
581
         INSERT INTO dash_board
582
                     (proj_id, rtag_id, last_build_time, automated_packages,
583
                      total_packages
584
                     )
585
              VALUES (projid, rtagid, ora_sysdatetime, auto_total,
586
                      total
587
                     );
588
      ELSE
589
         UPDATE dash_board
590
            SET last_build_time = ora_sysdatetime,
591
                automated_packages = auto_total,
592
                total_packages = total
593
          WHERE proj_id = projiddb AND rtag_id = rtagiddb;
594
      END IF;
595
   END;
596
 
597
/*-------------------------------------------------------------------------------------------------------*/
598
   FUNCTION exclude_from_build (
599
      pvid          IN   NUMBER,
600
      spkgversion   IN   VARCHAR2,
601
      rtagid        IN   NUMBER,
602
      username      IN   VARCHAR2
603
   )
604
      RETURN NUMBER
605
   IS
606
      userid              NUMBER;
607
      outerrcode          NUMBER;
608
      pkgid               NUMBER;
609
 
610
      CURSOR dnr_duplicate_cur
611
      IS
612
         SELECT *
613
           FROM do_not_ripple
614
          WHERE pv_id = pvid AND rtag_id = rtagid;
615
 
616
      dnr_duplicate_rec   dnr_duplicate_cur%ROWTYPE;
617
   BEGIN
618
      outerrcode := -1;       -- Set default return error code to ERROR state
619
 
620
      /*--------------- Business Rules Here -------------------*/
621
      IF (rtagid IS NULL)
622
      THEN
623
         RETURN outerrcode;
624
--         raise_application_error (-20000, 'RtagId must be supplied.');
625
      END IF;
626
 
627
      IF (pvid IS NULL)
628
      THEN
629
         RETURN outerrcode;
630
--         raise_application_error (-20000, 'PvId must be supplied.');
631
      END IF;
632
 
633
      IF (username IS NULL)
634
      THEN
635
         RETURN outerrcode;
636
--         raise_application_error (-20000, 'UserName must be supplied.');
637
      END IF;
638
 
639
      -- Get user_id
640
      BEGIN
641
         SELECT usr.user_id
642
           INTO userid
643
           FROM users usr
644
          WHERE UPPER (usr.user_name) = UPPER (username)
645
            AND usr.is_disabled IS NULL;
646
      EXCEPTION
647
         WHEN NO_DATA_FOUND
648
         THEN
649
            RETURN outerrcode;
650
--            raise_application_error (-20000,
651
--                                        'UserName '
652
--                                     || username
653
--                                     || ' is not valid or disabled.'
654
--                                    );
655
      END;
656
 
657
      OPEN dnr_duplicate_cur;
658
 
659
      FETCH dnr_duplicate_cur
660
       INTO dnr_duplicate_rec;
661
 
662
      IF dnr_duplicate_cur%FOUND
663
      THEN
664
         outerrcode := 0;
665
      END IF;
666
 
667
      IF dnr_duplicate_cur%NOTFOUND
668
      THEN
669
         /* No duplicate recordset */
670
         unripple_package (pvid, rtagid, userid);
671
         outerrcode := 0;                            -- Set return to SUCCESS
672
      END IF;
673
 
674
      CLOSE dnr_duplicate_cur;
675
 
676
      SELECT pkg_id
677
        INTO pkgid
678
        FROM package_versions
679
       WHERE pv_id = pvid;
680
 
681
      DELETE FROM planned_versions
682
            WHERE pkg_id = pkgid AND pkg_version = spkgversion;
683
 
684
      RETURN outerrcode;
685
   END;
686
 
687
/*-------------------------------------------------------------------------------------------------------*/
688
   PROCEDURE insert_abt_actionlog (rconid IN NUMBER, action IN VARCHAR2)
689
   IS
690
   BEGIN
691
      INSERT INTO abt_action_log
692
                  (rcon_id, action_datetime, action
693
                  )
694
           VALUES (rconid, ora_sysdatetime, action
695
                  );
696
   END;
697
 
698
/*-------------------------------------------------------------------------------------------------------*/
699
   FUNCTION insert_package_metrics (
700
      rtagid                   IN   NUMBER,
701
      pkgname                  IN   VARCHAR2,
702
      vext                     IN   VARCHAR2,
703
      metricstring             IN   VARCHAR2
704
   )
705
      RETURN NUMBER
706
   IS
707
      citemcollection          relmgr_varchar2_tab_t  := relmgr_varchar2_tab_t ();
708
      pvid                     NUMBER                 := 0;
709
      rownumber                NUMBER;
710
      rowcontent               VARCHAR2(4000);
711
      metricname               VARCHAR2(1000);
712
      metricvalue              VARCHAR2(4000);
713
      return_insert_error      NUMBER                 := -1;
714
      return_insert_success    NUMBER                 := 0;
715
 
716
      /* Metrics */
717
      branches                 NUMBER;
718
      branchlist               VARCHAR2(4000);
719
      codefiles                NUMBER;
720
      ignoredfiles             NUMBER;
721
      directories              NUMBER;
722
      directorydepth           NUMBER;
723
      totalfiles               NUMBER;
724
      makefiles                NUMBER;
725
      blanklines               NUMBER;
726
      codelines                NUMBER;
727
      commentlines             NUMBER;
728
 
729
   BEGIN
730
      /*--------------- Business Rules Here -------------------*/
731
      IF (rtagid IS NULL)
732
      THEN
733
         RETURN return_insert_error;
734
      END IF;
735
 
736
      IF (pkgname IS NULL)
737
      THEN
738
         RETURN return_insert_error;
739
      END IF;
740
 
741
      IF (metricstring IS NULL)
742
      THEN
743
         RETURN return_insert_error;
744
      END IF;
745
 
746
      BEGIN
747
         SELECT pv.pv_id
748
           INTO pvid
749
           FROM package_versions pv, packages pkg, release_content rc
750
          WHERE 
751
pv.pkg_id = pkg.pkg_id
752
            AND rc.rtag_id = rtagid
753
            AND pv.pv_id = rc.pv_id
754
            AND pkg.pkg_name = pkgname
755
            AND NVL (pv.v_ext, '|LINK_A_NULL|') = NVL (vext, '|LINK_A_NULL|');
756
      EXCEPTION
757
           WHEN NO_DATA_FOUND
758
           THEN
759
                pvid := 0;
760
      END;
761
 
762
      citemcollection := in_list_varchar2 (metricstring, ';');
763
 
764
      FOR rownumber IN 1 .. citemcollection.COUNT
765
      LOOP
766
         rowcontent := citemcollection(rownumber);
767
         metricvalue := SUBSTR(rowcontent, (INSTR(rowcontent, '=') + 1));
768
         metricname := REGEXP_REPLACE(rowcontent, '=.*$', '');
769
 
770
         IF    metricname = 'ccbranch.count' THEN branches := metricvalue;
771
         ELSIF metricname = 'ccbranch.list' THEN branchlist := metricvalue;
772
         ELSIF metricname = 'code.files' THEN codefiles := metricvalue;
773
         ELSIF metricname = 'code.ignored' THEN ignoredfiles := metricvalue;
774
         ELSIF metricname = 'count.dir' THEN directories := metricvalue;
775
         ELSIF metricname = 'count.dirdepth' THEN directorydepth := metricvalue;
776
         ELSIF metricname = 'count.file' THEN totalfiles := metricvalue;
777
         ELSIF metricname = 'count.makefile' THEN makefiles := metricvalue;
778
         ELSIF metricname = 'lines.blank' THEN blanklines := metricvalue;
779
         ELSIF metricname = 'lines.code' THEN codelines := metricvalue;
780
         ELSIF metricname = 'lines.comment' THEN commentlines := metricvalue;
781
         END IF;
782
      END LOOP;
783
 
784
      IF (pvid > 0)
785
      THEN
786
         -- Delete any existing entries for this package version to makes sure our data is untainted
787
         DELETE FROM package_metrics pm
788
         WHERE pm.pv_id = pvid;
789
 
790
         -- Insert the new data into the metrics table
791
         INSERT INTO package_metrics
792
                     (pv_id, branches, branch_list, code_files, ignored_files, directories, directory_depth,
793
                      total_files, makefiles, blank_lines, code_lines, comment_lines, created_stamp
794
                     )
795
              VALUES (pvid, branches, branchlist, codefiles, ignoredfiles, directories, directorydepth,
796
                      totalfiles, makefiles, blanklines, codelines, commentlines, ora_sysdatetime
797
                     );
798
 
799
         -- Now update the Release_Metrics Table
800
         update_release_metrics(rtagid);
801
 
802
         RETURN return_insert_success;
803
      ELSE
804
         RETURN return_insert_error;
805
      END IF;
806
   END;
807
 
808
/*-------------------------------------------------------------------------------------------------------*/
809
   PROCEDURE update_release_metrics (rtagid IN NUMBER)
810
   IS
811
      totalpackages       NUMBER;
812
      autobuilt           NUMBER;
813
      linesofcode         NUMBER;
814
      unittested          NUMBER;
815
      autotested          NUMBER;
816
      numOfbranches       NUMBER;
817
      lastbuildtime       DATE;
818
   BEGIN
819
      IF (rtagid > 0)
820
      THEN
821
         -- Get the total number of packages in this release and the number of
822
         -- those that are autobuilt
823
         SELECT COUNT (DISTINCT rc.pv_id),
824
                COUNT (DISTINCT autobuilt_qry.pv_id)
825
           INTO totalpackages, autobuilt
826
           FROM release_content rc,
827
                package_versions pv,
828
                (
829
                 SELECT rc.pv_id
830
                   FROM release_content rc,
831
                        package_versions pv
832
                  WHERE pv.is_autobuildable = 'Y'
833
                    AND pv.pv_id = rc.pv_id
834
                    AND rc.rtag_id = rtagid
835
                ) autobuilt_qry
836
          WHERE pv.pv_id = rc.pv_id
837
            AND rc.rtag_id = rtagid
838
            AND autobuilt_qry.pv_id (+) = rc.pv_id;
839
 
840
         -- Get the build time of the last package built in this release and the
841
         -- total number of lines of code
842
         SELECT MAX(pm.created_stamp),
843
                SUM(pm.code_lines)
844
           INTO lastbuildtime, linesofcode
845
           FROM package_metrics pm, release_content rc
846
          WHERE pm.pv_id = rc.pv_id
847
            AND rc.rtag_id = rtagid;
848
 
849
         -- Get the number of packages with unit tests in this release and the
850
         -- number of those that are autotested
851
         SELECT COUNT(DISTINCT ut.pv_id),
852
                COUNT(DISTINCT autotest_qry.pv_id)
853
           INTO unittested, autotested
854
           FROM unit_tests ut,
855
                release_content rc,
856
                (
857
                 SELECT ut.pv_id
858
                   FROM unit_tests ut, release_content rc
859
                  WHERE ut.pv_id = rc.pv_id
860
                    AND rc.rtag_id = rtagid
861
                    AND ut.test_types_fk = 7
862
                ) autotest_qry
863
          WHERE ut.pv_id = rc.pv_id
864
            AND rc.rtag_id = rtagid
865
            AND autotest_qry.pv_id (+) = ut.pv_id;
866
 
867
         -- Count the number of unique branches in the packages in this release.
868
--         SELECT COUNT(DISTINCT branch) INTO numOfbranches
869
--           FROM (
870
--                SELECT pv_id,
871
--                       regexp_substr(str, '[^,]+', 1, level) branch,
872
--                       level lv,
873
--                       lag(level, 1, 0) over (partition by pv_id order by level) lg
874
--                  FROM (
875
--                       SELECT pm.pv_id,
876
--                              ','||pm.branch_list str
877
--                         FROM package_metrics pm,
878
--                              release_content rc
879
--                        WHERE pm.pv_id = rc.pv_id
880
--                          AND rc.rtag_id = rtagid
881
--                       )
882
--                CONNECT BY regexp_substr(str, '[^,]+', 1, LEVEL) IS NOT NULL
883
--                )
884
--          WHERE lv != lg;
885
 
886
         UPDATE release_metrics rm
887
            SET rm.total_packages = totalpackages,
888
                rm.autobuilt = autobuilt,
889
                rm.lines_of_code = linesofcode,
890
                rm.unit_tested = unittested,
891
                rm.autotested = autotested,
892
--                rm.branches = numOfbranches,
893
                rm.last_build_time = lastbuildtime
894
          WHERE rtag_id = rtagid;
895
 
896
         IF (SQL%ROWCOUNT = 0)
897
         THEN
898
            INSERT INTO release_metrics
899
                        (rtag_id, total_packages, autobuilt, lines_of_code, unit_tested,
900
                         autotested, last_build_time
901
                        )
902
                 VALUES (rtagid, totalpackages, autobuilt, linesofcode, unittested,
903
                         autotested, lastbuildtime
904
                        );
905
         END IF;
906
--         IF (SQL%ROWCOUNT = 0)
907
--         THEN
908
--            INSERT INTO release_metrics
909
--                        (rtag_id, total_packages, autobuilt, lines_of_code, unit_tested,
910
--                         autotested, branches, last_build_time
911
--                        )
912
--                 VALUES (rtagid, totalpackages, autobuilt, linesofcode, unittested,
913
--                         autotested, numOfbranches, lastbuildtime
914
--                        );
915
--         END IF;
916
--      ELSE
917
--         raise_application_error (-20000, 'RtagId must be supplied.');
918
      END IF;
919
   END;
920
/*-------------------------------------------------------------------------------------------------------*/
921
END pk_rmapi; 
922
/
923
ALTER PACKAGE "RELEASE_MANAGER"."PK_RMAPI" 
924
  COMPILE BODY 
925
    PLSQL_OPTIMIZE_LEVEL=  2
926
    PLSQL_CODE_TYPE=  INTERPRETED
927
    PLSQL_DEBUG=  TRUE
928
 REUSE SETTINGS TIMESTAMP '2008-05-09 14:47:11'
929
/