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