1 PACKAGE BODY ximetadata_pkg AS
2
3 iterate NUMBER := 0; -- counts the calls
4 data CLOB := NULL; -- buffer storage
5 offset NUMBER := 1;
6 done NUMBER := 0;
7
8 FUNCTION getIndexMetadata (idxinfo IN sys.ODCIIndexInfo,
9 expver IN VARCHAR2,
10 newblock OUT number,
11 idxenv IN sys.ODCIEnv) return VARCHAR2 IS
12 current_plsql VARCHAR2(32000);
13 pos NUMBER := 0;
14 BEGIN
15 newblock := 0;
16
17 IF (done = 1) THEN
18 iterate := 0; -- reset
19 done := 0; -- reset
20 offset := 1;
21 RETURN '';
22 END IF;
23
24 IF (sys.dbms_datapump.datapump_job) THEN
25 IF (iterate = 0) THEN -- first call: get data from c callback once
26 data := getIndexMetadataCallback (idxinfo, expver, newblock, idxenv);
27 IF (length(data) <= 30000) THEN
28 done := 1; -- short metadata can be returned in one shot
29 RETURN data;
30 END IF;
31 END IF;
32
33 -- we have long metadata
34 -- find the second occurence of 'insert into XDB.XDB'
35 pos := dbms_lob.instr(data, 'insert into', offset, 2);
36
37 IF (pos = 0) THEN -- not found
38 current_plsql := DBMS_LOB.SUBSTR(data, 30000, offset); -- the rest
39 done := 1;
40 ELSE
41 current_plsql:= DBMS_LOB.SUBSTR(data, pos - offset -1, offset);
42 offset := pos;
43 END IF;
44
45 iterate := iterate + 1;
46 return current_plsql;
47 END IF;
48
49 done := 1;
50 return '';
51 END getIndexMetadata;
52
53
54 function getIndexMetadataCallback (idxinfo IN sys.ODCIIndexInfo,
55 expver IN VARCHAR2,
56 newblock OUT number,
57 idxenv IN sys.ODCIEnv)
58 return CLOB
59 is language C name "QMIX_XMETADATA" library XDB.XMLINDEX_LIB
60 with context
61 parameters (
62 context,
63 idxinfo, idxinfo INDICATOR struct,
64 expver, expver INDICATOR,
65 newblock,newblock INDICATOR,
66 idxenv, idxenv INDICATOR struct,
67 RETURN OCILobLocator);
68
69 FUNCTION utlgettablenames(idxinfo IN sys.ODCIIndexInfo) return BOOLEAN
70 is language C name "QMIX_TABLEUTILS" library XDB.XMLINDEX_LIB
71 with context
72 parameters (
73 context,
74 idxinfo, idxinfo INDICATOR struct,
75 RETURN INDICATOR sb4,
76 return);
77
78 END ximetadata_pkg;