Subversion Repositories DevTools

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
221 vnguyen 1
CREATE PACKAGE BODY "RELEASE_MANAGER"."RM_ISSUES" AS
2
 
3
-- Private Implementation -----------------------------------------------------
4
 
5
 
6
	FUNCTION VerIsGrtrThanOrEqlToStart( XXstart IN NUMBER, XX IN NUMBER, YYstart IN NUMBER, YY IN NUMBER, ZZstart IN NUMBER, ZZ IN NUMBER ) RETURN NUMBER
7
	AS
8
 
9
	BEGIN
10
		-- start boundary case
11
		IF ( XXstart < XX ) THEN
12
			RETURN 1;
13
 
14
		ELSIF ( XXstart = XX ) THEN
15
 
16
			-- need to consider YY
17
			IF ( YYstart < YY ) THEN
18
				RETURN 1;
19
 
20
			ELSIF ( YYstart = YY ) THEN
21
 
22
					-- need to consider ZZ
23
					IF ( ZZstart <= ZZ ) THEN
24
						RETURN 1;
25
 
26
					ELSE
27
						RETURN 0;
28
					END IF;
29
 
30
			ELSE
31
				RETURN 0;
32
			END IF;
33
		ELSE
34
			RETURN 0;
35
		END IF;
36
	EXCEPTION
37
		WHEN OTHERS THEN
38
			RETURN -1;
39
	END;
40
 
41
 
42
	FUNCTION VerIsLessThanOrEqlToEnd( XXend IN NUMBER, XX IN NUMBER, YYend IN NUMBER, YY IN NUMBER, ZZend IN NUMBER, ZZ IN NUMBER ) RETURN NUMBER
43
	AS
44
 
45
	BEGIN
46
		-- end boundary case
47
		IF ( XX < XXend ) THEN
48
			RETURN 1;
49
 
50
		ELSIF ( XX = XXend ) THEN
51
 
52
			-- need to consider YY
53
			IF ( YY < YYend ) THEN
54
				RETURN 1;
55
 
56
			ELSIF ( YY = YYend ) THEN
57
 
58
					-- need to consider ZZ
59
					IF ( ZZ <= ZZend ) THEN
60
						RETURN 1;
61
 
62
					ELSE
63
						RETURN 0;
64
					END IF;
65
			ELSE
66
 
67
				RETURN 0;
68
			END IF;
69
		ELSE
70
			RETURN 0;
71
		END IF;
72
	EXCEPTION
73
		WHEN OTHERS THEN
74
			RETURN -1;
75
	END;
76
 
77
	/*
78
	-	version format:		XX.YY.ZZ.abc
79
	*/
80
	FUNCTION VersionIsBetween( version IN VARCHAR2, version_start IN VARCHAR2, version_end IN VARCHAR ) RETURN NUMBER
81
	AS
82
		XXstart		NUMBER	:=	0;
83
		XXend		NUMBER	:=	0;
84
		XX			NUMBER	:=	0;
85
		YYstart		NUMBER	:=	0;
86
		YYend		NUMBER	:=	0;
87
		YY			NUMBER	:=	0;
88
		ZZstart		NUMBER	:=	0;
89
		ZZend		NUMBER	:=	0;
90
		ZZ			NUMBER	:=	0;
91
		first_dot	NUMBER	:=	0;
92
		second_dot	NUMBER	:=	0;
93
		third_dot	NUMBER	:=	0;
94
 
95
		ProjExtstart	VARCHAR2(10);
96
		ProjExtend		VARCHAR2(10);
97
		ProjExt			VARCHAR2(10);
98
 
99
	BEGIN
100
		-- strip the version number
101
		first_dot :=  INSTR(version_start, '.', 1, 1);
102
		second_dot :=  INSTR(version_start, '.', 1, 2);
103
		third_dot :=  INSTR(version_start, '.', 1, 3);
104
 
105
		XXstart := TO_NUMBER( SUBSTR( version_start, 1, first_dot - 1 ) );
106
		YYstart := TO_NUMBER( SUBSTR( version_start, first_dot + 1, second_dot - ( first_dot + 1 ) ) );
107
		ZZstart := TO_NUMBER( SUBSTR( version_start, second_dot + 1, third_dot - ( second_dot + 1 ) ) );
108
		ProjExtstart := SUBSTR( version_start, third_dot + 1, LENGTH(version_start) - third_dot );
109
 
110
		first_dot :=  INSTR(version_end, '.', 1, 1);
111
		second_dot :=  INSTR(version_end, '.', 1, 2);
112
		third_dot :=  INSTR(version_end, '.', 1, 3);
113
 
114
		XXend := TO_NUMBER( SUBSTR( version_end, 1, first_dot - 1 ) );
115
		YYend := TO_NUMBER( SUBSTR( version_end, first_dot + 1, second_dot - ( first_dot + 1 ) ) );
