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_RELEASE" IS
2
 
3
 
4
/*
5
------------------------------
6
||  Last Modified:  S.Vukovic
7
||  Modified Date:  12/Sep/2005
8
||  Body Version:   3.0
9
------------------------------
10
*/
11
 
12
 
13
/*-------------------------------------------------------------------------------------------------------*/
14
PROCEDURE New_Release ( sReleaseName IN VARCHAR2, sReleaseComments IN VARCHAR2, nProjId IN NUMBER, nSourceRtagId IN NUMBER, sIsBranched IN CHAR, nUserId IN NUMBER ) IS
15
 
16
RtagId NUMBER;
17
ParentRtagId NUMBER;
18
RecCount NUMBER := 0;
19
VtreeId NUMBER;
20
 
21
 
22
BEGIN
23
	/*--------------- Business Rules Here -------------------*/
24
	-- Check for missing parameters
25
	IF (sReleaseName IS NULL) OR (nUserId IS NULL)
26
	THEN
27
		RAISE_APPLICATION_ERROR (-20000, 'Missing some parameters! sReleaseName= '|| sReleaseName ||', nUserId='|| nUserId );
28
 
29
	END IF;
30
 
31
 
32
	-- Check for duplicate Release Names
33
	SELECT COUNT(rt.RTAG_ID) INTO RecCount
34
	  FROM RELEASE_TAGS rt
35
	 WHERE UPPER( rt.RTAG_NAME ) = UPPER( sReleaseName )
36
	   AND rt.PROJ_ID = nProjId;
37
 
38
	IF (RecCount > 0) THEN
39
		RAISE_APPLICATION_ERROR (-20000, 'Release Name '|| sReleaseName ||' is Already Used in this Project.');	
40
	END IF;
41
	/*-------------------------------------------------------*/
42
 
43
 
44
	-- Get rtag_id
45
	SELECT SEQ_RTAG_ID.NEXTVAL INTO RtagId FROM DUAL;
46
 
47
	SELECT SEQ_VTREE_ID.NEXTVAL INTO VtreeId FROM DUAL;
48
 
49
 
50
 
51
	-- Get Parent RtagId
52
	ParentRtagId := GET_PARENT_RTAG ( RtagId, nSourceRtagId, sIsBranched );
53
 
54
 
55
	-- Create new release
56
	INSERT INTO RELEASE_TAGS ( RTAG_ID, RTAG_NAME, DESCRIPTION, CREATED_STAMP, CREATOR_ID, 
57
							   OFFICIAL, REBUILD_ENV, REBUILD_STAMP, 
58
							   PARENT_RTAG_ID, PROJ_ID, VTREE_ID )
59
	VALUES ( RtagId, 
60
			 sReleaseName, 
61
			 sReleaseComments,
62
			 ORA_SYSDATE,
63
			 nUserId,
64
			 'N',
65
			 'N',
66
			 0,
67
			 ParentRtagId,
68
			 nProjId,
69
			 VtreeId );
70
 
71
	-- Update display Order
72
	UPDATE_DISPLAY_ORDER ( nProjId );
73
 
74
	/* Log Project Action */
75
	Log_Project_Action ( nProjId, 'new_release', nUserId, sReleaseName, RtagId );
76
 
77
 
78
	-- Import Release Contents
79
	IF (NOT nSourceRtagId IS NULL) THEN
80
		Import_Release_Contents ( nSourceRtagId, RtagId, nUserId );
81
 
82
	END IF;
83
 
84
 
85
 
86
END;
87
/*-------------------------------------------------------------------------------------------------------*/
88
PROCEDURE UPDATE_DISPLAY_ORDER ( nProjId IN NUMBER ) IS
89
 
90
 
91
BEGIN
92
 
93
 
94
	/*--------------- Business Rules Here -------------------*/
95
	/*-------------------------------------------------------*/
96
 
97
	UPDATE RELEASE_TAGS urt SET
98
	urt.DISPLAY_ORDER = (
99
						SELECT qry.REC_NUM
100
						  FROM (	
101
								SELECT rel.*, ROWNUM AS REC_NUM
102
								  FROM (
103
 
104
								  		SELECT rt.RTAG_ID, 
105
											   rt.DISPLAY_ORDER,
106
										       DECODE( rt.PARENT_RTAG_ID, 
107
											   		   rt.RTAG_ID, 0, rt.PARENT_RTAG_ID ) AS PARENT_RTAG_ID
108
										  FROM RELEASE_TAGS rt
109
										 WHERE rt.PROJ_ID = nProjId 
110
 
111
								  		) rel
112
								START WITH rel.PARENT_RTAG_ID = 0
113
								CONNECT BY PRIOR rel.RTAG_ID = rel.PARENT_RTAG_ID   
114
								ORDER SIBLINGS BY rel.DISPLAY_ORDER
115
								) qry
116
					      WHERE qry.RTAG_ID = urt.RTAG_ID 								
117
						)
118
	WHERE urt.PROJ_ID = nProjId;
119
 
120
END;
121
/*-------------------------------------------------------------------------------------------------------*/
122
PROCEDURE MOVE_RELEASE ( sRtagIdList IN VARCHAR2, nProjId IN NUMBER, nUserId IN NUMBER  ) IS
123
 
124
	nIdCollector RELMGR_NUMBER_TAB_t := RELMGR_NUMBER_TAB_t();						 
125
	SeqNum NUMBER;
126
 
127
BEGIN
128
 
129
 
130
	/*--------------- Business Rules Here -------------------*/
131
	/*-------------------------------------------------------*/
132
 
133
	nIdCollector := IN_LIST_NUMBER ( sRtagIdList );
134
 
135
	-- Set start sequence number
136
	SeqNum := 1;
137
 
138
	FOR i IN 1..nIdCollector.COUNT
139
	LOOP
140
 
141
		-- Update new display order
142
		UPDATE RELEASE_TAGS rt SET
143
			rt.DISPLAY_ORDER = SeqNum
144
		 WHERE rt.PROJ_ID = nProjId
145
		   AND rt.RTAG_ID = nIdCollector(i);
146
 
147
		SeqNum := SeqNum + 1;
148
 
149
	END LOOP;
150
 
151
END;
152
/*-------------------------------------------------------------------------------------------------------*/
153
PROCEDURE Update_Release ( nRtagId IN NUMBER, sReleaseName IN VARCHAR2, sReleaseComments IN VARCHAR2, nParentRtagId IN NUMBER, nMASSRtagId IN NUMBER, nConfigSpecBranch IN VARCHAR2, sOwnerEmail IN VARCHAR2, nUserId IN NUMBER, cState IN VARCHAR ) IS
154
 
155
RecCount NUMBER := 0;
156
ProjId NUMBER;
157
 
158
BEGIN
159
 
160
 
161
	/*--------------- Business Rules Here -------------------*/
162
	-- Check for missing parameters
163
	IF (sReleaseName IS NULL) OR (nUserId IS NULL) OR (nRtagId IS NULL)
164
	THEN
165
		RAISE_APPLICATION_ERROR (-20000, 'Missing some parameters! sReleaseName= '|| sReleaseName ||', nUserId='|| nUserId ||', nRtagId='|| nRtagId);
