| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284 | 
							- /*
 
-  * libwebsockets - small server side websockets and web server implementation
 
-  *
 
-  * Copyright (C) 2010 - 2020 Andy Green <andy@warmcat.com>
 
-  *
 
-  * Permission is hereby granted, free of charge, to any person obtaining a copy
 
-  * of this software and associated documentation files (the "Software"), to
 
-  * deal in the Software without restriction, including without limitation the
 
-  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 
-  * sell copies of the Software, and to permit persons to whom the Software is
 
-  * furnished to do so, subject to the following conditions:
 
-  *
 
-  * The above copyright notice and this permission notice shall be included in
 
-  * all copies or substantial portions of the Software.
 
-  *
 
-  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 
-  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 
-  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 
-  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 
-  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 
-  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 
-  * IN THE SOFTWARE.
 
-  */
 
- #if defined(LWS_WITH_STRUCT_SQLITE3)
 
- #include <sqlite3.h>
 
- #endif
 
- typedef enum {
 
- 	LSMT_SIGNED,
 
- 	LSMT_UNSIGNED,
 
- 	LSMT_BOOLEAN,
 
- 	LSMT_STRING_CHAR_ARRAY,
 
- 	LSMT_STRING_PTR,
 
- 	LSMT_LIST,
 
- 	LSMT_CHILD_PTR,
 
- 	LSMT_SCHEMA,
 
- 	LSMT_BLOB_PTR,
 
- } lws_struct_map_type_eum;
 
- typedef struct lejp_collation {
 
- 	struct lws_dll2 chunks;
 
- 	int len;
 
- 	char buf[LEJP_STRING_CHUNK + 1];
 
- } lejp_collation_t;
 
- typedef struct lws_struct_map {
 
- 	const char *colname;
 
- 	const struct lws_struct_map *child_map;
 
- 	lejp_callback lejp_cb;
 
- 	size_t ofs;			/* child dll2; points to dll2_owner */
 
- 	size_t aux;
 
- 	size_t ofs_clist;
 
- 	size_t child_map_size;
 
- 	lws_struct_map_type_eum type;
 
- } lws_struct_map_t;
 
- typedef int (*lws_struct_args_cb)(void *obj, void *cb_arg);
 
- typedef struct lws_struct_args {
 
- 	const lws_struct_map_t *map_st[LEJP_MAX_PARSING_STACK_DEPTH];
 
- 	lws_struct_args_cb cb;
 
- 	struct lwsac *ac;
 
- 	void *cb_arg;
 
- 	void *dest;
 
- 	size_t dest_len;
 
- 	size_t toplevel_dll2_ofs;
 
- 	size_t map_entries_st[LEJP_MAX_PARSING_STACK_DEPTH];
 
- 	size_t ac_block_size;
 
- 	int subtype;
 
- 	int top_schema_index;
 
- 	/*
 
- 	 * temp ac used to collate unknown possibly huge strings before final
 
- 	 * allocation and copy
 
- 	 */
 
- 	struct lwsac *ac_chunks;
 
- 	struct lws_dll2_owner chunks_owner;
 
- 	size_t chunks_length;
 
- } lws_struct_args_t;
 
- #define LSM_SIGNED(type, name, qname) \
 
- 	{ \
 
- 	  qname, \
 
- 	  NULL, \
 
- 	  NULL, \
 
- 	  offsetof(type, name), \
 
- 	  sizeof ((type *)0)->name, \
 
- 	  0, \
 
- 	  0, \
 
- 	  LSMT_SIGNED \
 
- 	}
 
- #define LSM_UNSIGNED(type, name, qname) \
 
- 	{ \
 
- 	  qname, \
 
- 	  NULL, \
 
- 	  NULL, \
 
- 	  offsetof(type, name), \
 
- 	  sizeof ((type *)0)->name, \
 
- 	  0, \
 
- 	  0, \
 
- 	  LSMT_UNSIGNED \
 
- 	}
 
- #define LSM_BOOLEAN(type, name, qname) \
 
- 	{ \
 
- 	  qname, \
 
- 	  NULL, \
 
- 	  NULL, \
 
- 	  offsetof(type, name), \
 
- 	  sizeof ((type *)0)->name, \
 
- 	  0, \
 
- 	  0, \
 
- 	  LSMT_BOOLEAN \
 
- 	}
 
- #define LSM_CARRAY(type, name, qname) \
 
- 	{ \
 
- 	  qname, \
 
- 	  NULL, \
 
- 	  NULL, \
 
- 	  offsetof(type, name), \
 
- 	  sizeof (((type *)0)->name), \
 
- 	  0, \
 
- 	  0, \
 
- 	  LSMT_STRING_CHAR_ARRAY \
 
- 	}
 
- #define LSM_STRING_PTR(type, name, qname) \
 
- 	{ \
 
- 	  qname, \
 
- 	  NULL, \
 
- 	  NULL, \
 
- 	  offsetof(type, name), \
 
- 	  sizeof (((type *)0)->name), \
 
- 	  0, \
 
- 	  0, \
 
- 	  LSMT_STRING_PTR \
 
- 	}
 
- #define LSM_LIST(ptype, pname, ctype, cname, lejp_cb, cmap, qname) \
 
- 	{ \
 
- 	  qname, \
 
- 	  cmap, \
 
- 	  lejp_cb, \
 
- 	  offsetof(ptype, pname), \
 
- 	  sizeof (ctype), \
 
- 	  offsetof(ctype, cname), \
 
- 	  LWS_ARRAY_SIZE(cmap), \
 
- 	  LSMT_LIST \
 
- 	}
 
