#ifdef FOSSIL_ENABLE_JSON
/*
** Copyright (c) 2011 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
** merchantability or fitness for a particular purpose.
**
** Author contact information:
** drh@hwaci.com
** http://www.hwaci.com/drh/
**
*/
#include "VERSION.h"
#include "config.h"
#include "json_finfo.h"
#if INTERFACE
#include "json_detail.h"
#endif
/*
** Implements the /json/finfo page/command.
**
*/
cson_value * json_page_finfo(){
cson_object * pay = NULL;
cson_array * checkins = NULL;
char const * zFilename = NULL;
Blob sql = empty_blob;
Stmt q = empty_Stmt;
char const * zAfter = NULL;
char const * zBefore = NULL;
int limit = -1;
int currentRow = 0;
if(!g.perm.Read){
json_set_err(FSL_JSON_E_DENIED,"Requires 'o' privileges.");
return NULL;
}
json_warn( FSL_JSON_W_UNKNOWN, "Achtung: the output of the finfo command is up for change.");
zFilename = json_find_option_cstr2("name",NULL,NULL,
g.json.dispatchDepth+1);
if(!zFilename){
json_set_err(FSL_JSON_E_MISSING_ARGS, "Missing 'name' parameter.");
return NULL;
}
zBefore = json_find_option_cstr("before",NULL,"b");
zAfter = json_find_option_cstr("after",NULL,"a");
limit = json_find_option_int("limit",NULL,"n", -1);
blob_appendf(&sql,
"SELECT b.uuid,"
" ci.uuid,"
" (SELECT uuid FROM blob WHERE rid=mlink.fid)," /* Current file uuid */
" cast(strftime('%%s',event.mtime) AS INTEGER),"
" coalesce(event.euser, event.user),"
" coalesce(event.ecomment, event.comment),"
#if 1
" (SELECT uuid FROM blob WHERE rid=mlink.pid)," /* Parent file uuid */
#endif
" event.bgcolor,"
" 1"
" FROM mlink, blob b, event, blob ci, filename"
" WHERE filename.name=%Q %s"
" AND mlink.fnid=filename.fnid"
" AND b.rid=mlink.fid"
" AND event.objid=mlink.mid"
" AND event.objid=ci.rid",
zFilename, filename_collation()
);
if( zAfter ){
blob_appendf(&sql, " AND event.mtime>=julianday('%q')", zAfter);
}else if( zBefore ){
blob_appendf(&sql, " AND event.mtime<=julianday('%q')", zBefore);
}
blob_appendf(&sql," ORDER BY event.mtime DESC /*sort*/");
db_prepare(&q, "%s", blob_str(&sql)/*extra %s to avoid double-expanding
SQL escapes*/);
blob_reset(&sql);
pay = cson_new_object();
cson_object_set(pay, "name", json_new_string(zFilename));
if( limit > 0 ){
cson_object_set(pay, "limit", json_new_int(limit));
}
checkins = cson_new_array();
cson_object_set(pay, "checkins", cson_array_value(checkins));
while( db_step(&q)==SQLITE_ROW ){
cson_object * row = cson_new_object();
cson_array_append( checkins, cson_object_value(row) );
cson_object_set(row, "checkin", json_new_string( db_column_text(&q,1) ));
cson_object_set(row, "artifact", json_new_string( db_column_text(&q,2) ));
/*cson_object_set(row, "parentArtifact", json_new_string( db_column_text(&q,6) ));*/
cson_object_set(row, "mtime", json_new_int( db_column_int(&q,3) ));
cson_object_set(row, "user", json_new_string( db_column_text(&q,4) ));
cson_object_set(row, "comment", json_new_string( db_column_text(&q,5) ));
/*cson_object_set(row, "bgColor", json_new_string( db_column_text(&q,7) ));*/
if( (0 < limit) && (++currentRow >= limit) ){
break;
}
}
db_finalize(&q);
return cson_object_value(pay);
}
#endif /* FOSSIL_ENABLE_JSON */