Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | lots of minor cleanups in JSON error handling (mostly cosmetic). Added some new FOSSIL-xxxx codes. |
|---|---|
| Timelines: | family | ancestors | descendants | both | json-multitag-test | json |
| Files: | files | file ages | folders |
| SHA1: |
2e41514fb754131bc1206b7f42338da5 |
| User & Date: | stephan 2011-10-05 00:53:49.430 |
Context
|
2011-10-05
| ||
| 02:26 | Consolidated more of the CLI/HTTP/CLI-with-POST arg handling disparities into the json_find_option() family of functions. check-in: 5b4a3f12dc user: stephan tags: json-multitag-test, json | |
| 00:53 | lots of minor cleanups in JSON error handling (mostly cosmetic). Added some new FOSSIL-xxxx codes. check-in: 2e41514fb7 user: stephan tags: json-multitag-test, json | |
|
2011-10-04
| ||
| 23:40 | merged and conflict-resolved trunk [c0274f996266aef]. check-in: 4fbf77d4f3 user: stephan tags: json-multitag-test, json | |
Changes
Changes to src/json.c.
| ︙ | ︙ | |||
204 205 206 207 208 209 210 |
case 0: return "Success";
#define C(X,V) case FSL_JSON_E_ ## X: return V
C(GENERIC,"Generic error");
C(INVALID_REQUEST,"Invalid request");
C(UNKNOWN_COMMAND,"Unknown Command");
C(UNKNOWN,"Unknown error");
| < > > > > > > > < < < | | | > > > | 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 |
case 0: return "Success";
#define C(X,V) case FSL_JSON_E_ ## X: return V
C(GENERIC,"Generic error");
C(INVALID_REQUEST,"Invalid request");
C(UNKNOWN_COMMAND,"Unknown Command");
C(UNKNOWN,"Unknown error");
C(TIMEOUT,"Timeout reached");
C(ASSERT,"Assertion failed");
C(ALLOC,"Resource allocation failed");
C(NYI,"Not yet implemented");
C(PANIC,"x");
C(MANIFEST_READ_FAILED,"Reading artifact manifest failed.");
C(FILE_OPEN_FAILED,"Opening file failed.");
C(AUTH,"Authentication error");
C(MISSING_AUTH,"Authentication info missing from request");
C(DENIED,"Access denied");
C(WRONG_MODE,"Request not allowed (wrong operation mode)");
C(LOGIN_FAILED,"Login failed");
C(LOGIN_FAILED_NOSEED,"Anonymous login attempt was missing password seed");
C(LOGIN_FAILED_NONAME,"Login failed - name not supplied");
C(LOGIN_FAILED_NOPW,"Login failed - password not supplied");
C(LOGIN_FAILED_NOTFOUND,"Login failed - no match found");
C(USAGE,"Usage error");
C(INVALID_ARGS,"Invalid argument(s)");
C(MISSING_ARGS,"Missing argument(s)");
C(AMBIGUOUS_UUID,"Resource identifier is ambiguous");
C(UNRESOLVED_UUID,"Provided uuid/tag/branch could not be resolved");
C(RESOURCE_ALREADY_EXISTS,"Resource already exists");
C(RESOURCE_NOT_FOUND,"Resource not found");
C(DB,"Database error");
C(STMT_PREP,"Statement preparation failed");
C(STMT_BIND,"Statement parameter binding failed");
C(STMT_EXEC,"Statement execution/stepping failed");
C(DB_LOCKED,"Database is locked");
C(DB_NEEDS_REBUILD,"Fossil repository needs to be rebuilt");
|
| ︙ | ︙ | |||
880 881 882 883 884 885 886 887 888 889 890 891 |
cson_value * pathSplit = NULL;
assert( (0==once) && "json_mode_bootstrap() called too many times!");
if( once ){
return;
}else{
once = 1;
}
g.json.jsonp = PD("jsonp",NULL)
/* FIXME: do some sanity checking on g.json.jsonp and ignore it
if it is not halfway reasonable.
*/
;
| > > > < < < | 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 |
cson_value * pathSplit = NULL;
assert( (0==once) && "json_mode_bootstrap() called too many times!");
if( once ){
return;
}else{
once = 1;
}
g.json.isJsonMode = 1;
g.json.resultCode = 0;
g.json.cmd.offset = -1;
g.json.jsonp = PD("jsonp",NULL)
/* FIXME: do some sanity checking on g.json.jsonp and ignore it
if it is not halfway reasonable.
*/
;
if( !g.isHTTP && g.fullHttpReply ){
/* workaround for server mode, so we see it as CGI mode. */
g.isHTTP = 1;
}
if(g.isHTTP){
cgi_set_content_type(json_guess_content_type())
|
| ︙ | ︙ | |||
959 960 961 962 963 964 965 |
if(!jfile || !*jfile){
break;
}
inFile = (0==strcmp("-",jfile))
? stdin
: fopen(jfile,"rb");
if(!inFile){
| | | 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 |
if(!jfile || !*jfile){
break;
}
inFile = (0==strcmp("-",jfile))
? stdin
: fopen(jfile,"rb");
if(!inFile){
g.json.resultCode = FSL_JSON_E_FILE_OPEN_FAILED;
fossil_fatal("Could not open JSON file [%s].",jfile)
/* Does not return. */
;
}
cgi_parse_POST_JSON(inFile, 0);
if( stdin != inFile ){
fclose(inFile);
|
| ︙ | ︙ | |||
1553 1554 1555 1556 1557 1558 1559 |
enum { BufLen = 1000 };
char zBuf[BufLen];
cson_value * jv = NULL;
cson_object * jo = NULL;
cson_value * jv2 = NULL;
cson_object * jo2 = NULL;
if( !g.perm.Read ){
| | > | 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 |
enum { BufLen = 1000 };
char zBuf[BufLen];
cson_value * jv = NULL;
cson_object * jo = NULL;
cson_value * jv2 = NULL;
cson_object * jo2 = NULL;
if( !g.perm.Read ){
json_set_err(FSL_JSON_E_DENIED,
"Requires 'o' permissions.");
return NULL;
}
if( g.isHTTP ){
full = json_getenv_bool("full",0);
}else{
full = (0!=find_option("full","f",0));
}
|
| ︙ | ︙ | |||
1670 1671 1672 1673 1674 1675 1676 |
cson_value * json_page_dispatch_helper(JsonPageDef const * pages){
JsonPageDef const * def;
char const * cmd = json_command_arg(1+g.json.dispatchDepth);
assert( NULL != pages );
if( ! cmd ){
| | | 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 |
cson_value * json_page_dispatch_helper(JsonPageDef const * pages){
JsonPageDef const * def;
char const * cmd = json_command_arg(1+g.json.dispatchDepth);
assert( NULL != pages );
if( ! cmd ){
json_set_err(FSL_JSON_E_MISSING_ARGS, "No subcommand specified.");
return NULL;
}
def = json_handler_for_name( cmd, pages );
if(!def){
g.json.resultCode = FSL_JSON_E_UNKNOWN_COMMAND;
return NULL;
}
|
| ︙ | ︙ | |||
1698 1699 1700 1701 1702 1703 1704 |
/*
** Impl of /json/rebuild. Requires admin previleges.
*/
static cson_value * json_page_rebuild(){
if( !g.perm.Admin ){
| | | < | | | > > > > | 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 |
/*
** Impl of /json/rebuild. Requires admin previleges.
*/
static cson_value * json_page_rebuild(){
if( !g.perm.Admin ){
json_set_err(FSL_JSON_E_DENIED,"Requires 'a' privileges.");
return NULL;
}else{
/* Reminder: the db_xxx() ops "should" fail via the fossil core
error handlers, which will cause a JSON error and exit(). i.e. we
don't handle the errors here. TODO: confirm that all these db
routine fail gracefully in JSON mode.
On large repos (e.g. fossil's) this operation is likely to take
longer than the client timeout, which will cause it to fail (but
it's sqlite3, so it'll fail gracefully).
*/
db_close(1);
db_open_repository(g.zRepositoryName);
db_begin_transaction();
rebuild_db(0, 0, 0);
db_end_transaction(0);
return NULL;
|
| ︙ | ︙ | |||
1735 1736 1737 1738 1739 1740 1741 |
" cap AS capabilities,"
" info AS info,"
" mtime AS mtime"
" FROM user ORDER BY login");
payV = json_stmt_to_array_of_obj(&q, NULL);
db_finalize(&q);
if(NULL == payV){
| | > | 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 |
" cap AS capabilities,"
" info AS info,"
" mtime AS mtime"
" FROM user ORDER BY login");
payV = json_stmt_to_array_of_obj(&q, NULL);
db_finalize(&q);
if(NULL == payV){
json_set_err(FSL_JSON_E_UNKNOWN,
"Could not convert user list to JSON.");
}
return payV;
}
/*
** Impl of /json/user/get. Requires admin rights.
*/
|
| ︙ | ︙ | |||
1760 1761 1762 1763 1764 1765 1766 |
pUser = json_getenv_cstr("name")
/* ACHTUNG: fossil apparently internally sets name=user/get/XYZ
if we pass the name as part of the path, so we check the path
_before_ checking for name=XYZ.
*/;
}
if(!pUser || !*pUser){
| | | | | 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 |
pUser = json_getenv_cstr("name")
/* ACHTUNG: fossil apparently internally sets name=user/get/XYZ
if we pass the name as part of the path, so we check the path
_before_ checking for name=XYZ.
*/;
}
if(!pUser || !*pUser){
json_set_err(FSL_JSON_E_MISSING_ARGS,"Missing 'name' property.");
return NULL;
}
db_prepare(&q,"SELECT uid AS uid,"
" login AS name,"
" cap AS capabilities,"
" info AS info,"
" mtime AS mtime"
" FROM user"
" WHERE login=%Q",
pUser);
if( (SQLITE_ROW == db_step(&q)) ){
payV = cson_sqlite3_row_to_object(q.pStmt);
if(!payV){
json_set_err(FSL_JSON_E_UNKNOWN,"Could not convert user row to JSON.");
}
}else{
json_set_err(FSL_JSON_E_RESOURCE_NOT_FOUND,"User not found.");
}
db_finalize(&q);
return payV;
}
/* Impl in json_login.c. */
cson_value * json_page_anon_password();
|
| ︙ | ︙ |
Changes to src/json_artifact.c.
| ︙ | ︙ | |||
167 168 169 170 171 172 173 |
if(!eventTypeLabel){
eventTypeLabel = json_new_string("ticket");
json_gc_add("$EVENT_TYPE_LABEL(ticket)", eventTypeLabel, 1);
}
pTktChng = manifest_get(rid, CFTYPE_TICKET);
if( pTktChng==0 ){
| | | 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 |
if(!eventTypeLabel){
eventTypeLabel = json_new_string("ticket");
json_gc_add("$EVENT_TYPE_LABEL(ticket)", eventTypeLabel, 1);
}
pTktChng = manifest_get(rid, CFTYPE_TICKET);
if( pTktChng==0 ){
g.json.resultCode = FSL_JSON_E_MANIFEST_READ_FAILED;
return NULL;
}
payV = cson_value_new_object();
pay = cson_value_get_object(payV);
cson_object_set(pay, "eventType", eventTypeLabel );
cson_object_set(pay, "uuid", json_new_string(pTktChng->zTicketUuid));
cson_object_set(pay, "user", json_new_string(pTktChng->zUser));
|
| ︙ | ︙ |
Changes to src/json_detail.h.
| ︙ | ︙ | |||
34 35 36 37 38 39 40 |
** Numbers evenly dividable by 100 are "categories", and error codes
** for a given category have their high bits set to the category
** value.
**
*/
enum FossilJsonCodes {
FSL_JSON_W_START = 0,
| | | | | | | | | | | | | | > > | | | < | | | | | | | | | > > | | | | | 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
** Numbers evenly dividable by 100 are "categories", and error codes
** for a given category have their high bits set to the category
** value.
**
*/
enum FossilJsonCodes {
FSL_JSON_W_START = 0,
FSL_JSON_W_UNKNOWN /*+1*/,
FSL_JSON_W_ROW_TO_JSON_FAILED /*+2*/,
FSL_JSON_W_COL_TO_JSON_FAILED /*+3*/,
FSL_JSON_W_STRING_TO_ARRAY_FAILED /*+4*/,
FSL_JSON_W_END = 1000,
FSL_JSON_E_GENERIC = 1000,
FSL_JSON_E_GENERIC_SUB1 = FSL_JSON_E_GENERIC + 100,
FSL_JSON_E_INVALID_REQUEST /*+1*/,
FSL_JSON_E_UNKNOWN_COMMAND /*+2*/,
FSL_JSON_E_UNKNOWN /*+3*/,
/*REUSE: +4*/
FSL_JSON_E_TIMEOUT /*+5*/,
FSL_JSON_E_ASSERT /*+6*/,
FSL_JSON_E_ALLOC /*+7*/,
FSL_JSON_E_NYI /*+8*/,
FSL_JSON_E_PANIC /*+9*/,
FSL_JSON_E_MANIFEST_READ_FAILED /*+10*/,
FSL_JSON_E_FILE_OPEN_FAILED /*+11*/,
FSL_JSON_E_AUTH = 2000,
FSL_JSON_E_MISSING_AUTH /*+1*/,
FSL_JSON_E_DENIED /*+2*/,
FSL_JSON_E_WRONG_MODE /*+3*/,
FSL_JSON_E_LOGIN_FAILED = FSL_JSON_E_AUTH +100,
FSL_JSON_E_LOGIN_FAILED_NOSEED /*+1*/,
FSL_JSON_E_LOGIN_FAILED_NONAME /*+2*/,
FSL_JSON_E_LOGIN_FAILED_NOPW /*+3*/,
FSL_JSON_E_LOGIN_FAILED_NOTFOUND /*+4*/,
FSL_JSON_E_USAGE = 3000,
FSL_JSON_E_INVALID_ARGS /*+1*/,
FSL_JSON_E_MISSING_ARGS /*+2*/,
FSL_JSON_E_AMBIGUOUS_UUID /*+3*/,
FSL_JSON_E_UNRESOLVED_UUID /*+4*/,
FSL_JSON_E_RESOURCE_ALREADY_EXISTS /*+5*/,
FSL_JSON_E_RESOURCE_NOT_FOUND /*+6*/,
FSL_JSON_E_DB = 4000,
FSL_JSON_E_STMT_PREP /*+1*/,
FSL_JSON_E_STMT_BIND /*+2*/,
FSL_JSON_E_STMT_EXEC /*+3*/,
FSL_JSON_E_DB_LOCKED /*+4*/,
FSL_JSON_E_DB_NEEDS_REBUILD = FSL_JSON_E_DB + 101
};
/*
|
| ︙ | ︙ |
Changes to src/json_timeline.c.
| ︙ | ︙ | |||
399 400 401 402 403 404 405 |
}else{
showFiles = 0!=find_option("files", "f",0);
}
payV = cson_value_new_object();
pay = cson_value_get_object(payV);
check = json_timeline_setup_sql( "ci", &sql, pay );
if(check){
| | | | > > | | 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 |
}else{
showFiles = 0!=find_option("files", "f",0);
}
payV = cson_value_new_object();
pay = cson_value_get_object(payV);
check = json_timeline_setup_sql( "ci", &sql, pay );
if(check){
json_set_err(check, "Query initialization failed.");
goto error;
}
#define SET(K) if(0!=(check=cson_object_set(pay,K,tmp))){ \
json_set_err((cson_rc.AllocError==check) \
? FSL_JSON_E_ALLOC : FSL_JSON_E_UNKNOWN,\
"Object property insertion failed"); \
goto error;\
} (void)0
#if 0
/* only for testing! */
tmp = cson_value_new_string(blob_buffer(&sql),strlen(blob_buffer(&sql)));
SET("timelineSql");
#endif
db_multi_exec(blob_buffer(&sql));
blob_reset(&sql);
|
| ︙ | ︙ | |||
487 488 489 490 491 492 493 |
json_set_err( FSL_JSON_E_DENIED, "Wiki timeline requires 'o' or 'j' access.");
return NULL;
}
payV = cson_value_new_object();
pay = cson_value_get_object(payV);
check = json_timeline_setup_sql( "w", &sql, pay );
if(check){
| | | | > | | 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 |
json_set_err( FSL_JSON_E_DENIED, "Wiki timeline requires 'o' or 'j' access.");
return NULL;
}
payV = cson_value_new_object();
pay = cson_value_get_object(payV);
check = json_timeline_setup_sql( "w", &sql, pay );
if(check){
json_set_err(check, "Query initialization failed.");
goto error;
}
#define SET(K) if(0!=(check=cson_object_set(pay,K,tmp))){ \
json_set_err((cson_rc.AllocError==check) \
? FSL_JSON_E_ALLOC : FSL_JSON_E_UNKNOWN, \
"Object property insertion failed."); \
goto error;\
} (void)0
#if 0
/* only for testing! */
tmp = cson_value_new_string(blob_buffer(&sql),strlen(blob_buffer(&sql)));
SET("timelineSql");
#endif
db_multi_exec(blob_buffer(&sql));
blob_reset(&sql);
|
| ︙ | ︙ | |||
560 561 562 563 564 565 566 |
json_set_err(FSL_JSON_E_DENIED, "Ticket timeline requires 'o' or 'r' access.");
return NULL;
}
payV = cson_value_new_object();
pay = cson_value_get_object(payV);
check = json_timeline_setup_sql( "t", &sql, pay );
if(check){
| | | | > | > > > > > | 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 |
json_set_err(FSL_JSON_E_DENIED, "Ticket timeline requires 'o' or 'r' access.");
return NULL;
}
payV = cson_value_new_object();
pay = cson_value_get_object(payV);
check = json_timeline_setup_sql( "t", &sql, pay );
if(check){
json_set_err(check, "Query initialization failed.");
goto error;
}
db_multi_exec(blob_buffer(&sql));
#define SET(K) if(0!=(check=cson_object_set(pay,K,tmp))){ \
json_set_err((cson_rc.AllocError==check) \
? FSL_JSON_E_ALLOC : FSL_JSON_E_UNKNOWN, \
"Object property insertion failed."); \
goto error;\
} (void)0
#if 0
/* only for testing! */
tmp = cson_value_new_string(blob_buffer(&sql),strlen(blob_buffer(&sql)));
SET("timelineSql");
#endif
blob_reset(&sql);
/*
REMINDER/FIXME(?): we have both uuid (the change uuid?) and
ticketUuid (the actual ticket). This is different from the wiki
timeline, where we only have the wiki page uuid.
*/
db_prepare(&q, "SELECT rid AS rid,"
" uuid AS uuid,"
" mtime AS timestamp,"
#if 0
" timestampString AS timestampString,"
#endif
" user AS user,"
|
| ︙ | ︙ |
Changes to src/json_wiki.c.
| ︙ | ︙ | |||
45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
** Implements the /json/wiki family of pages/commands.
**
*/
cson_value * json_page_wiki(){
return json_page_dispatch_helper(&JsonPageDefs_Wiki[0]);
}
/*
** Implementation of /json/wiki/get.
**
*/
static cson_value * json_wiki_get(){
int rid;
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
** Implements the /json/wiki family of pages/commands.
**
*/
cson_value * json_page_wiki(){
return json_page_dispatch_helper(&JsonPageDefs_Wiki[0]);
}
/*
** Loads the given wiki page and creates a JSON object representation
** of it. If the page is not found then NULL is returned. If doParse
** is true then the page content is HTML-ized using fossil's
** conventional wiki format, else it is not parsed.
**
** The returned value, if not NULL, is-a JSON Object owned by the
** caller.
*/
cson_value * json_get_wiki_page(char const * zPageName, char doParse){
int rid;
Manifest *pWiki = 0;
char const * zBody = NULL;
char const * zFormat = NULL;
char * zUuid = NULL;
Stmt q;
db_prepare(&q,
"SELECT x.rid, b.uuid FROM tag t, tagxref x, blob b"
" WHERE x.tagid=t.tagid AND t.tagname='wiki-%q' "
" AND b.rid=x.rid"
" ORDER BY x.mtime DESC LIMIT 1",
zPageName
);
if( (SQLITE_ROW != db_step(&q)) ){
return NULL;
}
rid = db_column_int(&q,0);
zUuid = db_column_malloc(&q,1);
db_finalize(&q);
if( (pWiki = manifest_get(rid, CFTYPE_WIKI))!=0 ){
zBody = pWiki->zWiki;
}
{
unsigned int len;
cson_value * payV = cson_value_new_object();
cson_object * pay = cson_value_get_object(payV);
cson_object_set(pay,"name",json_new_string(zPageName));
cson_object_set(pay,"uuid",json_new_string(zUuid));
free(zUuid);
zUuid = NULL;
cson_object_set(pay,"rid",json_new_int((cson_int_t)rid));
cson_object_set(pay,"lastSavedBy",json_new_string(pWiki->zUser));
cson_object_set(pay,FossilJsonKeys.timestamp, json_julian_to_timestamp(pWiki->rDate));
cson_object_set(pay,"contentFormat",json_new_string(zFormat));
if( doParse ){
Blob content = empty_blob;
Blob raw = empty_blob;
blob_append(&raw,zBody,-1);
wiki_convert(&raw,&content,0);
len = strlen(zBody);
len = (unsigned int)blob_size(&content);
cson_object_set(pay,"contentLength",json_new_int((cson_int_t)len));
cson_object_set(pay,"content",
cson_value_new_string(blob_buffer(&content),len));
blob_reset(&content);
blob_reset(&raw);
}else{
len = zBody ? strlen(zBody) : 0;
cson_object_set(pay,"contentLength",json_new_int((cson_int_t)len));
cson_object_set(pay,"content",cson_value_new_string(zBody,len));
}
/*TODO: add 'T' (tag) fields*/
/*TODO: add the 'A' card (file attachment) entries?*/
manifest_destroy(pWiki);
return payV;
}
}
/*
** Implementation of /json/wiki/get.
**
*/
static cson_value * json_wiki_get(){
int rid;
|
| ︙ | ︙ | |||
87 88 89 90 91 92 93 |
: find_option("format","f",1);
if(!zFormat || !*zFormat){
zFormat = "raw";
}
if( 'r' != *zFormat ){
zFormat = "html";
}
| < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < | < < < < < < < < < < < < < < < < < < < < < | 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
: find_option("format","f",1);
if(!zFormat || !*zFormat){
zFormat = "raw";
}
if( 'r' != *zFormat ){
zFormat = "html";
}
return json_get_wiki_page(zPageName, 'h'==*zFormat);
}
/*
** Internal impl of /wiki/save and /wiki/create. If createMode is 0
** and the page already exists then a
** FSL_JSON_E_RESOURCE_ALREADY_EXISTS error is triggered. If
** createMode is false then the FSL_JSON_E_RESOURCE_NOT_FOUND is
|
| ︙ | ︙ | |||
304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 |
" FROM tag WHERE tagname GLOB 'wiki-*'"
" ORDER BY lower(name)");
listV = cson_value_new_array();
list = cson_value_get_array(listV);
while( SQLITE_ROW == db_step(&q) ){
cson_value * v = cson_sqlite3_column_to_value(q.pStmt,0);
if(!v){
goto error;
}else if( 0 != cson_array_append( list, v ) ){
cson_value_free(v);
goto error;
}
}
goto end;
error:
cson_value_free(listV);
listV = NULL;
json_set_err(FSL_JSON_E_UNKNOWN,
"Error creating wiki page list.");
end:
db_finalize(&q);
return listV;
}
| > > > > > > | 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 |
" FROM tag WHERE tagname GLOB 'wiki-*'"
" ORDER BY lower(name)");
listV = cson_value_new_array();
list = cson_value_get_array(listV);
while( SQLITE_ROW == db_step(&q) ){
cson_value * v = cson_sqlite3_column_to_value(q.pStmt,0);
if(!v){
json_set_err(FSL_JSON_E_UNKNOWN,
"Could not convert wiki name column to JSON.");
goto error;
}else if( 0 != cson_array_append( list, v ) ){
cson_value_free(v);
json_set_err(FSL_JSON_E_ALLOC,"Could not append wiki page name to array.")
/* OOM (or maybe numeric overflow) are the only realistic
error codes for that particular failure.*/;
goto error;
}
}
goto end;
error:
assert(0 != g.json.resultCode);
cson_value_free(listV);
listV = NULL;
json_set_err(FSL_JSON_E_UNKNOWN,
"Error creating wiki page list.");
end:
db_finalize(&q);
return listV;
}
|