Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Several minor internal cleanups to the json code which i thought i had committed last week :/. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
055dfb1223c42a2d89e388f5cf9d42c3 |
User & Date: | stephan 2012-07-13 15:06:56.959 |
Context
2012-07-13
| ||
16:56 | Fixed a segfault which could/did happen when running content through wikification in CLI mode (which g.zTop is not set). ... (check-in: a3dd2cfe user: stephan tags: trunk) | |
15:06 | Several minor internal cleanups to the json code which i thought i had committed last week :/. ... (check-in: 055dfb12 user: stephan tags: trunk) | |
2012-07-06
| ||
16:18 | /json/query now fails without executing the query if the provided query has no result _columns_ (to explicitly disallow INSERT/DELETE/DROP, etc.). ... (check-in: 3e1dd97f user: stephan tags: trunk) | |
Changes
Changes to src/json.c.
︙ | ︙ | |||
1696 1697 1698 1699 1700 1701 1702 | if(!a){ a = cson_new_array(); assert(NULL!=a); } if(!colNames){ colNamesV = cson_sqlite3_column_names(pStmt->pStmt); assert(NULL != colNamesV); | | < > | 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 | if(!a){ a = cson_new_array(); assert(NULL!=a); } if(!colNames){ colNamesV = cson_sqlite3_column_names(pStmt->pStmt); assert(NULL != colNamesV); /*Why? cson_value_add_reference(colNamesV) avoids an ownership problem*/; colNames = cson_value_get_array(colNamesV); assert(NULL != colNames); } row = cson_sqlite3_row_to_object2(pStmt->pStmt, colNames); if(!row && !warnMsg){ warnMsg = "Could not convert at least one result row to JSON."; continue; } if( 0 != cson_array_append(a, row) ){ cson_value_free(row); if(pTgt != a) { cson_free_array(a); } assert( 0 && "Alloc error."); return NULL; } } cson_value_free(colNamesV); if(warnMsg){ json_warn( FSL_JSON_W_ROW_TO_JSON_FAILED, warnMsg ); } |
︙ | ︙ |
Changes to src/json_detail.h.
︙ | ︙ | |||
170 171 172 173 174 175 176 177 178 179 180 181 182 183 | ** Which mode(s) of execution does func() support: ** ** <0 = CLI only, >0 = HTTP only, 0==both ** ** Now that we can simulate POST in CLI mode, the distinction ** between them has disappeared in most (or all) cases, so 0 is the ** the standard value. */ char runMode; } JsonPageDef; /* ** Holds common keys used for various JSON API properties. */ | > > > | 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 | ** Which mode(s) of execution does func() support: ** ** <0 = CLI only, >0 = HTTP only, 0==both ** ** Now that we can simulate POST in CLI mode, the distinction ** between them has disappeared in most (or all) cases, so 0 is the ** the standard value. ** ** 201207: this is not needed any more. We can get rid of it. Or ** keep it around in case it becomes useful again at some point. */ char runMode; } JsonPageDef; /* ** Holds common keys used for various JSON API properties. */ |
︙ | ︙ | |||
210 211 212 213 214 215 216 | ** values and NULL is returned. If non-NULL is returned, ownership is ** transfered to the caller (but the g.json error state might still be ** set in that case, so the caller must check that or pass it on up ** the dispatch chain). */ cson_value * json_page_dispatch_helper(JsonPageDef const * pages); | < < < < < < < < < < < < < < < < | 213 214 215 216 217 218 219 220 221 222 223 224 225 226 | ** values and NULL is returned. If non-NULL is returned, ownership is ** transfered to the caller (but the g.json error state might still be ** set in that case, so the caller must check that or pass it on up ** the dispatch chain). */ cson_value * json_page_dispatch_helper(JsonPageDef const * pages); /* ** Convenience wrapper around cson_value_new_string(). ** Returns NULL if str is NULL or on allocation error. */ cson_value * json_new_string( char const * str ); /* |
︙ | ︙ |
Changes to src/json_report.c.
︙ | ︙ | |||
49 50 51 52 53 54 55 | */ cson_value * json_page_report(){ if(!g.perm.RdTkt && !g.perm.NewTkt ){ json_set_err(FSL_JSON_E_DENIED, "Requires 'r' or 'n' permissions."); return NULL; } | | | 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | */ cson_value * json_page_report(){ if(!g.perm.RdTkt && !g.perm.NewTkt ){ json_set_err(FSL_JSON_E_DENIED, "Requires 'r' or 'n' permissions."); return NULL; } return json_page_dispatch_helper(JsonPageDefs_Report); } /* ** Searches the environment for a "report" parameter ** (CLI: -report/-r #). ** ** If one is not found and argPos is >0 then json_command_arg() |
︙ | ︙ | |||
247 248 249 250 251 252 253 | goto end; error: assert(0 != g.json.resultCode); cson_value_free( cson_object_value(pay) ); pay = NULL; | | | 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 | goto end; error: assert(0 != g.json.resultCode); cson_value_free( cson_object_value(pay) ); pay = NULL; end: return pay ? cson_object_value(pay) : NULL; } static cson_value * json_report_save(){ return NULL; } #endif /* FOSSIL_ENABLE_JSON */ |
Changes to src/json_user.c.
︙ | ︙ | |||
354 355 356 357 358 359 360 | puts(blob_str(&sql)); cson_output_FILE( cson_object_value(pUser), stdout, NULL ); #endif db_prepare(&q, "%s", blob_str(&sql)); db_exec(&q); db_finalize(&q); #if TRY_LOGIN_GROUP | | | 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 | puts(blob_str(&sql)); cson_output_FILE( cson_object_value(pUser), stdout, NULL ); #endif db_prepare(&q, "%s", blob_str(&sql)); db_exec(&q); db_finalize(&q); #if TRY_LOGIN_GROUP if( zPW || cson_value_get_bool(forceLogout) ){ Blob groupSql = empty_blob; char * zErr = NULL; blob_appendf(&groupSql, "INSERT INTO user(login)" " SELECT %Q WHERE NOT EXISTS(SELECT 1 FROM user WHERE login=%Q);", zName, zName ); |
︙ | ︙ | |||
401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 | a JSON form of it... */ cson_object * u = cson_new_object(); char const * str = NULL; char b = -1; int i = -1; int uid = -1; cson_value * payload = NULL; #define PROP(LK,SK) str = json_find_option_cstr(LK,NULL,SK); \ if(str){ cson_object_set(u, LK, json_new_string(str)); } (void)0 PROP("name","n"); PROP("password","p"); PROP("info","i"); PROP("capabilities","c"); #undef PROP #define PROP(LK,DFLT) b = json_find_option_bool(LK,NULL,NULL,DFLT); \ if(DFLT!=b){ cson_object_set(u, LK, cson_value_new_bool(b)); } (void)0 PROP("forceLogout",-1); #undef PROP #define PROP(LK,DFLT) i = json_find_option_int(LK,NULL,NULL,DFLT); \ if(DFLT != i){ cson_object_set(u, LK, cson_value_new_integer(i)); } (void)0 | > > | 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 | a JSON form of it... */ cson_object * u = cson_new_object(); char const * str = NULL; char b = -1; int i = -1; int uid = -1; cson_value * payload = NULL; /* String properties... */ #define PROP(LK,SK) str = json_find_option_cstr(LK,NULL,SK); \ if(str){ cson_object_set(u, LK, json_new_string(str)); } (void)0 PROP("name","n"); PROP("password","p"); PROP("info","i"); PROP("capabilities","c"); #undef PROP /* Boolean properties... */ #define PROP(LK,DFLT) b = json_find_option_bool(LK,NULL,NULL,DFLT); \ if(DFLT!=b){ cson_object_set(u, LK, cson_value_new_bool(b)); } (void)0 PROP("forceLogout",-1); #undef PROP #define PROP(LK,DFLT) i = json_find_option_int(LK,NULL,NULL,DFLT); \ if(DFLT != i){ cson_object_set(u, LK, cson_value_new_integer(i)); } (void)0 |
︙ | ︙ |
Changes to src/json_wiki.c.
1 2 | #ifdef FOSSIL_ENABLE_JSON /* | | | 1 2 3 4 5 6 7 8 9 10 | #ifdef FOSSIL_ENABLE_JSON /* ** Copyright (c) 2011-12 D. Richard Hipp ** ** This program is free software; you can redistribute it and/or ** modify it under the terms of the Simplified BSD License (also ** known as the "2-Clause License" or "FreeBSD License".) ** ** This program is distributed in the hope that it will be useful, ** but without any warranty; without even the implied warranty of |
︙ | ︙ | |||
46 47 48 49 50 51 52 | /* ** Implements the /json/wiki family of pages/commands. ** */ cson_value * json_page_wiki(){ | | > > > > > | 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | /* ** Implements the /json/wiki family of pages/commands. ** */ cson_value * json_page_wiki(){ return json_page_dispatch_helper(JsonPageDefs_Wiki); } /* ** Returns the UUID for the given wiki blob RID, or NULL if not ** found. The returned string is allocated via db_text() and must be ** free()d by the caller. */ char * json_wiki_get_uuid_for_rid( int rid ) { return db_text(NULL, "SELECT b.uuid FROM tag t, tagxref x, blob b" " WHERE x.tagid=t.tagid AND t.tagname GLOB 'wiki-*' " " AND b.rid=x.rid AND b.rid=%d" " ORDER BY x.mtime DESC LIMIT 1", |
︙ | ︙ | |||
81 82 83 84 85 86 87 | Manifest * pWiki = NULL; if( NULL == (pWiki = manifest_get(rid, CFTYPE_WIKI)) ){ json_set_err( FSL_JSON_E_UNKNOWN, "Error reading wiki page from manifest (rid=%d).", rid ); return NULL; }else{ | < | 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | Manifest * pWiki = NULL; if( NULL == (pWiki = manifest_get(rid, CFTYPE_WIKI)) ){ json_set_err( FSL_JSON_E_UNKNOWN, "Error reading wiki page from manifest (rid=%d).", rid ); return NULL; }else{ unsigned int len = 0; cson_object * pay = cson_new_object(); char const * zBody = pWiki->zWiki; char const * zFormat = NULL; char * zUuid = json_wiki_get_uuid_for_rid(rid); cson_object_set(pay,"name",json_new_string(pWiki->zWikiTitle)); cson_object_set(pay,"uuid",json_new_string(zUuid)); |
︙ | ︙ |