- #define LSM_CHILD_PTR(ptype, pname, ctype, lejp_cb, cmap, qname) \
 
- 	{ \
 
- 	  qname, \
 
- 	  cmap, \
 
- 	  lejp_cb, \
 
- 	  offsetof(ptype, pname), \
 
- 	  sizeof (ctype), \
 
- 	  0, \
 
- 	  LWS_ARRAY_SIZE(cmap), \
 
- 	  LSMT_CHILD_PTR \
 
- 	}
 
- #define LSM_SCHEMA(ctype, lejp_cb, map, schema_name) \
 
- 	{ \
 
- 	  schema_name, \
 
- 	  map, \
 
- 	  lejp_cb, \
 
- 	  0, \
 
- 	  sizeof (ctype), \
 
- 	  0, \
 
- 	  LWS_ARRAY_SIZE(map), \
 
- 	  LSMT_SCHEMA \
 
- 	}
 
- #define LSM_SCHEMA_DLL2(ctype, cdll2mem, lejp_cb, map, schema_name) \
 
- 	{ \
 
- 	  schema_name, \
 
- 	  map, \
 
- 	  lejp_cb, \
 
- 	  offsetof(ctype, cdll2mem), \
 
- 	  sizeof (ctype), \
 
- 	  0, \
 
- 	  LWS_ARRAY_SIZE(map), \
 
- 	  LSMT_SCHEMA \
 
- 	}
 
- /*
 
-  * This is just used to create the table schema, it is not part of serialization
 
-  * and deserialization.  Blobs should be accessed separately.
 
-  */
 
- #define LSM_BLOB_PTR(type, blobptr_name, qname) \
 
- 	{ \
 
- 	  qname, /* JSON item, or sqlite3 column name */ \
 
- 	  NULL, \
 
- 	  NULL, \
 
- 	  offsetof(type, blobptr_name),       /* member that points to blob */ \
 
- 	  sizeof (((type *)0)->blobptr_name),       /* size of blob pointer */ \
 
- 	  0,		 /* member holding blob len */ \
 
- 	  0, /* size of blob length member */ \
 
- 	  LSMT_BLOB_PTR \
 
- 	}
 
- typedef struct lws_struct_serialize_st {
 
- 	const struct lws_dll2 *dllpos;
 
- 	const lws_struct_map_t *map;
 
- 	const char *obj;
 
- 	size_t map_entries;
 
- 	size_t map_entry;
 
- 	size_t size;
 
- 	char subsequent;
 
- 	char idt;
 
- } lws_struct_serialize_st_t;
 
- enum {
 
- 	LSSERJ_FLAG_PRETTY	= (1 << 0),
 
- 	LSSERJ_FLAG_OMIT_SCHEMA = (1 << 1)
 
- };
 
- typedef struct lws_struct_serialize {
 
- 	lws_struct_serialize_st_t st[LEJP_MAX_PARSING_STACK_DEPTH];
 
- 	size_t offset;
 
- 	size_t remaining;
 
- 	int sp;
 
- 	int flags;
 
- } lws_struct_serialize_t;
 
- typedef enum {
 
- 	LSJS_RESULT_CONTINUE,
 
- 	LSJS_RESULT_FINISH,
 
- 	LSJS_RESULT_ERROR
 
- } lws_struct_json_serialize_result_t;
 
- LWS_VISIBLE LWS_EXTERN int
 
- lws_struct_json_init_parse(struct lejp_ctx *ctx, lejp_callback cb,
 
- 			   void *user);
 
- LWS_VISIBLE LWS_EXTERN signed char
 
- lws_struct_schema_only_lejp_cb(struct lejp_ctx *ctx, char reason);
 
- LWS_VISIBLE LWS_EXTERN signed char
 
- lws_struct_default_lejp_cb(struct lejp_ctx *ctx, char reason);
 
- LWS_VISIBLE LWS_EXTERN lws_struct_serialize_t *
 
- lws_struct_json_serialize_create(const lws_struct_map_t *map,
 
- 				 size_t map_entries, int flags,
 
- 				 const void *ptoplevel);
 
- LWS_VISIBLE LWS_EXTERN void
 
- lws_struct_json_serialize_destroy(lws_struct_serialize_t **pjs);
 
- LWS_VISIBLE LWS_EXTERN lws_struct_json_serialize_result_t
 
- lws_struct_json_serialize(lws_struct_serialize_t *js, uint8_t *buf,
 
- 			  size_t len, size_t *written);
 
- typedef struct sqlite3 sqlite3;
 
- LWS_VISIBLE LWS_EXTERN int
 
- lws_struct_sq3_serialize(sqlite3 *pdb, const lws_struct_map_t *schema,
 
- 			 lws_dll2_owner_t *owner, uint32_t manual_idx);
 
- LWS_VISIBLE LWS_EXTERN int
 
- lws_struct_sq3_deserialize(sqlite3 *pdb, const char *filter, const char *order,
 
- 			   const lws_struct_map_t *schema, lws_dll2_owner_t *o,
 
- 			   struct lwsac **ac, int start, int limit);
 
- LWS_VISIBLE LWS_EXTERN int
 
- lws_struct_sq3_create_table(sqlite3 *pdb, const lws_struct_map_t *schema);
 
- LWS_VISIBLE LWS_EXTERN int
 
- lws_struct_sq3_open(struct lws_context *context, const char *sqlite3_path,
 
- 		    char create_if_missing, sqlite3 **pdb);
 
- LWS_VISIBLE LWS_EXTERN int
 
- lws_struct_sq3_close(sqlite3 **pdb);
 
 
  |