116
		ZZend := TO_NUMBER( SUBSTR( version_end, second_dot + 1, third_dot - ( second_dot + 1 ) ) );
117
		ProjExtend := SUBSTR( version_end, third_dot + 1, LENGTH(version_end) - third_dot );
118
 
119
		first_dot :=  INSTR(version, '.', 1, 1);
120
		second_dot :=  INSTR(version, '.', 1, 2);
121
		third_dot :=  INSTR(version, '.', 1, 3);
122
 
123
		XX := TO_NUMBER( SUBSTR( version, 1, first_dot - 1 ) );
124
		YY := TO_NUMBER( SUBSTR( version, first_dot + 1, second_dot - ( first_dot + 1 ) ) );
125
		ZZ := TO_NUMBER( SUBSTR( version, second_dot + 1, third_dot - ( second_dot + 1 ) ) );
126
		ProjExt := SUBSTR( version, third_dot + 1, LENGTH(version) - third_dot );
127
 
128
		-- only include versions if all project extensions are the same
129
		IF ( ProjExtstart = ProjExt AND ProjExt = ProjExtend ) THEN
130
 
131
			IF ( VerIsGrtrThanOrEqlToStart( XXstart, XX, YYstart, YY, ZZstart, ZZ ) = 1 AND VerIsLessThanOrEqlToEnd( XXend, XX, YYend, YY, ZZend, ZZ ) = 1 ) THEN
132
				RETURN 1;
133
			ELSE
134
				RETURN 0;
135
			END IF;
136
		ELSE
137
			RETURN 0;
138
		END IF;
139
 
140
	EXCEPTION
141
		WHEN OTHERS THEN
142
			RETURN -1;
143
	END;
144
 
145
	FUNCTION GetPkgId( pkgName IN VARCHAR2 ) RETURN NUMBER
146
	AS
147
	    pkg_id NUMBER;
148
	BEGIN
149
		SELECT
150
			p.PKG_ID
151
		INTO
152
			pkg_id
153
		FROM
154
			PACKAGES p
155
		WHERE
156
			p.PKG_NAME = pkgName;
157
 
158
		RETURN pkg_id;
159
	EXCEPTION
160
	    WHEN OTHERS THEN
161
			dbms_output.put_line('GetPkgId exception: ' || SQLERRM );
162
			RETURN -1;
163
	END;
164
 
165
 
166
-- Public Implementation ------------------------------------------------------
167
 
168
	/*
169
	-- Proc: AllIssues - Gets all issues for a package from dependent packages one level deep
170
	--
171
	-- INPUT PARAMETERS:
172
	--
173
	--		pkg_name  	-  	The name of the top level package to get issues for
174
	--		version_start	-	The start version for the comparison
175
	--		version_end	-	The end version for the comparison
176
	*/
177
	PROCEDURE AllIssues( vCursor OUT T_Cur, pkg_name IN VARCHAR2, version_start IN VARCHAR2, version_end IN VARCHAR2 )
178
	AS
179
		pkgId	NUMBER;
180
	BEGIN
181
		-- get pkg_id of the input package:
182
		pkgId := GetPkgId( pkg_name );
183
 
184
		OPEN vCursor FOR
185
		SELECT
186
			  pv.PKG_ID,
187
			  pv.PKG_VERSION,
188
			  pv.PV_ID,
189
			  i_pkg.ISS_ID,
190
			  ( SELECT pkg_name FROM PACKAGES WHERE pkg_id = pd.DPKG_ID ) AS DPV_NAME,
191
			  pd.DPKG_ID,
192
			  ( SELECT pkg_version FROM PACKAGE_VERSIONS WHERE pv_id = pd.DPV_ID ) AS DPV_VER,
193
			  pd.DPV_ID,
194
			  i_dpkg.ISS_ID AS ISSUE_ID
195
		FROM
196
			 PACKAGE_VERSIONS pv
197
							  LEFT OUTER JOIN CQ_ISSUES i_pkg ON pv.PV_ID = i_pkg.PV_ID
198
							  LEFT OUTER JOIN PACKAGE_DEPENDENCIES pd ON pv.PV_ID = pd.PV_ID
199
							  LEFT OUTER JOIN CQ_ISSUES i_dpkg ON pd.DPV_ID = i_dpkg.PV_ID
200
		WHERE
201
   			 pv.PKG_ID = pkgId
202
		AND
203
			VersionIsBetween( pv.PKG_VERSION, version_start, version_end ) = 1
204
		AND
205
			 ( i_dpkg.ISS_ID IS NOT NULL OR i_pkg.ISS_ID IS NOT NULL )
206
		ORDER BY
207
			 pv.PKG_ID,
208
			 pv.PV_ID,
209
			 pd.DPKG_ID,
