DBA Data[Home] [Help]

PACKAGE BODY: APPS.CZ_PB_SYNC_UTIL

Source


1 PACKAGE BODY cz_pb_sync_util AS
2 /*	$Header: czcloutb.pls 120.4.12010000.2 2009/07/27 17:24:37 lamrute ship $	*/
3 
4 
5 -----variable declarations
6 TYPE ref_cursor IS REF CURSOR;
7 
8 -------------------------------------------------
9 ---function that returns the run id
10 FUNCTION get_run_id
11 RETURN NUMBER
12 IS
13 
14 v_run_id NUMBER := 0;
15 
16 BEGIN
17 	SELECT cz_xfr_run_infos_s.NEXTVAL
18 	INTO   v_run_id
19 	FROM DUAL;
20 	RETURN v_run_id;
21 EXCEPTION
22 WHEN OTHERS THEN
23 	RETURN v_run_id;
24 END;
25 
26 ---------------------------------------------------
27 --------------------procedure to log errors during the sync process
28 PROCEDURE log_pb_sync_errors(p_msg_tbl IN message_list,p_run_id  IN  NUMBER)
29 AS
30 
31 v_message	VARCHAR2(2000) := NULL;
32 
33 BEGIN
34 	IF (p_msg_tbl.COUNT > 0) THEN
35 		FOR I IN p_msg_tbl.FIRST..p_msg_tbl.LAST
36 		LOOP
37     cz_utils.log_report(p_msg_tbl(i).called_proc, null, p_msg_tbl(i).sql_code,
38            p_msg_tbl(i).msg_text, fnd_log.LEVEL_ERROR);
39 		END LOOP;
40                --fix 8607367 Implementor of cz_utils.log_report need to commit
41                COMMIT;
42 	END IF;
43 EXCEPTION
44 WHEN OTHERS THEN
45 	RAISE;
46 END log_pb_sync_errors;
47 
48 ---------------------------------------------------
49 ------function that retrieves the db link name from cz_servers
50 FUNCTION retrieve_link_name(p_tgt_server_id cz_servers.server_local_id%TYPE)
51 RETURN VARCHAR2
52 IS
53 
54 v_db_link_name cz_servers.fndnam_link_name%TYPE := NULL;
55 
56 BEGIN
57 	IF (p_tgt_server_id IS NOT NULL) THEN
58 		SELECT fndnam_link_name
59 		INTO   v_db_link_name
60 		FROM   cz_servers
61 		WHERE  cz_servers.server_local_id = p_tgt_server_id;
62 		v_db_link_name := '@'||v_db_link_name;
63 	END IF;
64 	RETURN v_db_link_name;
65 EXCEPTION
66 WHEN NO_DATA_FOUND THEN
67 	RETURN v_db_link_name;
68 END retrieve_link_name;
69 
70 ---------------------------------------------------------
71 ----procedure that retrieves the target server id from cz_servers
72 FUNCTION get_target_instance_id(p_target_instance IN VARCHAR2)
73 RETURN NUMBER
74 IS
75 
76 v_tgt_server_id cz_servers.server_local_id%TYPE;
77 
78 BEGIN
79 	v_tgt_server_id := 0;
80 	SELECT server_local_id
81 	INTO   v_tgt_server_id
82 	FROM   cz_servers
83 	WHERE  UPPER(cz_servers.local_name) = UPPER(LTRIM(RTRIM(p_target_instance)));
84 	RETURN v_tgt_server_id ;
85 EXCEPTION
86 WHEN NO_DATA_FOUND THEN
87 	RETURN v_tgt_server_id ;
88 WHEN OTHERS THEN
89 	RETURN v_tgt_server_id ;
90 END get_target_instance_id;
91 
92 ------------------------------------------------------------
93 -----function that checks if the database lnk is active
94 FUNCTION check_db_link(p_db_link_name IN cz_servers.fndnam_link_name%TYPE)
95 RETURN BOOLEAN
96 IS
97 
98 gl_ref_cursor	REF_CURSOR;
99 l_active_count	NUMBER := 0;
100 v_err_message 	VARCHAR2(2000);
101 
102 BEGIN
103 	IF ( (p_db_link_name IS NULL) OR (p_db_link_name = '@') ) THEN
104 		v_err_message := CZ_UTILS.GET_TEXT('CZ_PB_SYNC_LINK_NAME_IS_NULL');
105 		RETURN FALSE;
106 	ELSE
107 		----check if the link is up and active
108 		OPEN gl_ref_cursor FOR 'SELECT COUNT(*) FROM cz_db_settings'||p_db_link_name ;
109 		LOOP
110 			FETCH gl_ref_cursor INTO l_active_count;
111 			EXIT WHEN gl_ref_cursor%NOTFOUND;
112 		END LOOP;
113 		CLOSE gl_ref_cursor;
114 
115 		IF (l_active_count = 0) THEN
116 			v_err_message := CZ_UTILS.GET_TEXT('CZ_PB_SYNC_LINK_NOT_ACTIVE');
117 			RETURN FALSE;
118 		END IF;
119 	 END IF;
120 	 RETURN TRUE;
121 EXCEPTION
122 WHEN OTHERS THEN
123 	RETURN FALSE;
124 END check_db_link;
125 
126 -------------------------------------------------------------
127 ------function that validates the schema versions on the source
128 ------and the cloned instances
129 ------
130 FUNCTION validate_schema(target_server_id cz_servers.server_local_id%TYPE)
131 RETURN BOOLEAN
132 IS
133 
134 v_source_major_version cz_db_settings.value%TYPE;
135 v_source_minor_version cz_db_settings.value%TYPE;
136 v_target_major_version cz_db_settings.value%TYPE;
137 v_target_minor_version cz_db_settings.value%TYPE;
138 db_schema_compare_cur  ref_cursor ;
139 v_db_link		     cz_servers.fndnam_link_name%TYPE;
140 v_validate_schema_flg  BOOLEAN := TRUE;
141 v_count		     PLS_INTEGER := 0;
142 
143 BEGIN
144 	v_db_link	:= retrieve_link_name(target_server_id);
145 
146 	IF ( NOT cz_pb_sync_util.check_db_link(v_db_link) ) THEN
147 		RETURN FALSE;
148 	END IF;
149 
150 	IF LTRIM(RTRIM(v_db_link)) = '@' THEN
151 		v_validate_schema_flg := FALSE;
152 	ELSE
153 		OPEN	db_schema_compare_cur FOR '	select count(*)
154 							from	cz_db_settings,
155 								cz_db_settings'||v_db_link||' tgt
156 							where	cz_db_settings.setting_id = tgt.setting_id
157 							and	cz_db_settings.value = tgt.value
158 							and	cz_db_settings.setting_id = ''MAJOR_VERSION''
159 							INTERSECT
160 							select count(*)
161 							from	cz_db_settings,
162 								cz_db_settings'||v_db_link||' tgt
163 							where	cz_db_settings.setting_id = tgt.setting_id
164 							and	cz_db_settings.value = tgt.value
165 							and	cz_db_settings.setting_id = ''MINOR_VERSION'' ';
166 		LOOP
167 			FETCH db_schema_compare_cur INTO v_count;
168 			EXIT WHEN db_schema_compare_cur%NOTFOUND;
169 		END LOOP;
170 		CLOSE db_schema_compare_cur;
171 
172 		IF (v_count <> 1) THEN
173 			v_validate_schema_flg := FALSE;
174 		END IF;
175  	END IF;
176  	RETURN v_validate_schema_flg ;
177 
178 EXCEPTION
179 WHEN OTHERS THEN
180     RETURN FALSE;
181 END validate_schema;
182 -------------------------------------------------------
183 ----procedure to register application
184 PROCEDURE set_dbms_info(p_module_name IN VARCHAR2)
185 IS
186 
187 BEGIN
188 	dbms_application_info.set_module(p_module_name,'');
189 END;
190 
191 PROCEDURE reset_dbms_info
192 IS
193 
194 BEGIN
195 	dbms_application_info.set_module('','');
196 END;
197 
198 ------------------------------------------------------
199 -- Verifies if there is another sync or a publishing session running
200 FUNCTION check_process RETURN VARCHAR2
201 IS
202   l_module_name v$session.module%TYPE;
203 BEGIN
204   SELECT module INTO l_module_name
205   FROM   v$session
206   WHERE  module IN ('CZ_PB_SYNC', 'CZ_PB_MGR');
207   RETURN l_module_name;
208 EXCEPTION
209   WHEN NO_DATA_FOUND THEN
210     RETURN NULL;
211 END check_process;
212 
213 -----------------------------------------------------
214 ------------------------------------------------------
215 ----procedure used by publishing to check if the target server is
216 ----actually a target and not a source.
217 ----if target then a value of 0 is returned
218 PROCEDURE verify_tgt_server(p_link_name IN cz_servers.fndnam_link_name%TYPE,
219 				    x_status OUT NOCOPY VARCHAR2,
220 				    x_msg    OUT NOCOPY VARCHAR2)
221 IS
222 
223 l_instance_name 		cz_servers.instance_name%TYPE;
224 l_hostname			cz_servers.hostname%TYPE;
225 l_listener_port 		cz_servers.db_listener_port%TYPE;
226 l_source_server_flag	cz_servers.source_server_flag%TYPE;
227 l_tgt_instance_name 	cz_servers.instance_name%TYPE;
228 gl_ref_cursor	      REF_CURSOR;
229 seq_ref_cursor          REF_CURSOR;
230 l_server_local_id		cz_servers.server_local_id%TYPE;
231 
232 l_msg				VARCHAR2(2000);
233 
234 BEGIN
235 	x_status := '0';
236 
237 	SELECT instance_name,hostname,db_listener_port
238 	INTO   l_instance_name,l_hostname,l_listener_port
239 	FROM   cz_servers
240 	WHERE  UPPER(cz_servers.local_name) = 'LOCAL';
241 
242 	OPEN gl_ref_cursor FOR 'SELECT instance_name, source_server_flag
243 				   	FROM   cz_servers'||p_link_name||'  t
244 				   	WHERE  UPPER(t.local_name) = UPPER('''||l_instance_name||''')';
245 	LOOP
246 		FETCH gl_ref_cursor INTO l_tgt_instance_name, l_source_server_flag;
247 		EXIT WHEN gl_ref_cursor%NOTFOUND;
248 	END LOOP;
249 	CLOSE gl_ref_cursor ;
250 
251 	IF (l_tgt_instance_name IS NOT NULL) THEN
252 		IF (l_source_server_flag IS NULL) THEN
253 			x_status := '1';
254 			x_msg    := CZ_UTILS.GET_TEXT('CZ_PB_MGR_NOT_PRD_INSTANCE');
255 
256 		ELSIF (  (l_source_server_flag IS NOT NULL)
257 			 AND (l_source_server_flag <> '1') ) THEN
258 			x_status := '1';
259 			x_msg    := CZ_UTILS.GET_TEXT('CZ_PB_MGR_NOT_PRD_INSTANCE');
260 		END IF;
261 	ELSE
262 		l_msg := 'SELECT cz_servers_s.nextval from dual'||p_link_name;
263 		OPEN seq_ref_cursor FOR 'SELECT cz_servers_s.nextval from dual'||p_link_name;
264 		LOOP
265 			EXIT WHEN seq_ref_cursor%NOTFOUND;
266 			FETCH seq_ref_cursor INTO l_server_local_id;
267 		END LOOP;
268 		CLOSE seq_ref_cursor;
269 
270 		l_msg := 	'INSERT INTO cz_servers'||p_link_name||'
271 			 (server_local_id,local_name,hostname,db_listener_port,instance_name,import_enabled,source_server_flag)
272 		 SELECT '||l_server_local_id||',local_name,hostname,db_listener_port,instance_name,import_enabled,''1''
273 		 FROM   cz_servers where UPPER(cz_servers.local_name) = ''LOCAL'' ';
274 
275 		EXECUTE IMMEDIATE
276 		'INSERT INTO cz_servers'||p_link_name||
277 		'	 (server_local_id,local_name,hostname,db_listener_port,instance_name,import_enabled,source_server_flag) ' ||
278 		' SELECT '||l_server_local_id||',instance_name,hostname,db_listener_port,instance_name,import_enabled,''1'' ' ||
279 		' FROM   cz_servers where UPPER(cz_servers.local_name) = ''LOCAL'' ';
280 		 COMMIT;
281 		x_status := '0';
282 	END IF;
283 EXCEPTION
284 WHEN NO_DATA_FOUND THEN
285 	IF (gl_ref_cursor%ISOPEN) THEN
286 		CLOSE gl_ref_cursor;
287 	END IF;
288 	IF (seq_ref_cursor%ISOPEN) THEN
289 		CLOSE seq_ref_cursor;
290 	END IF;
291 	x_msg    := CZ_UTILS.GET_TEXT('CZ_PB_SYNC_INSTANCE_IS_NULL','TGTINSTANCE','LOCAL');
292 	x_status := '1';
293 WHEN OTHERS THEN
294 	IF (gl_ref_cursor%ISOPEN) THEN
295 		CLOSE gl_ref_cursor;
296 	END IF;
297 	IF (seq_ref_cursor%ISOPEN) THEN
298 		CLOSE seq_ref_cursor;
299 	END IF;
300 	x_msg    := SQLERRM;
301 	x_status := '1';
302 END verify_tgt_server;
303 ----------------------------------------------------------------
304 ----procedure used by migration to check if the target server is
305 ----a Development instance and models can indeed migrate
306 -----------------------------------------------------------------
307 PROCEDURE verify_mig_tgt_server(p_link_name IN cz_servers.fndnam_link_name%TYPE,
308 				    x_status OUT NOCOPY VARCHAR2,
309 				    x_msg    OUT NOCOPY VARCHAR2)
310 IS
311 
312 l_converted_target  VARCHAR2(1);
313 l_msg				VARCHAR2(2000);
314 p_link_name_trim cz_servers.fndnam_link_name%TYPE;
315 
316 BEGIN
317 
318     --the local name is being passed as null because this is a migration
319     --call and it really does not matter.  The local parameter is
320     --only passed to check local publication.
321 
322     p_link_name_trim := REPLACE(p_link_name, '@', '');
323     l_converted_target := CZ_MODEL_MIGRATION_PVT.target_open_for ('M', p_link_name_trim, '');
324     IF (l_converted_target = '1') THEN
325         x_status :='0';
326     ELSE
327         x_status :='1';
328         x_msg    := CZ_UTILS.GET_TEXT('CZ_CANNOT_MIGRATE');
329     END IF;
330 EXCEPTION
331 WHEN OTHERS THEN
332 	x_msg    := SQLERRM;
333 	x_status := '0';
334 END verify_mig_tgt_server;
335 
336 -------------------------------------------------------
337 
338 END cz_pb_sync_util;