Esempio n. 1
0
void save_paper(struct paper *newpaper, 
		unsigned int batch_number)
{
        PGconn *conn = connect_db_host(DATABASE_NAME, SERVER_ADDRESS);
	struct predefined_batch *batch;
	char *electorate_name, *paper_table_name;
	unsigned int electorate_code;

	/* get electorate code */
	batch = resolve_batch_source(conn, batch_number);
	electorate_code = batch->electorate_code;

	/* get electorate name in order to access that Electorates
	   paper table*/
	electorate_name = resolve_electorate_name(conn,electorate_code);
	paper_table_name = sprintf_malloc("%s_paper",electorate_name);

	SQL_command(conn, 
		    "INSERT into %s(batch_number,index,supervisor_tick) "
		    "values(%u, %u, 'f');",
		    paper_table_name,
		    batch_number, 
		    newpaper->p.index);

	free(electorate_name);
	free(paper_table_name);
	free(batch);

	PQfinish(conn);
}
Esempio n. 2
0
/* DDS3.6: Get Entered Papers 
   from v2B */
struct batch *get_entered_batch(PGconn *conn, 
				unsigned int batch_number)
     /*
       Return all preferences for the given batch number
     */

{
	PGresult *result;
	struct batch *head=NULL, *tmp=NULL;
	struct predefined_batch *batch;
	char *electorate_name;
	unsigned int num_papers,electorate_code;

	/* get electorate code */
	batch = resolve_batch_source(conn, batch_number);
	electorate_code = batch->electorate_code;

	/* get electorate name in order to access that Electorates
	   preference table */
	electorate_name = resolve_electorate_name(conn,electorate_code);

	num_papers = (unsigned int )SQL_singleton_int(conn,
				      "SELECT COUNT(*) "
				      "FROM %s_paper "
				      "WHERE batch_number = %u;",
				      electorate_name, batch_number);

	/* build the batch structure */
	tmp = malloc(sizeof(*tmp) + (sizeof(tmp->papers[0]) * num_papers));

	tmp->b.batch_number = batch_number;

	result = SQL_query(conn,
			   "SELECT size, committed "
			   "FROM batch "
			   "WHERE number = %u;", batch_number);

	tmp->b.batch_size = atoi(PQgetvalue(result, 0, 0));
	tmp->b.num_papers = num_papers;

	if (*PQgetvalue(result,0,1) == 't')
		tmp->b.committed = true;
	else
		tmp->b.committed = false;

        /* papers and sub-structures inserted into tmp */
	if (num_papers > 0)
	        get_papers_for_batch(conn, tmp, electorate_name);

	tmp->next = NULL;
	head = tmp;

	
	PQclear(result);
	free(electorate_name);
        return head;
}
Esempio n. 3
0
/* DDSv2C: Get Paper  */
struct paper *get_paper(PGconn *conn, 
			unsigned int batch_number, 
			unsigned int paper_index)

{
	struct paper *ret;
	unsigned int paper_id, electorate_code;
	char *electorate_name, *paper_table_name;
	struct predefined_batch *batch;

	/* get electorate code */
	batch = resolve_batch_source(conn, batch_number);
	assert(batch);
	electorate_code = batch->electorate_code;

	/* get electorate name in order to access that Electorates
	   paper and entry tables */
	electorate_name = resolve_electorate_name(conn,electorate_code);
	paper_table_name = sprintf_malloc("%s_paper",electorate_name);
	
	
	/* find the (internal database) paper_id */
	paper_id = SQL_singleton_int(conn,
				     "SELECT id "
				     "FROM %s "
				     "WHERE batch_number = %u "
				     "AND index = %u;",
				     paper_table_name, 
				     batch_number, paper_index);

	ret = malloc(sizeof(*ret));

	if (paper_id ==(unsigned int) -1) {
	  /* new paper  */
	    ret->p.index = paper_index;
	    ret->p.supervisor_tick = false;
	    ret->entries = NULL;
	} else {
	        ret = malloc(sizeof(*ret));
	        ret->entries = get_entries_for_paper(conn, paper_id,
						     electorate_name);
	}

	free(electorate_name);
	free(paper_table_name);
	free(batch);
	
	return ret;
}
Esempio n. 4
0
File: batch.c Progetto: patcon/eVACS
/* DDSv2C: Get Paper  */
struct paper *get_paper(unsigned int batch_number, unsigned int paper_index)

{
    PGconn *conn = connect_db_host(DATABASE_NAME, SERVER_ADDRESS);
    struct paper *ret;
    unsigned int paper_id, electorate_code;
    char *electorate_table_name;
    struct predefined_batch *batch;

    /* get electorate code */
    batch = resolve_batch_source(conn, batch_number);
    electorate_code = batch->electorate_code;

    /* get electorate name in order to access that Electorates
       preference table */
    electorate_table_name = resolve_electorate_name(conn,electorate_code);