166
 
167
	END IF;
168
 
169
 
170
	-- Check for duplicate Release Names
171
	SELECT rt.PROJ_ID INTO ProjId
172
	  FROM RELEASE_TAGS rt
173
	 WHERE rt.RTAG_ID = nRtagId;
174
 
175
	SELECT COUNT(rt.RTAG_ID) INTO RecCount
176
	  FROM RELEASE_TAGS rt
177
	 WHERE UPPER( rt.RTAG_NAME ) = UPPER( sReleaseName )
178
	   AND rt.RTAG_ID != nRtagId
179
	   AND rt.PROJ_ID = ProjId;
180
 
181
 
182
	IF (RecCount > 0) THEN
183
		RAISE_APPLICATION_ERROR (-20000, 'Release Name '|| sReleaseName ||' is Already Used in this Project.');	
184
	END IF;
185
	/*-------------------------------------------------------*/
186
 
187
 
188
 
189
	-- Update release details
190
	UPDATE RELEASE_TAGS rt SET
191
	rt.RTAG_NAME = sReleaseName,
192
	rt.DESCRIPTION = sReleaseComments,
193
	rt.PARENT_RTAG_ID = nParentRtagId,
194
	rt.ASSOC_MASS_REF = nMASSRtagId,
195
	rt.CONFIG_SPEC_BRANCH = nConfigSpecBranch,
196
	rt.OWNER_EMAIL = sOwnerEmail,
197
	rt.PRODUCT_STATE_USED = cState
198
	WHERE rt.RTAG_ID = nRtagId; 
199
 
200
	-- Update display Order
201
	UPDATE_DISPLAY_ORDER ( ProjId );
202
 
203
	/* Log Project Action */
204
	Log_Project_Action ( ProjId, 'update_release', nUserId, 'Release Name: <br>Release Comments:', nRtagId );
205
 
206
 
207
 
208
 
209
END;
210
/*-------------------------------------------------------------------------------------------------------*/
211
PROCEDURE Destroy_Release ( nRtagId IN NUMBER, nUserId IN NUMBER ) IS
212
 
213
	RecCount NUMBER := 0;
214
	sReleaseId VARCHAR2(4000);
215
	ProjId NUMBER;
216
 
217
BEGIN
218
	/*--------------- Business Rules Here -------------------*/
219
	IF (nRtagId IS NULL) 
220
	THEN
221
		RAISE_APPLICATION_ERROR (-20000, 'Missing some parameters! nRtagId= '|| nRtagId  );
222
	END IF;
223
 
224
 
225
 
226
	-- Check for any kids
227
	SELECT COUNT( rt.RTAG_ID ) INTO RecCount
228
	  FROM RELEASE_TAGS rt
229
	 WHERE rt.PARENT_RTAG_ID = nRtagId
230
	   AND rt.RTAG_ID != rt.PARENT_RTAG_ID;
231
 
232
	IF (RecCount > 0) THEN
233
		RAISE_APPLICATION_ERROR (-20000, 'Cannot destroy this release. You need to destroy its children releases first.'  );
234
	END IF; 
235
	/*-------------------------------------------------------*/
236
 
237
	-- Clear the release contents
238
	Clean_Release_Contents ( nRtagId, nUserId );
239
 
240
	/* Log Project Action */
241
	SELECT rt.PROJ_ID, rt.RTAG_NAME ||'['|| rt.RTAG_VERSION ||'.'|| rt.RTAG_LIFE_CYCLE ||']' INTO ProjId, sReleaseId
242
	  FROM RELEASE_TAGS rt
243
	 WHERE rt.RTAG_ID = nRtagId;
244
 
245
	Log_Project_Action ( ProjId, 'destroy_release', nUserId, sReleaseId, nRtagId );
246
 
247
 
248
	-- Remove Release
249
	DELETE 
250
	  FROM RELEASE_TAGS rt
251
	 WHERE rt.RTAG_ID = nRtagId;
252
 
253
 
254
 
255
END;
256
/*-------------------------------------------------------------------------------------------------------*/
257
PROCEDURE Import_Release_Contents ( nSourceRtagId IN NUMBER, nTargetRtagId IN NUMBER, nUserId IN NUMBER  ) IS
258
 
259
	sSourceLocation VARCHAR2(4000);
260
	sTargetLocation VARCHAR2(4000);
261
	ProjId NUMBER;
262
	cReleaseMode CHAR(1);
263
	RconId NUMBER;
264
 
265
 
266
	CURSOR curReleaseConfigs IS
267
    SELECT *
268
	  FROM RELEASE_CONFIG rc
269
	 WHERE rc.RTAG_ID = nSourceRtagId;
270
    recReleaseConfigs curReleaseConfigs%ROWTYPE;
271
 
272
 
273
BEGIN
274
	/*--------------- Business Rules Here -------------------*/
275
	IF (nSourceRtagId IS NULL) OR (nTargetRtagId IS NULL)
276
	THEN
277
		RAISE_APPLICATION_ERROR (-20000, 'Missing some parameters! nSourceRtagId= '|| nSourceRtagId ||', nTargetRtagId='|| nTargetRtagId );
278
	END IF;
279
 
280
	IF (nSourceRtagId = nTargetRtagId) THEN
281
		RAISE_APPLICATION_ERROR (-20000, 'Cannot import release contents from same release.' );
282
	END IF;
283
 
284
 
285
	-- Check if Target release is in OPEN mode
286
	SELECT rt.OFFICIAL  INTO  cReleaseMode
287
	  FROM RELEASE_TAGS rt
288
	 WHERE rt.RTAG_ID = nTargetRtagId;
289
 
290
	IF (cReleaseMode != 'N') 
291
THEN
292
		RAISE_APPLICATION_ERROR (-20000, 'Release must be in OPEN mode to import the contents.' );
293
	END IF;	 
294
 
295
	/*-------------------------------------------------------*/
296
 
297
	-- Clean target contents
298
	Clean_Release_Contents ( nTargetRtagId, nUserId );
299
 
300
 
301
	-- Import Released Area Contents
302
	INSERT INTO RELEASE_CONTENT ( RTAG_ID, PV_ID, BASE_VIEW_ID, INSERT_STAMP, INSERTOR_ID, PKG_STATE, PKG_ID, DEPRECATED_STATE ) 
303
	SELECT nTargetRtagId AS RTAG_ID, 
304
		   rc.PV_ID, 
305
		   rc.BASE_VIEW_ID, 
306
		   rc.INSERT_STAMP, 
307
		   rc.INSERTOR_ID, 
308
		   rc.PKG_STATE,
309
		   rc.PKG_ID,
310
		   rc.DEPRECATED_STATE
311
	  FROM RELEASE_CONTENT rc
312
	 WHERE rc.RTAG_ID = nSourceRtagId;
313
 
314
 
315
	--Import Release Configuration Information
316
	OPEN curReleaseConfigs;
317
    FETCH curReleaseConfigs INTO recReleaseConfigs;
318
 
319
	WHILE curReleaseConfigs%FOUND
320
	LOOP
321
 
