bsw@51: function util.autoapi_xml(args) bsw@75: local relation_name = assert(args.relation_name) bsw@51: local selector = assert(args.selector) bsw@51: local fields = assert(args.fields) bsw@51: local rows = selector:exec() bsw@75: slot.set_layout("xml", "application/xml") bsw@75: slot.put("<", relation_name, "_list>\n") bsw@51: for i_row, row in ipairs(rows) do bsw@75: slot.put(" <", relation_name, ">\n") bsw@51: for i_field, field in ipairs(fields) do bsw@51: slot.put(" <", field.name, ">") bsw@51: local value bsw@51: if field.func then bsw@51: value = field.func(row) bsw@51: elseif field.field then bsw@51: value = row[field.name] bsw@51: end bsw/jbe@52: if value ~= nil then bsw@51: slot.put(encode.html(tostring(value))) bsw/jbe@52: else bsw/jbe@52: slot.put("NULL") bsw@51: end bsw@51: slot.put("\n") bsw@51: end bsw@75: slot.put(" \n") bsw@51: end bsw@75: slot.put("\n") bsw@51: end bsw@51: bsw@51: function util.autoapi_json(args) bsw@75: slot.set_layout("blank", "application/json") bsw@51: local selector = assert(args.selector) bsw@51: local fields = assert(args.fields) bsw@51: local rows = selector:exec() bsw@75: slot.put("[\n") bsw@51: for i_row, row in ipairs(rows) do bsw@51: slot.put(" {\n") bsw@51: for i_field, field in ipairs(fields) do bsw@75: slot.put(" \"", field.name, "\": ") bsw@51: local value bsw@51: if field.func then bsw@51: value = field.func(row) bsw@51: elseif field.field then bsw@51: value = row[field.name] bsw@51: end bsw@75: slot.put(encode.json(value)) bsw@75: if i_field < #fields then bsw@75: slot.put(",") bsw@75: end bsw@75: slot.put("\n") bsw@51: end bsw@75: slot.put(" }") bsw@75: if i_row < #rows then bsw@75: slot.put(",") bsw@75: end bsw@75: slot.put("\n") bsw@51: end bsw@75: slot.put("]\n") bsw@51: end bsw@51: bsw@51: function util.autoapi(args) bsw@75: local relation_name = assert(args.relation_name) bsw@51: local selector = assert(args.selector) bsw@51: local fields = assert(args.fields) bsw@51: local api_engine = assert(args.api_engine) bsw@51: bsw@51: selector:reset_fields() bsw@51: bsw@51: for i_field, field in ipairs(fields) do bsw@51: if field.field then bsw@51: selector:add_field(field.field, field.name) bsw@51: end bsw@51: end bsw@51: bsw@51: if api_engine == "xml" then bsw@51: util.autoapi_xml{ bsw@75: relation_name = relation_name, bsw@51: selector = selector, bsw@51: fields = fields bsw@51: } bsw@51: elseif api_engine == "json" then bsw@51: util.autoapi_json{ bsw@51: selector = selector, bsw@51: fields = fields bsw@51: } bsw@51: end bsw@51: bsw@51: end