Software /
code /
prosody
Annotate
util/datamapper.lua @ 11571:a8f0f87e115a
prosody: Close the state on exit (ie garbage-collect everything)
This ensures __gc is called on everything that may need it, such as
database connections.
It was reported in the chat by Happy that SQLite3 does not close its
state cleanly in WAL mode, leaving the WAL file behind. This is probably
rather a bug in mod_storage_sql, but forcing a final GC sweep should
also help with such things everywhere.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Tue, 18 May 2021 20:08:37 +0200 |
parent | 11481:b2f9782497dd |
child | 12133:11060c8919b6 |
rev | line source |
---|---|
11435
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1 local st = require("util.stanza"); |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
2 |
11462
d1982b7eb00d
util.datamapper: Fix arrays nesting one level too deep
Kim Alvefur <zash@zash.se>
parents:
11461
diff
changeset
|
3 local schema_t = {} |
d1982b7eb00d
util.datamapper: Fix arrays nesting one level too deep
Kim Alvefur <zash@zash.se>
parents:
11461
diff
changeset
|
4 |
11435
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
5 local function toboolean(s) |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
6 if s == "true" or s == "1" then |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
7 return true |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
8 elseif s == "false" or s == "0" then |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
9 return false |
11455
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
10 elseif s then |
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
11 return true |
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
12 end |
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
13 end |
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
14 |
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
15 local function totype(t, s) |
11479
377a9eaf7bef
util.datamapper: Fix error on attempt to coerce nil to something
Kim Alvefur <zash@zash.se>
parents:
11476
diff
changeset
|
16 if not s then |
377a9eaf7bef
util.datamapper: Fix error on attempt to coerce nil to something
Kim Alvefur <zash@zash.se>
parents:
11476
diff
changeset
|
17 return nil |
377a9eaf7bef
util.datamapper: Fix error on attempt to coerce nil to something
Kim Alvefur <zash@zash.se>
parents:
11476
diff
changeset
|
18 end |
11455
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
19 if t == "string" then |
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
20 return s |
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
21 elseif t == "boolean" then |
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
22 return toboolean(s) |
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
23 elseif t == "number" or t == "integer" then |
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
24 return tonumber(s) |
11435
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
25 end |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
26 end |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
27 |
11454
1d9c1893cc5e
util.datamapper: Use enum instead of mutually exclusive booleans
Kim Alvefur <zash@zash.se>
parents:
11453
diff
changeset
|
28 local value_goes = {} |
1d9c1893cc5e
util.datamapper: Use enum instead of mutually exclusive booleans
Kim Alvefur <zash@zash.se>
parents:
11453
diff
changeset
|
29 |
11456
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
30 local function unpack_propschema(propschema, propname, current_ns) |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
31 |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
32 local proptype = "string" |
11466
c098d07e6717
util.datamapper: Finally implement support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11465
diff
changeset
|
33 local value_where = propname and "in_text_tag" or "in_text" |
11456
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
34 local name = propname |
11476
83e127eb91f9
util.datamapper: Deal with locally built stanzas missing xmlns
Kim Alvefur <zash@zash.se>
parents:
11475
diff
changeset
|
35 local namespace |
11456
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
36 local prefix |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
37 local single_attribute |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
38 local enums |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
39 |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
40 if type(propschema) == "table" then |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
41 proptype = propschema.type |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
42 elseif type(propschema) == "string" then |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
43 proptype = propschema |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
44 end |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
45 |
11457
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
46 if proptype == "object" or proptype == "array" then |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
47 value_where = "in_children" |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
48 end |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
49 |
11456
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
50 if type(propschema) == "table" then |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
51 local xml = propschema.xml |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
52 if xml then |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
53 if xml.name then |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
54 name = xml.name |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
55 end |
11476
83e127eb91f9
util.datamapper: Deal with locally built stanzas missing xmlns
Kim Alvefur <zash@zash.se>
parents:
11475
diff
changeset
|
56 if xml.namespace and xml.namespace ~= current_ns then |
11456
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
57 namespace = xml.namespace |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
58 end |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
59 if xml.prefix then |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
60 prefix = xml.prefix |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
61 end |
11457
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
62 if proptype == "array" and xml.wrapped then |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
63 value_where = "in_wrapper" |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
64 elseif xml.attribute then |
11456
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
65 value_where = "in_attribute" |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
66 elseif xml.text then |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
67 value_where = "in_text" |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
68 elseif xml.x_name_is_value then |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
69 value_where = "in_tag_name" |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
70 elseif xml.x_single_attribute then |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
71 single_attribute = xml.x_single_attribute |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
72 value_where = "in_single_attribute" |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
73 end |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
74 end |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
75 if propschema["const"] then |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
76 enums = {propschema["const"]} |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
77 elseif propschema["enum"] then |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
78 enums = propschema["enum"] |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
79 end |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
80 end |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
81 |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
82 return proptype, value_where, name, namespace, prefix, single_attribute, enums |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
83 end |
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
84 |
11457
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
85 local parse_object |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
86 local parse_array |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
87 |
11465
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
88 local function extract_value(s, value_where, proptype, name, namespace, prefix, single_attribute, enums) |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
89 if value_where == "in_tag_name" then |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
90 local c |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
91 if proptype == "boolean" then |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
92 c = s:get_child(name, namespace); |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
93 elseif enums and proptype == "string" then |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
94 |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
95 for i = 1, #enums do |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
96 c = s:get_child(enums[i], namespace); |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
97 if c then |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
98 break |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
99 end |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
100 end |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
101 else |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
102 c = s:get_child(nil, namespace); |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
103 end |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
104 if c then |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
105 return c.name |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
106 end |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
107 elseif value_where == "in_attribute" then |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
108 local attr = name |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
109 if prefix then |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
110 attr = prefix .. ":" .. name |
11476
83e127eb91f9
util.datamapper: Deal with locally built stanzas missing xmlns
Kim Alvefur <zash@zash.se>
parents:
11475
diff
changeset
|
111 elseif namespace and namespace ~= s.attr.xmlns then |
11465
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
112 attr = namespace .. "\1" .. name |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
113 end |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
114 return s.attr[attr] |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
115 |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
116 elseif value_where == "in_text" then |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
117 return s:get_text() |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
118 |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
119 elseif value_where == "in_single_attribute" then |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
120 local c = s:get_child(name, namespace) |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
121 return c and c.attr[single_attribute] |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
122 elseif value_where == "in_text_tag" then |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
123 return s:get_child_text(name, namespace) |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
124 end |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
125 end |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
126 |
11457
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
127 function parse_object(schema, s) |
11435
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
128 local out = {} |
11461
766b0eddd12c
util.datamapper: Deal with type name changes in util.jsonschema
Kim Alvefur <zash@zash.se>
parents:
11458
diff
changeset
|
129 if type(schema) == "table" and schema.properties then |
11435
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
130 for prop, propschema in pairs(schema.properties) do |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
131 |
11456
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
132 local proptype, value_where, name, namespace, prefix, single_attribute, enums = unpack_propschema(propschema, prop, s.attr.xmlns) |
11435
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
133 |
11465
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
134 if value_where == "in_children" and type(propschema) == "table" then |
11455
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
135 if proptype == "object" then |
11435
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
136 local c = s:get_child(name, namespace) |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
137 if c then |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
138 out[prop] = parse_object(propschema, c); |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
139 end |
11457
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
140 elseif proptype == "array" then |
11481
b2f9782497dd
util.datamapper: Don't include empty unwrapped arrays
Kim Alvefur <zash@zash.se>
parents:
11479
diff
changeset
|
141 local a = parse_array(propschema, s); |
b2f9782497dd
util.datamapper: Don't include empty unwrapped arrays
Kim Alvefur <zash@zash.se>
parents:
11479
diff
changeset
|
142 if a and a[1] ~= nil then |
b2f9782497dd
util.datamapper: Don't include empty unwrapped arrays
Kim Alvefur <zash@zash.se>
parents:
11479
diff
changeset
|
143 out[prop] = a; |
b2f9782497dd
util.datamapper: Don't include empty unwrapped arrays
Kim Alvefur <zash@zash.se>
parents:
11479
diff
changeset
|
144 end |
11457
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
145 else |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
146 error("unreachable") |
11435
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
147 end |
11457
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
148 elseif value_where == "in_wrapper" and type(propschema) == "table" and proptype == "array" then |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
149 local wrapper = s:get_child(name, namespace); |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
150 if wrapper then |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
151 out[prop] = parse_array(propschema, wrapper); |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
152 end |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
153 else |
11465
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
154 local value = extract_value(s, value_where, proptype, name, namespace, prefix, single_attribute, enums) |
19a88b61ab4e
util.datamapper: Factor out extraction of the XML part to use
Kim Alvefur <zash@zash.se>
parents:
11464
diff
changeset
|
155 |
11455
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
156 out[prop] = totype(proptype, value) |
a5050e21ab08
util.datamapper: Separate extraction of xml from coercion to target type
Kim Alvefur <zash@zash.se>
parents:
11454
diff
changeset
|
157 end |
11435
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
158 end |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
159 end |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
160 |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
161 return out |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
162 end |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
163 |
11457
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
164 function parse_array(schema, s) |
11471
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
165 local itemschema = schema.items; |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
166 local proptype, value_where, child_name, namespace, prefix, single_attribute, enums = unpack_propschema(itemschema, nil, s.attr.xmlns) |
11466
c098d07e6717
util.datamapper: Finally implement support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11465
diff
changeset
|
167 local attr_name |
c098d07e6717
util.datamapper: Finally implement support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11465
diff
changeset
|
168 if value_where == "in_single_attribute" then |
c098d07e6717
util.datamapper: Finally implement support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11465
diff
changeset
|
169 value_where = "in_attribute"; |
c098d07e6717
util.datamapper: Finally implement support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11465
diff
changeset
|
170 attr_name = single_attribute; |
c098d07e6717
util.datamapper: Finally implement support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11465
diff
changeset
|
171 end |
11457
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
172 local out = {} |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
173 |
11471
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
174 if proptype == "object" then |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
175 if type(itemschema) == "table" then |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
176 for c in s:childtags(child_name, namespace) do |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
177 table.insert(out, parse_object(itemschema, c)); |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
178 end |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
179 else |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
180 error("array items must be schema object") |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
181 end |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
182 elseif proptype == "array" then |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
183 if type(itemschema) == "table" then |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
184 for c in s:childtags(child_name, namespace) do |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
185 table.insert(out, parse_array(itemschema, c)); |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
186 end |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
187 end |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
188 else |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
189 for c in s:childtags(child_name, namespace) do |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
190 local value = extract_value(c, value_where, proptype, attr_name or child_name, namespace, prefix, single_attribute, enums) |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
191 |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
192 table.insert(out, totype(proptype, value)); |
ab03de8e503e
util.datamapper: Handle nested arrays or objects in arrays
Kim Alvefur <zash@zash.se>
parents:
11470
diff
changeset
|
193 end |
11457
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
194 end |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
195 return out |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
196 end |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
197 |
11435
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
198 local function parse(schema, s) |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
199 if schema.type == "object" then |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
200 return parse_object(schema, s) |
11457
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
201 elseif schema.type == "array" then |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
202 return parse_array(schema, s) |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
203 else |
6a51749af7f4
util.datamapper: Add initial support for parsing arrays
Kim Alvefur <zash@zash.se>
parents:
11456
diff
changeset
|
204 error("top-level scalars unsupported") |
11435
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
205 end |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
206 end |
a1fa6202fa13
util.datamapper: Library for extracting data from stanzas
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
207 |
11475
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
208 local function toxmlstring(proptype, v) |
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
209 if proptype == "string" and type(v) == "string" then |
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
210 return v |
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
211 elseif proptype == "number" and type(v) == "number" then |
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
212 return string.format("%g", v) |
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
213 elseif proptype == "integer" and type(v) == "number" then |
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
214 return string.format("%d", v) |
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
215 elseif proptype == "boolean" then |
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
216 return v and "1" or "0" |
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
217 end |
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
218 end |
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
219 |
11467
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
220 local unparse |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
221 |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
222 local function unparse_property(out, v, proptype, propschema, value_where, name, namespace, current_ns, prefix, single_attribute) |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
223 if value_where == "in_attribute" then |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
224 local attr = name |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
225 if prefix then |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
226 attr = prefix .. ":" .. name |
11476
83e127eb91f9
util.datamapper: Deal with locally built stanzas missing xmlns
Kim Alvefur <zash@zash.se>
parents:
11475
diff
changeset
|
227 elseif namespace and namespace ~= current_ns then |
11467
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
228 attr = namespace .. "\1" .. name |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
229 end |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
230 |
11475
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
231 out.attr[attr] = toxmlstring(proptype, v) |
11467
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
232 elseif value_where == "in_text" then |
11475
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
233 out:text(toxmlstring(proptype, v)) |
11467
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
234 elseif value_where == "in_single_attribute" then |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
235 assert(single_attribute) |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
236 local propattr = {} |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
237 |
11476
83e127eb91f9
util.datamapper: Deal with locally built stanzas missing xmlns
Kim Alvefur <zash@zash.se>
parents:
11475
diff
changeset
|
238 if namespace and namespace ~= current_ns then |
11467
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
239 propattr.xmlns = namespace |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
240 end |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
241 |
11475
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
242 propattr[single_attribute] = toxmlstring(proptype, v) |
11467
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
243 out:tag(name, propattr):up(); |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
244 |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
245 else |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
246 local propattr |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
247 if namespace ~= current_ns then |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
248 propattr = {xmlns = namespace} |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
249 end |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
250 if value_where == "in_tag_name" then |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
251 if proptype == "string" and type(v) == "string" then |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
252 out:tag(v, propattr):up(); |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
253 elseif proptype == "boolean" and v == true then |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
254 out:tag(name, propattr):up(); |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
255 end |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
256 elseif proptype == "object" and type(propschema) == "table" and type(v) == "table" then |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
257 local c = unparse(propschema, v, name, namespace); |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
258 if c then |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
259 out:add_direct_child(c); |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
260 end |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
261 elseif proptype == "array" and type(propschema) == "table" and type(v) == "table" then |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
262 if value_where == "in_wrapper" then |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
263 local c = unparse(propschema, v, name, namespace); |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
264 if c then |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
265 out:add_direct_child(c); |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
266 end |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
267 else |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
268 unparse(propschema, v, name, namespace, out); |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
269 end |
11475
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
270 else |
9bd36e871f05
util.datamapper: Factor out conversion from any value to XML string
Kim Alvefur <zash@zash.se>
parents:
11471
diff
changeset
|
271 out:text_tag(name, toxmlstring(proptype, v), propattr) |
11467
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
272 end |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
273 end |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
274 end |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
275 |
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
276 function unparse(schema, t, current_name, current_ns, ctx) |
11436
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
277 |
11458
0e00fa518688
util.datamapper: Limited support for unparsing simple arrays of strings
Kim Alvefur <zash@zash.se>
parents:
11457
diff
changeset
|
278 if schema.xml then |
0e00fa518688
util.datamapper: Limited support for unparsing simple arrays of strings
Kim Alvefur <zash@zash.se>
parents:
11457
diff
changeset
|
279 if schema.xml.name then |
0e00fa518688
util.datamapper: Limited support for unparsing simple arrays of strings
Kim Alvefur <zash@zash.se>
parents:
11457
diff
changeset
|
280 current_name = schema.xml.name |
0e00fa518688
util.datamapper: Limited support for unparsing simple arrays of strings
Kim Alvefur <zash@zash.se>
parents:
11457
diff
changeset
|
281 end |
0e00fa518688
util.datamapper: Limited support for unparsing simple arrays of strings
Kim Alvefur <zash@zash.se>
parents:
11457
diff
changeset
|
282 if schema.xml.namespace then |
0e00fa518688
util.datamapper: Limited support for unparsing simple arrays of strings
Kim Alvefur <zash@zash.se>
parents:
11457
diff
changeset
|
283 current_ns = schema.xml.namespace |
11436
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
284 end |
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
285 |
11458
0e00fa518688
util.datamapper: Limited support for unparsing simple arrays of strings
Kim Alvefur <zash@zash.se>
parents:
11457
diff
changeset
|
286 end |
0e00fa518688
util.datamapper: Limited support for unparsing simple arrays of strings
Kim Alvefur <zash@zash.se>
parents:
11457
diff
changeset
|
287 |
11462
d1982b7eb00d
util.datamapper: Fix arrays nesting one level too deep
Kim Alvefur <zash@zash.se>
parents:
11461
diff
changeset
|
288 local out = ctx or st.stanza(current_name, {xmlns = current_ns}) |
11458
0e00fa518688
util.datamapper: Limited support for unparsing simple arrays of strings
Kim Alvefur <zash@zash.se>
parents:
11457
diff
changeset
|
289 |
0e00fa518688
util.datamapper: Limited support for unparsing simple arrays of strings
Kim Alvefur <zash@zash.se>
parents:
11457
diff
changeset
|
290 if schema.type == "object" then |
11436
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
291 |
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
292 for prop, propschema in pairs(schema.properties) do |
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
293 local v = t[prop] |
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
294 |
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
295 if v ~= nil then |
11456
4e376a43fe40
util.datamapper: Factor out common schema unpacking
Kim Alvefur <zash@zash.se>
parents:
11455
diff
changeset
|
296 local proptype, value_where, name, namespace, prefix, single_attribute = unpack_propschema(propschema, prop, current_ns) |
11467
88792dd2bee9
util.datamapper: Factor out handling of object properties for array reuse
Kim Alvefur <zash@zash.se>
parents:
11466
diff
changeset
|
297 unparse_property(out, v, proptype, propschema, value_where, name, namespace, current_ns, prefix, single_attribute) |
11436
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
298 end |
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
299 end |
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
300 return out |
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
301 |
11458
0e00fa518688
util.datamapper: Limited support for unparsing simple arrays of strings
Kim Alvefur <zash@zash.se>
parents:
11457
diff
changeset
|
302 elseif schema.type == "array" then |
11468
348b191cd850
util.datamapper: Complete array building support
Kim Alvefur <zash@zash.se>
parents:
11467
diff
changeset
|
303 local proptype, value_where, name, namespace, prefix, single_attribute = unpack_propschema(schema.items, current_name, current_ns) |
348b191cd850
util.datamapper: Complete array building support
Kim Alvefur <zash@zash.se>
parents:
11467
diff
changeset
|
304 for _, item in ipairs(t) do |
348b191cd850
util.datamapper: Complete array building support
Kim Alvefur <zash@zash.se>
parents:
11467
diff
changeset
|
305 unparse_property(out, item, proptype, schema.items, value_where, name, namespace, current_ns, prefix, single_attribute) |
11458
0e00fa518688
util.datamapper: Limited support for unparsing simple arrays of strings
Kim Alvefur <zash@zash.se>
parents:
11457
diff
changeset
|
306 end |
0e00fa518688
util.datamapper: Limited support for unparsing simple arrays of strings
Kim Alvefur <zash@zash.se>
parents:
11457
diff
changeset
|
307 return out |
11436
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
308 end |
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
309 end |
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
310 |
5df9ffc25bb4
util.datamapper: Add 'unparse' for turning tables into XML
Kim Alvefur <zash@zash.se>
parents:
11435
diff
changeset
|
311 return {parse = parse; unparse = unparse} |