322
		-- Get the next rcon id
323
		SELECT SEQ_RCON_ID.NEXTVAL INTO RconId FROM DUAL;
324
 
325
		INSERT INTO RELEASE_CONFIG ( RCON_ID, RTAG_ID, GBE_ID, DAEMON_HOSTNAME, DAEMON_MODE, GBE_BUILDFILTER )
326
		VALUES ( RconId, nTargetRtagId, recReleaseConfigs.gbe_id, recReleaseConfigs.daemon_hostname, recReleaseConfigs.daemon_mode, recReleaseConfigs.gbe_buildfilter );
327
 
328
		FETCH curReleaseConfigs INTO recReleaseConfigs;
329
	END LOOP;
330
 
331
	CLOSE curReleaseConfigs;		
332
 
333
 
334
 
335
	-- Import Ignore Warning states
336
	INSERT INTO IGNORE_WARNINGS ( RTAG_ID, PV_ID, DPV_ID )
337
	SELECT nTargetRtagId AS RTAG_ID,
338
	       igw.PV_ID,
339
	       igw.DPV_ID
340
	  FROM IGNORE_WARNINGS igw
341
	 WHERE igw.rtag_id = nSourceRtagId;
342
 
343
 
344
	/* Log Project Action */
345
	-- Get Source Location
346
	SELECT pr.PROJ_NAME ||' > '|| rt.RTAG_NAME ||' ['|| rt.RTAG_VERSION ||'.'|| rt.RTAG_LIFE_CYCLE ||']'  INTO sSourceLocation
347
	  FROM RELEASE_TAGS rt,
348
	  	   PROJECTS pr
349
	 WHERE rt.PROJ_ID = pr.PROJ_ID
350
	   AND rt.RTAG_ID = nSourceRtagId;
351
 
352
	-- Get Target Location
353
	SELECT pr.PROJ_NAME ||' > '|| rt.RTAG_NAME ||' ['|| rt.RTAG_VERSION ||'.'|| rt.RTAG_LIFE_CYCLE ||']'  INTO sTargetLocation
354
	  FROM RELEASE_TAGS rt,
355
	  	   PROJECTS pr
356
	 WHERE rt.PROJ_ID = pr.PROJ_ID
357
	   AND rt.RTAG_ID = nTargetRtagId;	   
358
 
359
	-- Get project id   
360
	SELECT rt.PROJ_ID  INTO  ProjId
361
	  FROM RELEASE_TAGS rt
362
	 WHERE rt.RTAG_ID = nTargetRtagId;   
363
 
364
	Log_Project_Action ( ProjId, 'import_release_contents', nUserId, 'SOURCE: '|| sSourceLocation ||'   TARGET: '|| sTargetLocation, nTargetRtagId );	
365
 
366
 
367
END;
368
/*-------------------------------------------------------------------------------------------------------*/
369
PROCEDURE Clean_Release_Contents ( nRtagId IN NUMBER, nUserId IN NUMBER ) IS
370
 
371
	RecCount NUMBER;
372
        rconIdList VARCHAR2(4000);
373
 
374
BEGIN
375
	/*--------------- Business Rules Here -------------------*/
376
	IF (nRtagId IS NULL) 
377
	THEN
378
		RAISE_APPLICATION_ERROR (-20000, 'Missing some parameters! nRtagId= '|| nRtagId  );
379
	END IF;
380
 
381
 
382
	-- Check if other release references this release
383
	SELECT COUNT( rl.RTAG_ID ) INTO RecCount
384
	  FROM RELEASE_LINKS rl
385
	 WHERE rl.REF_RTAG_ID = nRtagId;
386
 
387
	IF (RecCount > 0) THEN
388
		RAISE_APPLICATION_ERROR (-20000, 'This release is referenced by other release and cannot be destroyed.'  );
389
	END IF; 	
390
	/*-------------------------------------------------------*/
391
 
392
	-- Delete Release links
393
	DELETE 
394
	  FROM RELEASE_LINKS rl
395
	 WHERE rl.RTAG_ID = nRtagId;
396
 
397
	-- Delete ignore warning
398
	DELETE 
399
	  FROM IGNORE_WARNINGS iw
400
	 WHERE iw.RTAG_ID = nRtagId;
401
 
402
 
403
	-- Delete Build Order cached calculations	  
404
	DELETE
405
	  FROM BUILD_ORDER bo
406
	 WHERE bo.RTAG_ID = nRtagId;
407
 
408
 
409
	-- Delete Notification History
410
	DELETE
411
	  FROM NOTIFICATION_HISTORY nh
412
	 WHERE nh.RTAG_ID = nRtagId;
413
 
414
 
415
	-- Delete Released Area Contents
416
	DELETE
417
	  FROM RELEASE_CONTENT rc
418
	 WHERE rc.RTAG_ID = nRtagId;
419
 
420
 
421
	-- Delete Work In Progress Area Contents
422
	DELETE
423
	  FROM WORK_IN_PROGRESS wip
424
	 WHERE wip.RTAG_ID = nRtagId;
425
 
426
 
427
	-- Delete Pending Area Contents
428
	DELETE 
429
	  FROM PLANNED pl
430
	 WHERE pl.RTAG_ID = nRtagId;
431
 
432
	-- Delete Deprecated Packages (Added By Rupesh Solanki 29/06/2006)
433
	DELETE
434
	  FROM DEPRECATED_PACKAGES dp
435
	 WHERE dp.RTAG_ID = nRtagId; 
436
 
437
	-- Delete Project Action Log (Added By Rupesh Solanki 29/06/2006)
438
	DELETE
439
	  FROM PROJECT_ACTION_LOG pal
440
	 WHERE pal.RTAG_ID = nRtagId;
441
 
442
	-- Delete Do Not Ripple Contents (Added By Rupesh Solanki 29/06/2006)
443
	DELETE
444
	  FROM DO_NOT_RIPPLE dnr
445
	 WHERE dnr.RTAG_ID = nRtagId; 
446
 
447
	-- Delete Dash Board Contents (Added By Rupesh Solanki 16/02/2007)
448
	DELETE
449
	  FROM DASH_BOARD db
450
	 WHERE db.RTAG_ID = nRtagId;
451
 
452
        -- Delete Daemons For This Release (Added By Jeremy Tweddle 28/03/2008)        
453
        FOR rcon IN (SELECT rc.RCON_ID FROM RELEASE_CONFIG rc WHERE rc.RTAG_ID = nRtagId )
454
        LOOP
455
          rconIdList := rconIdList || rcon.RCON_ID || ',';
456
        END LOOP;
457
 
458
        pk_buildapi.DELETE_DAEMON(rconIdList);
459
 
460
        -- Delete Release Metrics Contents (Added By Jeremy Tweddle 28/03/2008)
461
        DELETE
462
          FROM RELEASE_METRICS rm
463
         WHERE rm.RTAG_ID = nRtagId;
464
 
465
	-- Delete Release Configuration Contents ( Added By Rupesh Solanki 10/04/2007)
466
	DELETE
467
	  FROM RELEASE_CONFIG rc
468
	 WHERE rc.RTAG_ID = nRtagId;
469
 
