/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/*
Copyright (c) 2013 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/
*****************************************************************************
This file implements ticket-related parts of the library.
*/
#include "fossil-scm/fossil-internal.h"
#include <assert.h>
#include <string.h> /* memcmp() */
int fsl_cx_ticket_create_table(fsl_cx * f){
fsl_db * db = f ? fsl_needs_repo(f) : NULL;
int rc;
if(!f) return FSL_RC_MISUSE;
else if(!db) return FSL_RC_NOT_A_REPO;
rc = fsl_db_exec_multi(db,
"DROP TABLE IF EXISTS ticket;"
"DROP TABLE IF EXISTS ticketchng;"
);
if(!rc){
f->scratch.used = 0;
rc = fsl_cx_schema_ticket(f, &f->scratch);
if(!rc){
rc = fsl_db_exec_multi(db, "%b", &f->scratch);
}
f->scratch.used = 0;
}
if(rc && db->error.code && !f->error.code){
fsl_cx_uplift_db_error(f, db);
}
return rc;
}
static int fsl_tkt_field_id(fsl_list const * jli, const char *zFieldName){
int i;
fsl_card_J const * jc;
for(i=0; i<(int)jli->used; ++i){
jc = (fsl_card_J const *)jli->list[i];
if( !fsl_strcmp(zFieldName, jc->field) ) return i;
}
return -1;
}
int fsl_cx_ticket_load_fields(fsl_cx * f, char forceReload){
fsl_stmt q = fsl_stmt_empty;
int i, rc = 0;
fsl_list * li = &f->ticket.customFields;
fsl_card_J * jc;
fsl_db * db;
if(li->used){
if(!forceReload) return 0;
fsl_card_J_list_free(li, 0);
/* Fall through and reload ... */
}
if( !(db = fsl_needs_repo(f)) ){
return FSL_RC_NOT_A_REPO;
}
rc = fsl_db_prepare(db, &q, "PRAGMA table_info(ticket)");
if(!rc) while( FSL_RC_STEP_ROW==fsl_stmt_step(&q) ){
char const * zFieldName = fsl_stmt_g_text(&q, 1, NULL);
f->ticket.hasTicket = 1;
if( 0==memcmp(zFieldName,"tkt_", 4)){
if( 0==fsl_strcmp(zFieldName,"tkt_ctime")) f->ticket.hasCTime = 1;
continue;
}
jc = fsl_card_J_malloc(0, zFieldName, NULL);
if(!jc){
rc = FSL_RC_OOM;
break;
}
jc->flags = FSL_CARD_J_TICKET;
rc = fsl_list_append(li, jc);
if(rc){
fsl_card_J_free(jc);
break;
}
}
fsl_stmt_finalize(&q);
if(rc) goto end;
rc = fsl_db_prepare(db, &q, "PRAGMA table_info(ticketchng)");
if(!rc) while( FSL_RC_STEP_ROW==fsl_stmt_step(&q) ){
char const * zFieldName = fsl_stmt_g_text(&q, 1, NULL);
f->ticket.hasChng = 1;
if( 0==memcmp(zFieldName,"tkt_", 4)){
if( 0==fsl_strcmp(zFieldName,"tkt_rid")) f->ticket.hasChngRid = 1;
continue;
}
if( (i=fsl_tkt_field_id(li, zFieldName)) >= 0){
jc = (fsl_card_J*)li->list[i];
jc->flags |= FSL_CARD_J_CHNG;
continue;
}
jc = fsl_card_J_malloc(0, zFieldName, NULL);
if(!jc){
rc = FSL_RC_OOM;
break;
}
jc->flags = FSL_CARD_J_CHNG;
rc = fsl_list_append(li, jc);
if(rc){
fsl_card_J_free(jc);
break;
}
}
fsl_stmt_finalize(&q);
end:
if(!rc){
fsl_list_sort(li, fsl_qsort_cmp_J_cards);
}
return rc;
}