210
			 pd.DPV_ID;
211
	EXCEPTION
212
		WHEN OTHERS THEN
213
			dbms_output.put_line('AllIssues exception: ' || SQLERRM );
214
	END;
215
 
216
 
217
	-- NOTE: make RM_PACKAGE_ISSUES a temporary table when tested ok
218
 
219
	/*
220
	-- Proc: LoadIssuesTable
221
	--
222
	-- Populates Package_Issues table with details of issues from all dependent packages.
223
	-- This will be for all package versions of the input pkg_name between the
224
	-- version_start and version_end.
225
	--
226
	-- INPUT PARAMETERS:
227
	--
228
	--		pkg_name  	-  	The name of the top level package to get issues for
229
	--		version_start	-	The start version for the comparison
230
	--		version_end	-	The end version for the comparison
231
	*/
232
	PROCEDURE LoadIssuesTable( vCursor OUT T_Cur, pkg_name IN VARCHAR2, version_start IN VARCHAR2, version_end IN VARCHAR2 )
233
	AS
234
		pkgId	NUMBER;
235
 
236
		CURSOR pack_vers_cur IS
237
			SELECT
238
				pv.PV_ID,
239
				pv.PKG_VERSION,
240
				pv.PKG_ID,
241
				p.PKG_NAME
242
			FROM
243
				PACKAGE_VERSIONS pv
244
					JOIN PACKAGES p ON pv.PKG_ID = p.PKG_ID
245
			WHERE
246
   				 pv.PKG_ID = pkgId
247
			AND
248
				VersionIsBetween( pv.PKG_VERSION, version_start, version_end ) = 1;
249
 
250
	BEGIN
251
		DELETE FROM RELEASE_MANAGER.RM_PKG_ISSUES; /*RM_PACKAGE_ISSUES replaced by RM_PKG_ISSUES*/
252
 
253
		-- get the pkg_id we are finding issues for
254
		pkgId := GetPkgId( pkg_name );
255
 
256
		-- find all the top level packages we are dealing with and recursively process their issues and their dependent package issues.
257
		FOR pack_ver_rec IN  pack_vers_cur
258
		LOOP
259
			InsertIssuesForDepends( pack_ver_rec.PV_ID, pack_ver_rec.PKG_ID, pack_ver_rec.PKG_NAME, pack_ver_rec.PV_ID, pack_ver_rec.PKG_VERSION );
260
			COMMIT;
261
		END LOOP;
262
 
263
		-- The output cursor - shows the individual versions of the top level package then were reported on
264
		OPEN vCursor FOR
265
		SELECT DISTINCT ISS_ID, PKG_VERSION FROM RM_PKG_ISSUES WHERE ISS_ID IS NOT NULL; /*RM_PACKAGE_ISSUES replaced by RM_PKG_ISSUES*/
266
/*removed
267
		SELECT
268
			PKG_VERSION
269
		FROM
270
			RELEASE_MANAGER.RM_PACKAGE_ISSUES;
271
*/
272
 
273
 
274
	EXCEPTION
275
		WHEN OTHERS THEN
276
			dbms_output.put_line('LoadIssuesTable exception: ' || SQLERRM );
277
	END;
278
 
279
 
280
	/*
281
	-- Proc: InsertIssuesForDepends
282
	--
283
	-- Used by LoadIssuesTable to recursively find issues for all dependent packages
284
	--
285
	-- INPUT PARAMETERS:
286
	--
287
	--		pvID  		-  	The package version id of the package to get issues for
288
	--		top_pkgID	-  	The package id of the top level package to get issues for - should be the same as pvID when called from LoadIssuesTable (different when called recursively)
289
	--		top_pkgName -  	The package name of the top level package
290
	--		top_pvID  	-  	The package version id of the top level package
291
	--		top_pkgVer  -  	The package version description of the top level package
292
	*/
293
	PROCEDURE InsertIssuesForDepends( pvID IN NUMBER, top_pkgID IN NUMBER, top_pkgName IN VARCHAR2, top_pvID IN NUMBER, 
294
top_pkgVer IN VARCHAR2 )
295
	AS
296
		pkgId		NUMBER;
297
		issCnt		NUMBER := 0;
298
		pkgCheck	NUMBER := 0;
299
		depCheck	NUMBER := 0;
300
 
301
		dpkgName	VARCHAR(50);
302
		dpkgVersion	VARCHAR(50);
303
 
304
		CURSOR dep_packs_cur IS
305
			SELECT
306
				DPV_ID
307
			FROM
308
				PACKAGE_DEPENDENCIES
309
			WHERE
310
				PV_ID = pvID;
311
 
312
	BEGIN
313
 
314
		-- check to see if the package has been processed previously
315
		SELECT
316
			COUNT(*)
317
		INTO
318
			pkgCheck
