Skip to content

Commit 7a9bb20

Browse files
committed
- Added support for DATE types.
- Added support for JSONP.
1 parent 00f6b6c commit 7a9bb20

17 files changed

+237
-88
lines changed

CHANGELOG

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
v0.1.0:
2+
date: 2014-04-26
3+
changes:
4+
- Added support for DATE types.
5+
- Added support for JSONP.
6+
17
v0.0.1:
28
date: 2013-09-24
39
changes:

json_array.tpb

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,16 @@ BEGIN
5858
aNodeID := json_utils.addNode(theNodes=>SELF.nodes, theLastID=>SELF.lastID, theNode=>json_node(NULL, theValue));
5959
END append;
6060

61+
----------------------------------------------------------
62+
-- append
63+
--
64+
MEMBER PROCEDURE append(SELF IN OUT NOCOPY json_array, theValue IN DATE)
65+
IS
66+
aNodeID BINARY_INTEGER;
67+
BEGIN
68+
aNodeID := json_utils.addNode(theNodes=>SELF.nodes, theLastID=>SELF.lastID, theNode=>json_node(NULL, theValue));
69+
END append;
70+
6171
----------------------------------------------------------
6272
-- append
6373
--
@@ -76,7 +86,7 @@ IS
7686
aNodeID BINARY_INTEGER;
7787
BEGIN
7888
-- add a new object node that will be used as the root for all the sub notes
79-
aNodeID := json_utils.addNode(theNodes=>SELF.nodes, theLastID=>SELF.lastID, theNode=>json_node('O', NULL, NULL, NULL, NULL, NULL, NULL));
89+
aNodeID := json_utils.addNode(theNodes=>SELF.nodes, theLastID=>SELF.lastID, theNode=>json_node('O', NULL, NULL, NULL, NULL, NULL, NULL, NULL));
8090

8191
-- copy the sub-nodes
8292
json_utils.copyNodes(theTargetNodes=>SELF.nodes, theTargetNodeID=>aNodeID, theLastID=>SELF.lastID, theName=>NULL, theSourceNodes=>theValue.nodes);
@@ -90,7 +100,7 @@ IS
90100
aNodeID BINARY_INTEGER;
91101
BEGIN
92102
-- add a new array node that will be used as the root for all the sub notes
93-
aNodeID := json_utils.addNode(theNodes=>SELF.nodes, theLastID=>SELF.lastID, theNode=>json_node('A', NULL, NULL, NULL, NULL, NULL, NULL));
103+
aNodeID := json_utils.addNode(theNodes=>SELF.nodes, theLastID=>SELF.lastID, theNode=>json_node('A', NULL, NULL, NULL, NULL, NULL, NULL, NULL));
94104

95105
-- copy the sub-nodes
96106
json_utils.copyNodes(theTargetNodes=>SELF.nodes, theTargetNodeID=>aNodeID, theLastID=>SELF.lastID, theName=>NULL, theSourceNodes=>theValue.nodes);
@@ -154,13 +164,13 @@ END to_clob;
154164
----------------------------------------------------------
155165
-- htp
156166
--
157-
MEMBER PROCEDURE htp(SELF IN json_array)
167+
MEMBER PROCEDURE htp(SELF IN json_array, theJSONP IN VARCHAR2 DEFAULT NULL)
158168
IS
159169
aLob CLOB := empty_clob();
160170
BEGIN
161171
dbms_lob.createtemporary(aLob, TRUE);
162172
self.to_clob(aLob);
163-
json_utils.htp_output_clob(aLob);
173+
json_utils.htp_output_clob(aLob, theJSONP);
164174
dbms_lob.freetemporary(aLob);
165175
END htp;
166176

