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