319
		FROM
320
			RM_PKG_ISSUES /*RM_PACKAGE_ISSUES replaced by RM_PKG_ISSUES*/
321
		WHERE
322
			DPV_ID = pvID;
323
 
324
		dbms_output.put_line('pkgCheck: ' || pkgCheck );
325
 
326
		-- Package not already processed (no cyclic dependency) - process it
327
		IF ( pkgCheck = 0 ) THEN
328
 
329
			-- check to see if this package version has any issues assigned to it
330
			SELECT
331
				COUNT(*)
332
			INTO
333
				issCnt
334
			FROM
335
				CQ_ISSUES i
336
			WHERE
337
				i.PV_ID = pvID;
338
 
339
			dbms_output.put_line('issCnt: ' || issCnt );
340
 
341
			-- Always enter a marker row into the table even if there are no issues for the package.
342
			-- This allows us to pick up any cyclic dependencies.
343
			IF ( issCnt > 0 ) THEN
344
				-- get issues and insert into RM_PACKAGE_ISSUES
345
				/*RM_PACKAGE_ISSUES replaced by RM_PKG_ISSUES*/
346
 
347
				INSERT INTO RM_PKG_ISSUES ( PKG_ID, PKG_NAME, PV_ID, PKG_VERSION, DPV_ID, DPKG_NAME, DPKG_VERSION, ISS_DB, ISS_ID )
348
					SELECT DISTINCT
349
						top_pkgID		AS PKG_ID,
350
						top_pkgName		AS PKG_NAME,
351
						top_pvID		AS PV_ID,
352
						top_pkgVer		AS PKG_VERSION,
353
						pv.PV_ID		AS DPV_ID,
354
						p.PKG_NAME		AS DPKG_NAME,
355
						pv.PKG_VERSION	AS DPKG_VERSION,
356
						ci.ISS_DB,
357
						ci.ISS_ID
358
					FROM
359
						PACKAGE_VERSIONS pv
360
							JOIN PACKAGES p ON pv.PKG_ID = p.PKG_ID
361
							JOIN CQ_ISSUES ci ON pv.PV_ID = ci.PV_ID
362
					WHERE
363
						pv.PV_ID = pvID;
364
 
365
			ELSE
366
				-- get the dpkg details - there will always be a row returned here
367
				SELECT
368
					p.PKG_NAME
369
				INTO
370
					dpkgName
371
				FROM
372
					PACKAGE_VERSIONS pv
373
						JOIN PACKAGES p ON pv.PKG_ID = p.PKG_ID
374
				WHERE
375
	   				 pv.PV_ID = pvID;
376
 
377
				SELECT
378
					pv.PKG_VERSION
379
				INTO
380
					dpkgVersion
381
				FROM
382
					PACKAGE_VERSIONS pv
383
				WHERE
384
	   				 pv.PV_ID = pvID;
385
 
386
				-- enter a marker row
387
				/*RM_PACKAGE_ISSUES replaced by RM_PKG_ISSUES*/
388
				INSERT INTO RM_PKG_ISSUES ( PKG_ID, PKG_NAME, PV_ID, PKG_VERSION, DPV_ID, DPKG_NAME, DPKG_VERSION, ISS_DB, ISS_ID )
389
				VALUES (
390
					top_pkgID,
391
					top_pkgName,
392
					top_pvID,
393
					top_pkgVer,
394
					pvID,
395
					dpkgName,
396
					dpkgVersion,
397
					NULL,
398
					NULL );
399
 
400
			END IF;
401
 
402
			-- If this package version has dependencies then recurse
403
			SELECT
404
				COUNT(*)
405
			INTO
406
				depCheck
407
			FROM
408
				PACKAGE_DEPENDENCIES
409
			WHERE
410
				PV_ID = pvID;
411
 
412
			IF ( depCheck > 0 ) THEN
413
				-- get dependencies and call this function recursively for each one
414
				FOR dep_rec IN  dep_packs_cur
415
				LOOP
416
					InsertIssuesForDepends( dep_rec.DPV_ID, top_pkgID, top_pkgName, top_pvID, top_pkgVer );
417
				END LOOP;
418
 
419
			END IF;
420
 
421
		END IF;
422
 
423
	/*EXCEPTION
424
		WHEN OTHERS THEN
425
			no exception handling required
426
	*/
427
	END;
428
 
429
END Rm_Issues;
430
/
431
ALTER PACKAGE "RELEASE_MANAGER"."RM_ISSUES" 
432
  COMPILE BODY 
433
    PLSQL_OPTIMIZE_LEVEL=  2
434
    PLSQL_CODE_TYPE=  INTERPRETED
435
    PLSQL_DEBUG=  FALSE
436
 REUSE SETTINGS TIMESTAMP '2008-05-26 11:58:46'
437
/