json_array.tps

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ TYPE json_array IS OBJECT
1212
MEMBER PROCEDURE append(self IN OUT NOCOPY json_array),
1313
MEMBER PROCEDURE append(self IN OUT NOCOPY json_array, theValue IN VARCHAR2),
1414
MEMBER PROCEDURE append(self IN OUT NOCOPY json_array, theValue IN NUMBER),
15+
MEMBER PROCEDURE append(self IN OUT NOCOPY json_array, theValue IN DATE),
1516
MEMBER PROCEDURE append(self IN OUT NOCOPY json_array, theValue IN BOOLEAN),
1617
MEMBER PROCEDURE append(self IN OUT NOCOPY json_array, theValue IN json_object),
1718
MEMBER PROCEDURE append(self IN OUT NOCOPY json_array, theValue IN json_array),
@@ -26,6 +27,6 @@ TYPE json_array IS OBJECT
2627

2728
-- Output methods
2829
MEMBER PROCEDURE to_clob(SELF IN json_array, theLobBuf IN OUT NOCOPY CLOB, theEraseLob BOOLEAN DEFAULT TRUE),
29-
MEMBER PROCEDURE htp(SELF IN json_array)
30+
MEMBER PROCEDURE htp(SELF IN json_array, theJSONP IN VARCHAR2 DEFAULT NULL)
3031
);
3132
/

json_debug.pkb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,11 @@ BEGIN
247247
IF (theNodes(theNodeID).num IS NOT NULL) THEN
248248
r.nodeValue := TO_CHAR(theNodes(theNodeID).num);
249249
END IF;
250+
WHEN 'D' THEN
251+
r.nodeType := 'DATE';
252+
IF (theNodes(theNodeID).dat IS NOT NULL) THEN
253+
r.nodeValue := TO_CHAR(theNodes(theNodeID).dat, 'YYYYMMDD HH24MISS');
254+
END IF;
250255
WHEN 'B' THEN
251256
r.nodeType := 'BOOL';
252257
IF (theNodes(theNodeID).num IS NOT NULL) THEN

json_node.tpb

Lines changed: 43 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ BEGIN
1212
SELF.nam := NULL;
1313
SELF.str := NULL;
1414
SELF.num := NULL;
15+
SELF.dat := NULL;
1516
SELF.par := NULL;
1617
SELF.nex := NULL;
1718
SELF.sub := NULL;
@@ -24,13 +25,14 @@ END json_node;
2425
CONSTRUCTOR FUNCTION json_node(SELF IN OUT NOCOPY json_node, theName IN VARCHAR2) RETURN SELF AS RESULT
2526
IS
2627
BEGIN
27-
SELF.typ := '0';
28-
SELF.nam := theName;
29-
SELF.str := NULL;
30-
SELF.num := NULL;
31-
SELF.par := NULL;
32-
SELF.nex := NULL;
33-
SELF.sub := NULL;
28+
SELF.typ := '0';
29+
SELF.nam := theName;
30+
SELF.str := NULL;
31+
SELF.num := NULL;
32+
SELF.dat := NULL;
33+
SELF.par := NULL;
34+
SELF.nex := NULL;
35+
SELF.sub := NULL;
3436
RETURN;
3537
END json_node;
3638

@@ -40,13 +42,14 @@ END json_node;
4042
CONSTRUCTOR FUNCTION json_node(SELF IN OUT NOCOPY json_node, theName IN VARCHAR2, theValue IN VARCHAR2) RETURN SELF AS RESULT
4143
IS
4244
BEGIN
43-
SELF.typ := 'S';
44-
SELF.nam := theName;
45-
SELF.str := theValue;
46-
SELF.num := NULL;
47-
SELF.par := NULL;
48-
SELF.nex := NULL;
49-
SELF.sub := NULL;
45+
SELF.typ := 'S';
46+
SELF.nam := theName;
47+
SELF.str := theValue;
48+
SELF.num := NULL;
49+
SELF.dat := NULL;
50+
SELF.par := NULL;
51+
SELF.nex := NULL;
52+
SELF.sub := NULL;
5053
RETURN;
5154
END json_node;
5255