    /* find the (internal database) paper_id */
    paper_id = SQL_singleton_int(conn,
                                 "SELECT id "
                                 "FROM paper "
                                 "WHERE batch_number = %u "
                                 "AND index = %u;",
                                 batch_number, paper_index);

    ret = malloc(sizeof(*ret));

    if (paper_id ==(unsigned int) -1) {
        /* new paper  */
        ret->p.index = paper_index;
        ret->p.supervisor_tick = false;
        ret->entries = NULL;
    } else {
        ret = malloc(sizeof(*ret));
        ret->entries = get_entries_for_paper(conn, paper_id,
                                             electorate_table_name);
    }

    free(electorate_table_name);
    PQfinish(conn);

    return ret;
}
Esempio n. 5
0
void append_entry(PGconn *conn,
		  struct entry *newentry,
		  unsigned int batch_number,
		  unsigned int paper_index)
     /*
       Insert the entry into the database.
     */
{	
	char *electorate_name, *entry_table_name, *paper_table_name;
        int  paper_id=-1;
        int temp;
	unsigned int i,entry_index;
	/* SIPL 2011-09-26 Increase array size by one to allow
	   space for null at end, to cope with the case where there
	   really are PREFNUM_MAX preferences in the vote. */
	char pref_string[DIGITS_PER_PREF * PREFNUM_MAX + 1];
	char *pref_ptr, *p;
	struct predefined_batch *batch;

	/* get electorate code */
        batch =resolve_batch_source(conn, batch_number);
	electorate_name = resolve_electorate_name(conn, batch->electorate_code);
	if (batch->electorate_code < 0)
		bailout("append_entry could not find batch number %u.\n",
			batch_number);

	/* get electorate name in order to access that Electorates'
	   paper and entry tables */
	paper_table_name = sprintf_malloc("%s_paper",electorate_name);	
	entry_table_name = sprintf_malloc("%s_entry",electorate_name);

	/* Start the transaction */
	begin(conn);

	/* check paper exists */
	paper_id = SQL_singleton_int(conn,
				     "SELECT id "
				     "FROM %s_paper "
				     "WHERE batch_number = %u "
				     "AND index = %u; ",
				     electorate_name,
				     batch_number,paper_index);

	/* Insert new paper if necessary */
	if (paper_id < 0) {
	        SQL_command(conn,
			    "INSERT INTO "
			    "%s(batch_number,index) "
			    "VALUES(%u,%u);",
			    paper_table_name,batch_number,paper_index);
		entry_index = 1;
		paper_id = 
			SQL_singleton_int(conn,"SELECT CURRVAL('%s_id_seq');",
					  paper_table_name);

	}
	else {
	        /* Get last (archived) entry index for this paper */
	        entry_index = SQL_singleton_int(conn,
						"SELECT MAX(index) FROM %s "
						"WHERE paper_id = %d;",
						entry_table_name, paper_id);
		if (entry_index < 0)
		        entry_index = 1;   /* It must be the first one */
		else
		        entry_index++;

	}
	
        if (entry_index == 1) {

          /* Check for the case there this is actually entry_index=2, and
             where there is no entry_index=1.
          */

          temp = (unsigned int)
            SQL_singleton_int(conn,
                              "SELECT MAX(e.index) "
                              "FROM %s_entry e, %s_paper p "
                              "WHERE p.batch_number = %u "
                              "AND e.paper_id     = p.id "
                              "AND e.operator_id  = '%s';",
                              electorate_name, electorate_name,
                              batch_number,    get_operator_id());
          if (temp == 2) {
            /* This paper's belongs to entry index 2, not 1. */
            entry_index = 2;
          }
        }

	/* Format the preferences into a string */
	pref_string[0]='\0';
	pref_ptr = &pref_string[0];
	for (i=0;i<newentry->e.num_preferences;i++) {
		p = sprintf_malloc("%02u%02u%02u",
				   newentry->preferences[i].prefnum,
				   newentry->preferences[i].group_index,
				   newentry->preferences[i].db_candidate_index
				   );
		strcpy(pref_ptr,p);
		pref_ptr +=  (sizeof(char)*(DIGITS_PER_PREF));
		free(p);
	}	
        /* Insert new entry into archive */
	SQL_command(conn,
		    "INSERT INTO %s(index,operator_id,"
		    "paper_id,num_preferences,paper_version,preference_list) "
		    "VALUES(%u,'%s',%u,%u,%u,'%s');",
		    entry_table_name, entry_index,
		    newentry->e.operator_id,
		    paper_id,newentry->e.num_preferences,
		    newentry->e.paper_version_num,
		    &pref_string[0]);

	/* update active entries */
	update_active_entries(conn,
			      batch_number,
			      paper_index,
			      1, // arbitrary, could be 2
			     (const char *)  electorate_name);

	free(electorate_name);
	free(paper_table_name);
	free(entry_table_name);
	free(batch);
	/* Complete the transaction */
	commit(conn);
}