/* 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; }
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); }
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); }
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); }
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); }
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); }