470
 
471
 
472
END;
473
/*-------------------------------------------------------------------------------------------------------*/
474
FUNCTION GET_PARENT_RTAG ( nRtagId IN NUMBER, nSourceRtagId IN NUMBER, cIsBranch IN CHAR )  RETURN NUMBER IS
475
 
476
	nSourceParentRtagId NUMBER;
477
 
478
BEGIN
479
	/*--------------- Business Rules Here -------------------*/
480
	IF (nRtagId IS NULL) OR (cIsBranch IS NULL)  
481
	THEN
482
		RAISE_APPLICATION_ERROR (-20000, 'Missing some parameters! nRtagId= '|| nRtagId ||', cIsBranch= '|| cIsBranch );
483
	END IF;
484
	/*-------------------------------------------------------*/
485
 
486
 
487
	IF ( nSourceRtagId IS NULL ) THEN
488
		-- Create new on main branch
489
		RETURN nRtagId;
490
 
491
	ELSE
492
		-- Create from source rtag_id
493
 
494
		-- Find parent of Source RtagId
495
		SELECT rt.PARENT_RTAG_ID INTO nSourceParentRtagId
496
		  FROM RELEASE_TAGS rt
497
		 WHERE rt.RTAG_ID = nSourceRtagId;
498
 
499
		IF (UPPER(cIsBranch) = 'Y') THEN
500
			RETURN nSourceRtagId;
501
		ELSE
502
			IF (nSourceRtagId = nSourceParentRtagId) THEN
503
				RETURN nRtagId;
504
			ELSE
505
				RETURN nSourceParentRtagId;
506
			END IF;
507
		END IF;	
508
 
509
 
510
	END IF;
511
 
512
 
513
END;
514
/*-------------------------------------------------------------------------------------------------------*/
515
 
516
-- PROCEDURE Get_Next_Version ( nSourceRtagId IN NUMBER,
517
-- 							 sNextVersion OUT VARCHAR2,
518
-- 							 nNextLifeCycle OUT NUMBER,
519
-- 							 nParentRtagId OUT NUMBER,
520
-- 							 nProjId IN NUMBER ) IS
521
-- 							
522
-- SourceBranchCount NUMBER;
523
-- ProjRootVersion VARCHAR2(4000);
524
-- LastLifeCycle NUMBER;
525
-- ROOT_VERSION_NOT_FOUND NUMBER := -1;
526
-- SET_PARENT_AS_YOURSELF NUMBER := -1;
527
-- 
528
-- SourceProjId NUMBER; 
529
-- SourceVersion RELEASE_TAGS.RTAG_VERSION%TYPE;
530
-- SourceLifeCycle RELEASE_TAGS.RTAG_LIFE_CYCLE%TYPE;
531
-- 
532
-- BEGIN
533
-- 	/*--------------- Business Rules Here -------------------*/
534
-- 	/*-------------------------------------------------------*/
535
-- 	
536
-- 	   
537
-- 	BEGIN
538
-- 		-- Get Project root version
539
-- 		SELECT rt.RTAG_VERSION INTO ProjRootVersion
540
-- 		  FROM RELEASE_TAGS rt
541
-- 		 WHERE rt.PROJ_ID = nProjId
542
-- 		   AND rt.RTAG_ID = rt.PARENT_RTAG_ID;
543
-- 	   
544
-- 		EXCEPTION
545
-- 		WHEN NO_DATA_FOUND THEN
546
-- 		ProjRootVersion := ROOT_VERSION_NOT_FOUND;
547
-- 	END;		   
548
-- 	
549
-- 	
550
-- 	
551
-- 	 
552
-- 	BEGIN
553
-- 		-- Get info for source rtagid
554
-- 		SELECT rt.PROJ_ID, rt.RTAG_VERSION, rt.RTAG_LIFE_CYCLE  INTO  SourceProjId, SourceVersion, SourceLifeCycle
555
-- 		  FROM RELEASE_TAGS rt
556
-- 		 WHERE rt.RTAG_ID = nSourceRtagId;	
557
-- 	   
558
-- 		EXCEPTION
559
-- 		WHEN NO_DATA_FOUND THEN
560
-- 		SourceProjId := NULL;
561
-- 		SourceVersion := NULL;
562
-- 		SourceLifeCycle := NULL;
563
-- 	END;	  
564
-- 	
565
-- 	
566
-- 	IF (nSourceRtagId IS NULL)  OR  ( SourceProjId != nProjId ) THEN
567
-- 	
568
-- 		/* Blank Release Required  OR  Release imported from other project */
569
-- 		
570
-- 		IF (ProjRootVersion = ROOT_VERSION_NOT_FOUND) THEN
571
-- 			/* No Releases found in the project, hence calculate next version available.  */
572
-- 			
573
-- 			-- Set parent rtag
574
-- 			nParentRtagId := SET_PARENT_AS_YOURSELF;
575
-- 			
576
-- 			
577
-- 			BEGIN
578
-- 				-- Get Next Available Global Root Version 
579
-- 				SELECT MAX( TO_NUMBER( rt.RTAG_VERSION ) )  INTO  ProjRootVersion
580
-- 				  
581
FROM RELEASE_TAGS rt
582
-- 				 WHERE rt.RTAG_ID = rt.PARENT_RTAG_ID;
583
-- 				
584
-- 				-- Set Next Rtag Version
585
-- 				sNextVersion := CAST( ProjRootVersion + 1 AS VARCHAR2 );
586
-- 				
587
-- 				-- Restart Lifecycle
588
-- 				nNextLifeCycle := 0;
589
-- 				
590
-- 				
591
-- 				EXCEPTION
592
-- 				WHEN NO_DATA_FOUND THEN
593
-- 				-- Release Manager has no releases, hence start from 1
594
-- 				sNextVersion := '1';
595
-- 				nNextLifeCycle := 0;
596
-- 				
597
-- 			END;
598
-- 			
599
-- 			
600
-- 					
601
-- 		ELSE
602
-- 			/* Releases found in this project. */
603
-- 							   
604
-- 			SELECT qry.RTAG_ID, qry.RTAG_LIFE_CYCLE  INTO nParentRtagId, LastLifeCycle
605
-- 			  FROM (
606
-- 					SELECT rt.RTAG_ID, rt.RTAG_LIFE_CYCLE
607
-- 					  FROM RELEASE_TAGS rt
608
-- 					 WHERE rt.PROJ_ID = nProjId
609
-- 					   AND rt.RTAG_VERSION = ProjRootVersion 
610
-- 					 ORDER BY rt.RTAG_LIFE_CYCLE DESC
611
-- 			  		) qry
612
-- 			 WHERE ROWNUM = 1;		
613
-- 
614
-- 			
615
-- 			-- Set same Rtag Version
616
-- 			sNextVersion := ProjRootVersion;
617
-- 			
618
-- 			-- Increase Lifecycle
619
-- 			nNextLifeCycle := LastLifeCycle + 1;
620
-- 		
621
-- 		END IF;
622
-- 				
623
-- 	
624
-- 		
625
-- 	ELSE
626
-- 		/* Create Release From other release within this project */
627
-- 		
628
-- 		-- Set parent id
629
-- 		nParentRtagId := nSourceRtagId;
630
-- 		
631
-- 		
632
-- 		-- Get number of source branches
633
-- 		SELECT COUNT(rt.RTAG_ID) INTO SourceBranchCount
634
-- 		  FROM RELEASE_TAGS rt
635
-- 		 WHERE rt.PROJ_ID = nProjId
636
-- 		   AND rt.PARENT_RTAG_ID = nSourceRtagId;		   
637
-- 		   
638
-- 		   
639
-- 		IF SourceBranchCount = 0 THEN
640
-- 			/* Release is Head (i.e. Tip on its branch ) */
641
-- 			
642
-- 			-- Set Next Rtag Version
643
-- 			sNextVersion := SourceVersion;
644
-- 			
645
-- 			-- Increase Lifecycle
646
-- 			nNextLifeCycle := SourceLifeCycle + 1;
647
-- 			
648
-- 			
649
-- 		ELSIF SourceBranchCount = 1 THEN
650
-- 			/* Release IS NOT Head, but can be branched */
651
-- 			
652
-- 			-- Set Next Rtag Version
653
-- 			sNextVersion := SourceVersion ||'.'|| SourceLifeCycle;
654
-- 			
655
-- 			-- Reset Lifecycle to 1
656
-- 			nNextLifeCycle := 1;
657
-- 			
658
-- 			
659
-- 		ELSE	
660
-- 			-- Limit of two branches is reached
661
-- 			RAISE_APPLICATION_ERROR (-20000, 'This release is already branched and cannot be branched again. ');		
662
-- 			
663
-- 		END IF;	
664
-- 			
665
-- 			
666
-- 		
667
-- 		
668
-- 		
669
-- 	
670
-- 	END IF;
671
-- 	
672
-- 		
673
-- END;
674
 