@@ -56,13 +59,31 @@ END json_node;
5659
CONSTRUCTOR FUNCTION json_node(SELF IN OUT NOCOPY json_node, theName IN VARCHAR2, theValue IN NUMBER) RETURN SELF AS RESULT
5760
IS
5861
BEGIN
59-
SELF.typ := CASE WHEN theValue IS NOT NULL THEN 'N' ELSE '0' END;
60-
SELF.nam := theName;
61-
SELF.str := NULL;
62-
SELF.num := theValue;
63-
SELF.par := NULL;
64-
SELF.nex := NULL;
65-
SELF.sub := NULL;
62+
SELF.typ := CASE WHEN theValue IS NOT NULL THEN 'N' ELSE '0' END;
63+
SELF.nam := theName;
64+
SELF.str := NULL;
65+
SELF.num := theValue;
66+
SELF.dat := NULL;
67+
SELF.par := NULL;
68+
SELF.nex := NULL;
69+
SELF.sub := NULL;
70+
RETURN;
71+
END json_node;
72+
73+
----------------------------------------------------------
74+
-- json_node
75+
--
76+
CONSTRUCTOR FUNCTION json_node(SELF IN OUT NOCOPY json_node, theName IN VARCHAR2, theValue IN DATE) RETURN SELF AS RESULT
77+
IS
78+
BEGIN
79+
SELF.typ := CASE WHEN theValue IS NOT NULL THEN 'D' ELSE '0' END;
80+
SELF.nam := theName;
81+
SELF.str := NULL;
82+
SELF.num := NULL;
83+
SELF.dat := theValue;
84+
SELF.par := NULL;
85+
SELF.nex := NULL;
86+
SELF.sub := NULL;
6687
RETURN;
6788
END json_node;
6889

@@ -80,6 +101,7 @@ BEGIN
80101
ELSE
81102
SELF.num := NULL;
82103
END IF;
104+
SELF.dat := NULL;
83105
SELF.par := NULL;
84106
SELF.nex := NULL;
85107
SELF.sub := NULL;

json_node.tps

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ TYPE json_node IS OBJECT
55
nam VARCHAR2(32767), -- property name (only in an object and NULL in an array)
66
str VARCHAR2(32767), -- property value for string
77
num NUMBER, -- property value for number and boolean where boolean is stored as 0 for FALSE and 1 for TRUE
8+
dat DATE, -- property value for date
89
par NUMBER, -- id of the parent node or NULL if this is the root node
910
nex NUMBER, -- id of the next node or NULL if this is the last node in this object
1011
sub NUMBER, -- id of the json_node when type is an object or an array
@@ -16,6 +17,7 @@ TYPE json_node IS OBJECT
1617
CONSTRUCTOR FUNCTION json_node(SELF IN OUT NOCOPY json_node, theName IN VARCHAR2) RETURN SELF AS RESULT,
1718
CONSTRUCTOR FUNCTION json_node(SELF IN OUT NOCOPY json_node, theName IN VARCHAR2, theValue IN VARCHAR2) RETURN SELF AS RESULT,
1819
CONSTRUCTOR FUNCTION json_node(SELF IN OUT NOCOPY json_node, theName IN VARCHAR2, theValue IN NUMBER) RETURN SELF AS RESULT,
20+
CONSTRUCTOR FUNCTION json_node(SELF IN OUT NOCOPY json_node, theName IN VARCHAR2, theValue IN DATE) RETURN SELF AS RESULT,
1921
CONSTRUCTOR FUNCTION json_node(SELF IN OUT NOCOPY json_node, theName IN VARCHAR2, theValue IN BOOLEAN) RETURN SELF AS RESULT
2022
);
2123
/

json_object.tpb

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,16 @@ BEGIN
6969
aNodeID := json_utils.addNode(theNodes=>SELF.nodes, theLastID=>SELF.lastID, theNode=>json_node(theName, theValue));
7070
END put;
7171

