Beispiel #1
0
/* Allocate 'active' entry */
int replace_active_entry(PGconn *conn,
			 unsigned int batch_number,
			 unsigned int paper_index,
			 const char *electorate_name,
			 unsigned int paper_id, 
			 unsigned int active_entry_ix, /* 1 or 2 */
			 unsigned int entry_ix) {

	int num_rows_updated;
	char *entry_field_name = sprintf_malloc("entry_id%u",active_entry_ix);
	char *paper_table_name = sprintf_malloc("%s_paper",electorate_name);

	num_rows_updated = SQL_command(conn,
				       "UPDATE %s SET %s=%u WHERE id=%u;",
				       paper_table_name, 
				       entry_field_name,
				       entry_ix,
				       paper_id);

	assert (num_rows_updated == 1);
	/* record change in batch history after initial 2 entries */
	if (entry_ix > 2 ) 
		log_batch_operation(conn, batch_number,(enum batch_op) ACTIVE,
				    paper_index, entry_ix);
	free(entry_field_name);
	free(paper_table_name);
	
	return num_rows_updated;
}
Beispiel #2
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);
}
Beispiel #3
0
void save_paper(struct paper *newpaper, unsigned int batch_number)
{
    PGconn *conn = connect_db_host(DATABASE_NAME, SERVER_ADDRESS);

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

    PQfinish(conn);
}
Beispiel #4
0
void log_batch_operation(PGconn *conn, unsigned int batch_number, 
			 enum batch_op opcode,
			 int data1, int data2)
{
	char *operator_id = get_operator_id();
	char *timestamp = generate_sortable_timestamp();

	SQL_command(conn,
		"INSERT INTO batch_history"
		"(batch_number,operator_id, time_stamp, op_code,data1,data2) "
		"values(%u, '%s', '%s', %u, %u, %u);",
	 batch_number, operator_id, timestamp, opcode, data1, data2);

	free(operator_id);
	free(timestamp);

}
Beispiel #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);
}
Beispiel #6
0
void append_entry(PGconn *conn,struct entry *newentry,
                  unsigned int batch_number,unsigned int paper_index,
                  unsigned int paper_version)
/*
  Insert the entry into the database.
*/
{
    char *table_name,*oi;
    int electorate_code;
    int paper_id,entry_index=1,i;

    /* get electorate code */
    electorate_code = SQL_singleton_int(conn,
                                        "SELECT electorate_code "
                                        "FROM batch "
                                        "WHERE number = %u;",
                                        batch_number);
    if (electorate_code < 0)
        bailout("append_entry could not find batch number %u.\n",
                batch_number);

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

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

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

    /* Insert new paper if necessary */
    if (paper_id < 0) {
        SQL_command(conn,
                    "INSERT INTO "
                    "paper(batch_number,index) "
                    "VALUES(%u,%u);",batch_number,paper_index);
        entry_index = 1;
        paper_id = get_seq_currval(conn,"paper_id_seq");

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

    }

    /* Insert new entry */
    SQL_command(conn,
                "INSERT INTO entry(index,operator_id,"
                "paper_id,num_preferences,paper_version) "
                "VALUES(%u,'%s',%u,%u,%u);",
                entry_index,oi=eq_malloc(newentry->e.operator_id),
                paper_id,newentry->e.num_preferences,paper_version);
    free(oi);
    /* Insert the preferences */
    for (i=0; i<newentry->e.num_preferences; i++) {
        SQL_command(conn,
                    "INSERT INTO %s "
                    "VALUES(CURRVAL('entry_id_seq'),%u,%u,%u);",
                    table_name,
                    newentry->preferences[i].group_index,
                    newentry->preferences[i].db_candidate_index,
                    newentry->preferences[i].prefnum);
    }
    /* Complete the transaction */
    commit(conn);
}