675
/*-------------------------------------------------------------------------------------------------------*/
676
PROCEDURE GET_VIEW_CONTENT ( RtagId IN NUMBER, ViewId IN NUMBER, RecordSet OUT typeCur ) IS
677
 
678
	IsBaseView CHAR(1);
679
 
680
BEGIN
681
 
682
	-- Check if the view is BASE VIEW
683
	SELECT vi.BASE_VIEW INTO IsBaseView
684
	  FROM VIEWS vi
685
	 WHERE vi.VIEW_ID = ViewId;
686
 
687
	IF (IsBaseView = 'Y') THEN 
688
		-- Get Base view content
689
		OPEN RecordSet FOR
690
		SELECT DECODE ( rel.pkg_state, NULL, 0, rel.pkg_state ) AS PKG_STATE,
691
			   rel.deprecated_state,
692
			   pv.pv_id, 
693
			   pkg.pkg_name, 
694
			   pv.pkg_version, 
695
			   pv.dlocked, 
696
			   pv.pv_description,
697
			   pv.BUILD_TYPE
698
		  FROM release_content rel,
699
		       packages pkg,
700
		       package_versions pv
701
		 WHERE pv.pkg_id = pkg.pkg_id
702
		   AND rel.pv_id = pv.pv_id
703
		   AND rel.BASE_VIEW_ID = ViewId
704
		   AND rel.RTAG_ID = RtagId
705
		 ORDER BY UPPER(pkg.PKG_NAME);
706
 
707
	ELSE	 
708
 
709
	 	-- Get non base view content
710
		OPEN RecordSet FOR
711
		SELECT DECODE ( rel.pkg_state, NULL, 0, rel.pkg_state ) AS PKG_STATE,
712
			   rel.deprecated_state,
713
			   pv.pv_id, 
714
			   pkg.pkg_name, 
715
			   pv.pkg_version, 
716
			   pv.dlocked, 
717
			   pv.pv_description,
718
			   pv.BUILD_TYPE
719
		  FROM release_content rel,
720
		       packages pkg,
721
		       package_versions pv,
722
			   VIEW_DEF vd
723
		 WHERE pv.pkg_id = pkg.pkg_id
724
		   AND rel.pv_id = pv.pv_id
725
		   AND vd.VIEW_ID = ViewId
726
		   AND vd.PKG_ID = pv.PKG_ID
727
		   AND rel.RTAG_ID = RtagId
728
		 ORDER BY UPPER(pkg.PKG_NAME);		 
729
 
730
	END IF;	 	 
731
 
732
 
733
 
734
 
735
END;
736
/*-------------------------------------------------------------------------------------------------------*/
737
PROCEDURE ADD_PACKAGE ( newPvId IN NUMBER, ViewId IN NUMBER, RtagId IN NUMBER, UserId IN NUMBER ) IS
738
 
739
	ReleaseLocation VARCHAR2(4000);
740
	sPkgVersion VARCHAR2(4000);
741
	nPkgId NUMBER;
742
	sVExt VARCHAR2(4000);
743
	IsPatch PACKAGE_VERSIONS.IS_PATCH%TYPE := 'N';
744
 
745
	-- Find package for replacement
746
	CURSOR curReplacePkg IS
747
    SELECT pv.PV_ID
748
	  FROM RELEASE_CONTENT rc,
749
	  	   PACKAGE_VERSIONS pv
750
	 WHERE rc.PV_ID = pv.PV_ID
751
	   AND rc.RTAG_ID = RtagId
752
	   AND pv.PKG_ID = nPkgId
753
	   AND NVL( pv.V_EXT, 'LINK_A_NULL' ) = NVL( sVExt, 'LINK_A_NULL' );
754
    recReplacePkg curReplacePkg%ROWTYPE;
755
 
756
BEGIN
757
 
758
	-- Get is_patch, pkg_id and v_ext
759
	SELECT pv.IS_PATCH, pv.PKG_ID, pv.V_EXT INTO IsPatch, nPkgId, sVExt
760
	  FROM PACKAGE_VERSIONS pv
761
	 WHERE pv.PV_ID = newPvId;
762
 
763
 
764
	-- Never put patch in relesed area
765
	IF (IsPatch != 'Y') OR (IsPatch IS NULL) THEN
766
 
767
		-- Try to get a package to be replaced with this new one.
768
		-- Use unique constraint of PKG_ID and V_EXT
769
		OPEN curReplacePkg;
770
	    FETCH curReplacePkg INTO recReplacePkg;
771
 
772
	    IF curReplacePkg%FOUND THEN
773
			-- Replace package
774
			REPLACE_PACKAGE ( newPvId, recReplacePkg.PV_ID, RtagId, UserId );
775
 
776
		ELSE
777
			-- Add new package
778
			INSERT INTO RELEASE_CONTENT ( RTAG_ID, PV_ID, BASE_VIEW_ID, INSERT_STAMP, INSERTOR_ID, PKG_STATE )
779
			VALUES( RtagId, newPvId, ViewId, Ora_Sysdate, UserId, 0);
780
 
781
 
782
		    /* LOG ACTION */
783
			SELECT proj.PROJ_NAME ||' / '|| rt.RTAG_NAME INTO ReleaseLocation
784
			  FROM PROJECTS proj,
785
			  	   RELEASE_TAGS rt