72+
----------------------------------------------------------
73+
-- put
74+
--
75+
MEMBER PROCEDURE put(SELF IN OUT NOCOPY json_object, theName IN VARCHAR2, theValue IN DATE)
76+
IS
77+
aNodeID BINARY_INTEGER;
78+
BEGIN
79+
aNodeID := json_utils.addNode(theNodes=>SELF.nodes, theLastID=>SELF.lastID, theNode=>json_node(theName, theValue));
80+
END put;
81+
7282
----------------------------------------------------------
7383
-- put
7484
--
@@ -87,7 +97,7 @@ IS
8797
aNodeID BINARY_INTEGER;
8898
BEGIN
8999
-- add a new object node that will be used as the root for all the sub notes
90-
aNodeID := json_utils.addNode(theNodes=>SELF.nodes, theLastID=>SELF.lastID, theNode=>json_node('O', theName, NULL, NULL, NULL, NULL, NULL));
100+
aNodeID := json_utils.addNode(theNodes=>SELF.nodes, theLastID=>SELF.lastID, theNode=>json_node('O', theName, NULL, NULL, NULL, NULL, NULL, NULL));
91101

92102
-- copy the sub-nodes
93103
json_utils.copyNodes(theTargetNodes=>SELF.nodes, theTargetNodeID=>aNodeID, theLastID=>SELF.lastID, theName=>theName, theSourceNodes=>theValue.nodes);
@@ -101,7 +111,7 @@ IS
101111
aNodeID BINARY_INTEGER;
102112
BEGIN
103113
-- add a new object node that will be used as the root for all the sub notes
104-
aNodeID := json_utils.addNode(theNodes=>SELF.nodes, theLastID=>SELF.lastID, theNode=>json_node(theValue.typ, theName, NULL, NULL, NULL, NULL, NULL));
114+
aNodeID := json_utils.addNode(theNodes=>SELF.nodes, theLastID=>SELF.lastID, theNode=>json_node(theValue.typ, theName, NULL, NULL, NULL, NULL, NULL, NULL));
105115

106116
-- copy the sub-nodes
107117
json_utils.copyNodes(theTargetNodes=>SELF.nodes, theTargetNodeID=>aNodeID, theLastID=>SELF.lastID, theName=>theName, theSourceNodes=>theValue.nodes);
@@ -179,13 +189,13 @@ END to_clob;
179189
----------------------------------------------------------
180190
-- htp
181191
--
182-
MEMBER PROCEDURE htp(SELF IN json_object)
192+
MEMBER PROCEDURE htp(SELF IN json_object, theJSONP IN VARCHAR2 DEFAULT NULL)
183193
IS
184194
aLob CLOB := empty_clob();
185195
BEGIN
186196
dbms_lob.createtemporary(aLob, TRUE);
187197
SELF.to_clob(aLob);
188-
json_utils.htp_output_clob(aLob);
198+
json_utils.htp_output_clob(aLob, theJSONP);
189199
dbms_lob.freetemporary(aLob);
190200
END htp;
191201

json_object.tps

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
CREATE OR REPLACE
22
TYPE json_object IS OBJECT
33

4-
-- $Id$
4+
-- $Id: json_object.tps 42847 2014-04-06 17:38:58Z doberkofler $
55

66
------------
77
-- OVERVIEW
@@ -36,6 +36,7 @@ TYPE json_object IS OBJECT
3636
-- aPersonObj.put('id', i);
3737
-- aPersonObj.put('name', aNameObj);
3838
-- aPersonObj.put('income', 4800 + i * 100);
39+
-- aPersonObj.put('birthday', SYSDATE);
3940
-- aPersonObj.put('male', TRUE);
4041
-- aPersonObj.put('voice', aEmailArray.to_json_value());
4142
--
@@ -83,6 +84,7 @@ TYPE json_object IS OBJECT
8384
MEMBER PROCEDURE put(SELF IN OUT NOCOPY json_object, theName IN VARCHAR2),
8485
MEMBER PROCEDURE put(SELF IN OUT NOCOPY json_object, theName IN VARCHAR2, theValue IN VARCHAR2),
8586
MEMBER PROCEDURE put(SELF IN OUT NOCOPY json_object, theName IN VARCHAR2, theValue IN NUMBER),
87+
MEMBER PROCEDURE put(SELF IN OUT NOCOPY json_object, theName IN VARCHAR2, theValue IN DATE),
8688
MEMBER PROCEDURE put(SELF IN OUT NOCOPY json_object, theName IN VARCHAR2, theValue IN BOOLEAN),
8789
MEMBER PROCEDURE put(SELF IN OUT NOCOPY json_object, theName IN VARCHAR2, theValue IN json_object),
8890
MEMBER PROCEDURE put(SELF IN OUT NOCOPY json_object, theName IN VARCHAR2, theValue IN json_value),
@@ -98,6 +100,6 @@ TYPE json_object IS OBJECT
98100

