On Sat, Sep 1, 2018 at 1:49 PM Graham Leggett <minf...@sharp.fm> wrote:
>
> On 01 Sep 2018, at 13:13, Yann Ylavic <ylavic....@gmail.com> wrote:
>
> > So how about the attached patch too, allowing for case sensitive 
> > apr_tables? :p
> > apr_json could then use apr_table_make_ex()…
>
> I like the idea of a case sensitive apr_table, it’s something that would have 
> been useful to me in the past.

Yeah, quite tangential to JSON but indeed useful, I'll commit it
independently if no objection arises.

>
> Using it in the JSON code I’m still not keen on, as we need the hard security 
> guarantees of the apr_hash method signature, which has just one mode of 
> operation.

I'm not sure what you mean by the "hard security guarantees of the
apr_hash method signature", for me the only hard guarantee of
apr_hash_t is to not lose data, but that's also a guarantee of
apr_table :)

Speaking of JSON, the downside of apr_hash are no-doublons and the
need for klen all over the place, so for me the right structure is
(caseless-)apr_table.

> We’re also still forced to unnecessarily strndup all our keys on the way in 
> to make them NUL terminated.

No we don't, in my patch apr_json_string_create() does apr_strmemdup()
only if the given len != APR_JSON_VALUE_STRING (which makes sense both
to make sure that the given string is NUL-terminated and to provide a
way to duplicate it if it's not already or the scope doesn't fit).
Then C string key version of apr_json_object_{set,add}() uses
APR_JSON_VALUE_STRING to build the json string key and
apr_table_setn/addn() to fill the table, so no duplication occurs by
default.
The way to duplicate the key for the user would be to
apr_json_object_{set,add}_ex(apr_json_string_create(key, strlen(key),
value, ...) explicitely, but that's not the "default" API.

Otherwise everything should work as before, and I like the _set/add()
semantics (borrowed from apr_table) nice w.r.t. doublons.


Regards,
Yann.

Reply via email to