786
			 WHERE rt.PROJ_ID = proj.PROJ_ID
787
			   AND rt.RTAG_ID = RtagId;
788
 
789
			SELECT pv.PKG_VERSION INTO sPkgVersion
790
			  FROM PACKAGE_VERSIONS pv
791
			 WHERE pv.PV_ID = newPvId;
792
 
793
			Log_Action ( newPvId, 'add', UserId, 'Location: '|| ReleaseLocation );
794
 
795
 
796
		END IF;
797
 
798
		CLOSE curReplacePkg;
799
 
800
	END IF;
801
 
802
END;
803
/*-------------------------------------------------------------------------------------------------------*/
804
PROCEDURE REPLACE_PACKAGE ( newPvId IN NUMBER, oldPvId IN NUMBER, RtagId IN NUMBER, UserId IN NUMBER ) IS
805
 
806
	ReleaseLocation VARCHAR2(4000);
807
	sPkgVersion VARCHAR2(4000);
808
 
809
BEGIN
810
 
811
	-- Replace Package
812
    UPDATE RELEASE_CONTENT
813
       SET pv_id = newPvId,
814
           insert_stamp = Ora_Sysdate,
815
           insertor_id = UserId,
816
		   product_state = NULL
817
     WHERE rtag_id = RtagId
818
       AND pv_id = oldPvId;  
819
 
820
 
821
    /* LOG ACTION */
822
	SELECT proj.PROJ_NAME ||' / '|| rt.RTAG_NAME INTO ReleaseLocation
823
	  FROM PROJECTS proj,
824
	  	   RELEASE_TAGS rt
825
	 WHERE rt.PROJ_ID = proj.PROJ_ID
826
	   AND rt.RTAG_ID = RtagId;
827
 
828
	SELECT pv.PKG_VERSION INTO sPkgVersion
829
	  FROM PACKAGE_VERSIONS pv
830
	 WHERE pv.PV_ID = newPvId;
831
 
832
	Log_Action ( oldPvId, 'replaced_with', UserId, 'Replacing with: '|| sPkgVersion ||' at '|| ReleaseLocation );
833
	Log_Action ( newPvId, 'add', UserId, 'Location: '|| ReleaseLocation );
834
 
835
END;
836
/*-------------------------------------------------------------------------------------------------------*/
837
PROCEDURE REMOVE_PACKAGE ( PvId IN NUMBER, RtagId IN NUMBER, UserId IN NUMBER ) IS
838
	ReleaseLocation VARCHAR2(4000);
839
 
840
BEGIN
841
 
842
 
843
	-- Delete old package
844
	DELETE
845
	  FROM RELEASE_CONTENT rc
846
	 WHERE rc.PV_ID = PvId
847
	   AND rc.RTAG_ID = RtagId;
848
 
849
 
850
	/* LOG ACTION */
851
	SELECT proj.PROJ_NAME ||' / '|| rt.RTAG_NAME INTO ReleaseLocation
852
	  FROM PROJECTS proj,
853
	       RELEASE_TAGS rt
854
	 WHERE rt.PROJ_ID = proj.PROJ_ID
855
	   AND rt.RTAG_ID = RtagId;
856
 
857
	Log_Action ( PvId, 'delete_from_released', UserId, 'Location: '|| ReleaseLocation );
858
 
859
 
860
END;
861
/*-------------------------------------------------------------------------------------------------------*/
862
PROCEDURE REMOVE_MATCHING_PACKAGE ( PvId IN NUMBER, RtagId IN NUMBER, UserId IN NUMBER ) IS
863
	ReleaseLocation VARCHAR2(4000);
864
 
865
	CURSOR curMatchingPackage IS
866
    SELECT mpv.PV_ID
867
	  FROM RELEASE_CONTENT rc,
868
	  	   PACKAGE_VERSIONS mpv,
869
		   PACKAGE_VERSIONS pv
870
	 WHERE rc.PV_ID = mpv.PV_ID
871
	   AND rc.RTAG_ID = RtagId
872
	   AND pv.PV_ID = PvId
873
	   AND pv.PKG_ID = mpv.PKG_ID
874
	   AND NVL( pv.V_EXT, '|LINK_A_NULL|' ) = NVL( mpv.V_EXT, '|LINK_A_NULL|' );
875
    recMatchingPackage curMatchingPackage%ROWTYPE;
876
 
877
BEGIN
878
 
879
	OPEN curMatchingPackage;
880
    FETCH curMatchingPackage INTO recMatchingPackage;
881
 
882
    IF curMatchingPackage%FOUND THEN
883
		-- Delete old package
884
		DELETE
885
		  FROM RELEASE_CONTENT rc
886
		 WHERE rc.PV_ID = recMatchingPackage.PV_ID
887
		   AND rc.RTAG_ID = RtagId;
888
 
889
 
890
		/* LOG ACTION */
891
		SELECT proj.PROJ_NAME ||' / '|| rt.RTAG_NAME INTO 
892
ReleaseLocation
893
		  FROM PROJECTS proj,
894
		  	   RELEASE_TAGS rt
895
		 WHERE rt.PROJ_ID = proj.PROJ_ID
896
		   AND rt.RTAG_ID = RtagId;
897
 
898
		Log_Action ( recMatchingPackage.PV_ID, 'delete_from_released', UserId, 'Location: '|| ReleaseLocation );
899
 
900
	END IF;
901
 
902
 
903
	CLOSE curMatchingPackage;
904
 
905
 
906
 
907
 
908
END;
909
/*-------------------------------------------------------------------------------------------------------*/
910
FUNCTION GET_PACKAGE_VIEW ( PvId IN NUMBER, RtagId IN NUMBER ) RETURN NUMBER IS
911
 
912
	ReturnValue NUMBER;
913
 
914
BEGIN
915
	SELECT rc.BASE_VIEW_ID INTO ReturnValue
916
	  FROM RELEASE_CONTENT rc
917
	 WHERE rc.RTAG_ID = RtagId
918
	   AND rc.PV_ID = PvId;
919
 
920
	RETURN ReturnValue;
921
END;
922
/*-------------------------------------------------------------------------------------------------------*/
923
PROCEDURE RUN_POST_ACTIONS ( PvId IN NUMBER, RtagId IN NUMBER ) IS
924
 
925
BEGIN
926
	-- Reset Ignore warnings up-the-tree
927
	RESET_IGNORE_WARNINGS ( TO_CHAR(PvId), RtagId );
928
 
929
	-- Refresh Package states
930
	TOUCH_RELEASE ( RtagId );
931
 
932
END;
933
/*-------------------------------------------------------------------------------------------------------*/
934
PROCEDURE RUN_POST_ACTIONS_BULK ( PvId IN NUMBER ) IS
935
	CURSOR curReleases IS
936
    SELECT rc.RTAG_ID
937
	  FROM RELEASE_CONTENT rc
938
	 WHERE rc.PV_ID = PvId;
939
    recReleases curReleases%ROWTYPE;
940
 
941
BEGIN
942
 
943
	OPEN curReleases;
944
    FETCH curReleases INTO recReleases;
945
 
946
	WHILE curReleases%FOUND
947
	LOOP
948
 