99101
-- Output methods
100102
MEMBER PROCEDURE to_clob(SELF IN json_object, theLobBuf IN OUT NOCOPY CLOB, theEraseLob BOOLEAN DEFAULT TRUE),
101-
MEMBER PROCEDURE htp(SELF IN json_object)
103+
MEMBER PROCEDURE htp(SELF IN json_object, theJSONP IN VARCHAR2 DEFAULT NULL)
102104
);
103105
/

json_parser.pkb

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,20 @@ PACKAGE BODY json_parser IS
55
-- PRIVATE EXCEPTIONS
66
----------------------------------------------------------
77

8-
98
----------------------------------------------------------
109
-- PRIVATE TYPES
1110
----------------------------------------------------------
1211

13-
1412
----------------------------------------------------------
1513
-- PRIVATE CONSTANTS
1614
----------------------------------------------------------
1715

18-
1916
----------------------------------------------------------
2017
-- PRIVATE VARIABLES
2118
----------------------------------------------------------
2219

2320
decimalpoint VARCHAR2(1 CHAR) := '.';
2421

25-
2622
----------------------------------------------------------
2723
-- LOCAL MODULES
2824
----------------------------------------------------------
@@ -36,12 +32,10 @@ FUNCTION lexer(jsrc IN OUT NOCOPY json_src) RETURN lTokens;
3632

3733
PROCEDURE parseMem(tokens lTokens, indx IN OUT PLS_INTEGER, mem_name VARCHAR2, mem_indx NUMBER, theParentID IN OUT BINARY_INTEGER, theLastID IN OUT BINARY_INTEGER, theNodes IN OUT NOCOPY json_nodes);
3834

39-
4035
----------------------------------------------------------
4136
-- GLOBAL MODULES
4237
----------------------------------------------------------
4338

44-
4539
----------------------------------------------------------
4640
-- updateDecimalPoint (private)
4741
--
@@ -1030,6 +1024,5 @@ BEGIN
10301024
RETURN NULL;
10311025
END parse_any;
10321026

1033-
10341027
END json_parser;
10351028
/

json_parser.pks

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,16 @@ PACKAGE json_parser IS
88
--
99
--
1010

11-
1211
-----------
1312
-- EXAMPLE
1413
--
1514
--
1615

17-
1816
-------------
1917
-- RESOURCES
2018
--
2119
--
2220

23-
2421
----------------------------------------------------------
2522
-- GLOBAL PUBLIC TYPES
2623
----------------------------------------------------------
@@ -38,13 +35,10 @@ TYPE rToken IS RECORD
3835
TYPE lTokens IS TABLE OF rToken INDEX BY PLS_INTEGER;
3936
TYPE json_src IS RECORD (len NUMBER, offset NUMBER, src VARCHAR2(32767), s_clob CLOB);
4037

41-
42-
4338
----------------------------------------------------------
4439
-- GLOBAL PUBLIC CONSTANTS
4540
----------------------------------------------------------
4641

47-
4842
---------------------------------------------------------
4943
-- GLOBAL VARIABLES
5044
----------------------------------------------------------
@@ -55,11 +49,9 @@ json_strict BOOLEAN NOT NULL := FALSE;
5549
-- GLOBAL PUBLIC MODULES
5650
----------------------------------------------------------
5751

58-
5952
FUNCTION parser(str CLOB) RETURN json_nodes;
6053
FUNCTION parse_list(str CLOB) RETURN json_nodes;
6154
FUNCTION parse_any(str CLOB) RETURN json_nodes;
6255

63-
6456
END json_parser;
6557
/

0 commit comments

Comments
 (0)