949
		RUN_POST_ACTIONS ( PvId, recReleases.RTAG_ID );
950
 
951
		FETCH curReleases INTO recReleases;
952
	END LOOP;
953
 
954
	CLOSE curReleases;	
955
 
956
END;
957
/*-------------------------------------------------------------------------------------------------------*/
958
PROCEDURE CHANGE_PACKAGE_VIEW ( PvId IN NUMBER, RtagId IN NUMBER, NewViewId IN NUMBER ) IS
959
 
960
BEGIN
961
 
962
	UPDATE RELEASE_CONTENT rc SET
963
	rc.BASE_VIEW_ID = NewViewId
964
	WHERE rc.PV_ID = PvId
965
	  AND rc.RTAG_ID = RtagId;
966
 
967
END;
968
/*-------------------------------------------------------------------------------------------------------*/
969
PROCEDURE ADD_RELEASE_REFERENCE ( nRtagId IN NUMBER, nRefRtagId IN NUMBER, ProblemString OUT VARCHAR2 ) IS
970
 
971
	RowCount NUMBER;
972
 
973
 
974
	CURSOR curPackageClash IS
975
	SELECT pkg.PKG_NAME,
976
		   er.*
977
	  FROM (
978
 
979
	  		/* Get existing referenced packages */
980
			SELECT pv.PKG_ID,
981
			       pv.V_EXT
982
			  FROM RELEASE_LINKS rl,
983
			  	   RELEASE_CONTENT rc,
984
			  	   PACKAGE_VERSIONS pv
985
			 WHERE rl.RTAG_ID = nRtagId
986
			   AND rl.REF_RTAG_ID = rc.RTAG_ID
987
			   AND rc.PV_ID = pv.PV_ID
988
 
989
	  	    ) er,
990
			(
991
 
992
			/* Get current reference packages */
993
			SELECT pv.PKG_ID,
994
			       pv.V_EXT
995
			  FROM RELEASE_CONTENT rc,
996
			  	   PACKAGE_VERSIONS pv
997
			 WHERE rc.RTAG_ID = nRefRtagId
998
			   AND rc.PV_ID = pv.PV_ID    
999
 
1000
			) cr,
1001
			PACKAGES PKG
1002
	 WHERE er.PKG_ID = cr.PKG_ID
1003
	   AND NVL(er.V_EXT, '|LINK_A_NULL|') = NVL(cr.V_EXT, '|LINK_A_NULL|')
1004
	   AND er.PKG_ID = pkg.PKG_ID;
1005
 
1006
	recPackageClash curPackageClash%ROWTYPE;	   
1007
 
1008
BEGIN
1009
	/*--------------- Business Rules Here -------------------*/
1010
	IF (nRtagId = 0) OR ( nRtagId IS NULL ) THEN
1011
		RAISE_APPLICATION_ERROR (-20000, 'nRtagId is not supplied. [nRtagId='|| nRtagId ||']' );
1012
	END IF;
1013
 
1014
	IF (nRefRtagId = 0) OR ( nRefRtagId IS NULL ) THEN
1015
		RAISE_APPLICATION_ERROR (-20000, 'nRefRtagId is not supplied. [nRefRtagId='|| nRefRtagId ||']' );
1016
	END IF;
1017
	/*-------------------------------------------------------*/
1018
	ProblemString := NULL;
1019
 
1020
 
1021
	-- Check if release already has references
1022
	SELECT COUNT(rl.RTAG_ID)  INTO  RowCount
1023
	  FROM RELEASE_LINKS rl
1024
	 WHERE rl.RTAG_ID = nRtagId;	
1025
 
1026
 
1027
	IF RowCount > 0 THEN
1028
		-- Found existing references
1029
 
1030
		-- Make sure there is no package clashes
1031
		OPEN curPackageClash;
1032
	    FETCH curPackageClash INTO recPackageClash;
1033
 
1034
		IF curPackageClash%FOUND THEN
1035
 
1036
			ProblemString := ProblemString ||'Following is partial list of package already referenced from other release:'|| UTL_TCP.CRLF;
1037
 
1038
			WHILE curPackageClash%FOUND
1039
			LOOP
1040
				EXIT WHEN LENGTH( ProblemString || '- '|| recPackageClash.PKG_NAME ||' '|| recPackageClash.V_EXT  || UTL_TCP.CRLF ) > 200;	-- Do not allow variable overflow 
1041
 
1042
				ProblemString := ProblemString || '- '|| recPackageClash.PKG_NAME ||' '|| recPackageClash.V_EXT  || UTL_TCP.CRLF;
1043
 
1044
				FETCH curPackageClash INTO recPackageClash;
1045
			END LOOP;
1046
 
1047
		END IF;
1048
 
1049
		CLOSE curPackageClash;
1050
 
1051
 
1052
	ELSE
1053
		-- No references found, hence reference a release
1054
 
1055
 
1056
		-- Remove exising package from this release to be referenced
1057
		REMOVE_RELEASE_REFERENCE ( nRtagId, nRefRtagId);	
1058
 
1059
 
1060
		-- Add new linked packages to release
1061
		INSERT INTO RELEASE_CONTENT rc (RTAG_ID, PV_ID, BASE_VIEW_ID, INSERT_STAMP, INSERTOR_ID, PKG_STATE)
1062
		SELECT nRtagId,
1063
			   rc.PV_ID,
1064
			   rc.BASE_VIEW_ID, 
1065
			   rc.INSERT_STAMP, 
1066
			   rc.INSERTOR_ID, 
1067
			   rc.PKG_STATE
1068
		  FROM RELEASE_CONTENT rc
1069
		 WHERE rc.RTAG_ID = nRefRtagId;
1070
 
1071
 
1072
 
1073
		-- Copy ignore warnings for referenced packages
1074
		INSERT INTO IGNORE_WARNINGS iw (RTAG_ID, PV_ID, DPV_ID, IS_PATCH_IGNORE)
1075
		SELECT nRtagId, 
1076
			   iw.PV_ID, 
1077
			   iw.DPV_ID, 
1078
			   iw.IS_PATCH_IGNORE
1079
		  FROM IGNORE_WARNINGS iw,
1080
		  	   RELEASE_CONTENT rc
1081
		 WHERE iw.RTAG_ID = rc.RTAG_ID 
1082
		   AND iw.PV_ID = rc.PV_ID
1083
		   AND rc.RTAG_ID = nRefRtagId;	 
1084
 
1085
 
1086
 
1087
		-- Reference release 
1088
		INSERT INTO RELEASE_LINKS (RTAG_ID, REF_RTAG_ID)
1089
		VALUES ( nRtagId, nRefRtagId );		 
1090
 
1091
 
1092
		-- Refresh Package states
1093
		TOUCH_RELEASE ( nRtagId );
1094
 
1095
	END IF;	 
1096
 
1097
 
1098
END;
1099
/*-------------------------------------------------------------------------------------------------------*/
1100
PROCEDURE REMOVE_RELEASE_REFERENCE ( nRtagId IN NUMBER, nRefRtagId IN NUMBER ) IS
1101
 
1102
 
1103
BEGIN
1104
	/*--------------- Business Rules Here -------------------*/
1105
	IF (nRtagId = 0) OR ( nRtagId IS NULL ) THEN
1106
		RAISE_APPLICATION_ERROR (-20000, 'nRtagId is not supplied. [nRtagId='|| nRtagId ||']' );
1107
	END IF;
1108
 
1109
	IF (nRefRtagId = 0) OR ( nRefRtagId IS NULL ) THEN
1110
		RAISE_APPLICATION_ERROR (-20000, 'nRefRtagId is not supplied. [nRefRtagId='|| nRefRtagId ||']' );
1111
	END IF;
1112
 
1113
	/*-------------------------------------------------------*/
1114
 
1115
 
1116
	-- Remove ignore warnings for those packages who use referenced packages
1117
	DELETE FROM IGNORE_WARNINGS iw
1118
	 WHERE iw.RTAG_ID = nRtagId
1119
	   AND iw.DPV_ID IN (
1120
	   						SELECT dep.DPV_ID
1121
							  FROM (
1122
 
1123
									/* Get referenced packages */
1124
									SELECT pv.PKG_ID,
1125
									       pv.V_EXT
1126
									  FROM RELEASE_CONTENT rc,
1127
									  	   PACKAGE_VERSIONS pv
1128
									 WHERE rc.RTAG_ID = nRefRtagId
1129
									   AND rc.PV_ID = pv.PV_ID    
1130
 
1131
									) cr,
1132
									(
1133
 
1134
									/* Get all dependencies for current release */
1135
									SELECT DISTINCT 
1136
										   pv.PKG_ID,
1137
										   pv.V_EXT,
1138
										   dep.DPV_ID
1139
									  FROM RELEASE_CONTENT rc,
1140
										   PACKAGE_DEPENDENCIES dep,
1141
										   PACKAGE_VERSIONS pv
1142
									 WHERE rc.RTAG_ID = nRtagId
1143
									   AND rc.PV_ID = dep.PV_ID		
1144
									   AND dep.PV_ID = pv.PV_ID	   
1145
 
1146
									) dep
1147
							 WHERE dep.PKG_ID = cr.PKG_ID
1148
							   AND NVL(dep.V_EXT, '|LINK_A_NULL|') = NVL(cr.V_EXT, '|LINK_A_NULL|')
1149
	   					);  
1150
 
1151
 
1152
 
1153
 
1154
	-- Remove ignore warnings for those package which are going to be replaced with the reference
1155
	DELETE FROM IGNORE_WARNINGS iw
1156
	 WHERE iw.RTAG_ID = nRtagId
1157
	   AND iw.PV_ID IN (
1158
						SELECT pv.PV_ID
1159
						  FROM (
1160
 
1161
								/* Get referenced packages */
1162
								SELECT pv.PKG_ID,
1163
								       pv.V_EXT
1164
								  FROM RELEASE_CONTENT rc,
1165
								  	   PACKAGE_VERSIONS pv
1166
								 WHERE rc.RTAG_ID = nRefRtagId
1167
								   AND rc.PV_ID = pv.PV_ID    
1168
 
1169
								) cr,
1170
								RELEASE_CONTENT rc,
1171
								PACKAGE_VERSIONS pv
1172
						 WHERE pv.PKG_ID = cr.PKG_ID
1173
						   AND NVL(pv.V_EXT, '|LINK_A_NULL|') = NVL(cr.V_EXT, '|LINK_A_NULL|')
1174
						   AND rc.RTAG_ID = nRtagId
1175
						   AND rc.PV_ID = pv.PV_ID
1176
						);			
1177
 
1178
 
1179
 
1180
 
1181
 
1182
	-- Remove matching packages from release
1183
	DELETE FROM RELEASE_CONTENT rc
1184
	 WHERE rc.RTAG_ID = nRtagId
1185
	   AND rc.PV_ID IN (
1186
						SELECT pv.PV_ID
1187
						  FROM (
1188
 
1189
								/* Get referenced packages */
1190
								SELECT pv.PKG_ID,
1191
								       pv.V_EXT
1192
								  FROM RELEASE_CONTENT rc,
1193
								  	   PACKAGE_VERSIONS pv
1194
								 WHERE rc.RTAG_ID = nRefRtagId
1195
								   AND rc.PV_ID = pv.PV_ID    
1196
 
1197
 
1198
								) cr,
1199
								RELEASE_CONTENT rc,
1200
								PACKAGE_VERSIONS pv
1201
						 WHERE pv.PKG_ID = cr.PKG_ID
1202
						   AND NVL(pv.V_EXT, '|LINK_A_NULL|') = NVL(cr.V_EXT, '|LINK_A_NULL|')
1203
						   AND rc.RTAG_ID = nRtagId
1204
						   AND rc.PV_ID = pv.PV_ID
1205
						);	
1206
 
1207
 
1208
 
1209
 
1210
 
1211
	-- Remove Reference release 
1212
	DELETE 
1213
	  FROM RELEASE_LINKS rl
1214
	 WHERE rl.RTAG_ID = nRtagId
1215
	   AND rl.REF_RTAG_ID = nRefRtagId;
1216
 
1217
 
1218
	-- Refresh Package states
1219
	TOUCH_RELEASE ( nRtagId );
1220
 
1221
 
1222
END;
1223
/*-------------------------------------------------------------------------------------------------------*/
1224
PROCEDURE CAN_USER_WRITE_TO_RELEASE ( RtagId IN NUMBER, PvId IN NUMBER, Permission IN CHAR ) IS
1225
 
1226
	cReleaseMode CHAR(1);
1227
	cPvMode CHAR(1);
1228
 
1229
BEGIN
1230
 
1231
	-- Get Release Mode
1232
	SELECT rt.OFFICIAL INTO cReleaseMode
1233
	  FROM RELEASE_TAGS rt
1234
	 WHERE rt.RTAG_ID = RtagId;
1235
 
1236
 
1237
	-- Get Package Mode
1238
	SELECT pv.DLOCKED INTO cPvMode
1239
	  FROM PACKAGE_VERSIONS pv
1240
	 WHERE pv.PV_ID = PvId;	 
1241
 
1242
	-- Only check if package is locked 
1243
	IF (cPvMode = 'Y') THEN
1244
 
1245
		IF (cReleaseMode != 'N') AND (Permission != 'Y')
1246
		THEN
1247
			RAISE_APPLICATION_ERROR (-20000, 'Cannot add package to this release. Release needs to be in Open Mode.' );
1248
 
1249
		END IF;
1250
 
1251
	END IF;	
1252
 
1253
 
1254
END;
1255
 
1256
/*-------------------------------------------------------------------------------------------------------*/
1257
END PK_RELEASE;
1258
/
1259
ALTER PACKAGE "RELEASE_MANAGER"."PK_RELEASE" 
1260
  COMPILE BODY 
1261
    PLSQL_OPTIMIZE_LEVEL=  2
1262
    PLSQL_CODE_TYPE=  INTERPRETED
1263
    PLSQL_DEBUG=  TRUE
1264
 REUSE SETTINGS TIMESTAMP '2008-05-01 16:40:32'
1265
/