liquid_feedback_core

changeset 359:c37c0b4f2027

Write "final_suggestion_order_calculated" flag in "lf_update_suggestion_order"
author jbe
date Sun Mar 17 11:18:24 2013 +0100 (2013-03-17)
parents e22a4d2aea2d
children 47965760b1b8
files lf_update_suggestion_order.c
line diff
     1.1 --- a/lf_update_suggestion_order.c	Sun Mar 17 10:40:00 2013 +0100
     1.2 +++ b/lf_update_suggestion_order.c	Sun Mar 17 11:18:24 2013 +0100
     1.3 @@ -143,13 +143,20 @@
     1.4    abort();
     1.5  }
     1.6  
     1.7 -static int write_ranks(PGconn *db, char *escaped_initiative_id) {
     1.8 +static int write_ranks(PGconn *db, char *escaped_initiative_id, int final) {
     1.9    PGresult *res;
    1.10    char *cmd;
    1.11    int i;
    1.12 -  if (asprintf(&cmd, "BEGIN; UPDATE \"suggestion\" SET \"proportional_order\" = NULL WHERE \"initiative_id\" = %s", escaped_initiative_id) < 0) {
    1.13 -    fprintf(stderr, "Could not prepare query string in memory.\n");
    1.14 -    abort();
    1.15 +  if (final) {
    1.16 +    if (asprintf(&cmd, "BEGIN; UPDATE \"initiative\" SET \"final_suggestion_order_calculated\" = TRUE WHERE \"id\" = %s; UPDATE \"suggestion\" SET \"proportional_order\" = NULL WHERE \"initiative_id\" = %s", escaped_initiative_id, escaped_initiative_id) < 0) {
    1.17 +      fprintf(stderr, "Could not prepare query string in memory.\n");
    1.18 +      abort();
    1.19 +    }
    1.20 +  } else {
    1.21 +    if (asprintf(&cmd, "BEGIN; UPDATE \"suggestion\" SET \"proportional_order\" = NULL WHERE \"initiative_id\" = %s", escaped_initiative_id) < 0) {
    1.22 +      fprintf(stderr, "Could not prepare query string in memory.\n");
    1.23 +      abort();
    1.24 +    }
    1.25    }
    1.26    res = PQexec(db, cmd);
    1.27    free(cmd);
    1.28 @@ -213,7 +220,7 @@
    1.29    }
    1.30  }
    1.31  
    1.32 -static int process_initiative(PGconn *db, PGresult *res, char *escaped_initiative_id) {
    1.33 +static int process_initiative(PGconn *db, PGresult *res, char *escaped_initiative_id, int final) {
    1.34    int err;
    1.35    int ballot_count = 0;
    1.36    struct ballot *ballots;
    1.37 @@ -224,8 +231,19 @@
    1.38      char *old_member_id = NULL;
    1.39      struct ballot *ballot;
    1.40      int candidates_in_sections[4] = {0, };
    1.41 +    tuple_count = PQntuples(res);
    1.42 +    if (!tuple_count) {
    1.43 +      if (final) {
    1.44 +        printf("No suggestions found, but marking initiative as finally calculated.\n");
    1.45 +        err = write_ranks(db, escaped_initiative_id, final);
    1.46 +        printf("Done.\n");
    1.47 +        return err;
    1.48 +      } else {
    1.49 +        printf("Nothing to do.\n");
    1.50 +        return 0;
    1.51 +      }
    1.52 +    }
    1.53      candidate_count = 0;
    1.54 -    tuple_count = PQntuples(res);
    1.55      for (i=0; i<=tuple_count; i++) {
    1.56        char *member_id, *suggestion_id;
    1.57        if (i<tuple_count) {
    1.58 @@ -336,7 +354,7 @@
    1.59    free(ballots);
    1.60  
    1.61    printf("Writing ranks to database.\n");
    1.62 -  err = write_ranks(db, escaped_initiative_id);
    1.63 +  err = write_ranks(db, escaped_initiative_id, final);
    1.64    printf("Done.\n");
    1.65  
    1.66    free(candidates);
    1.67 @@ -403,14 +421,20 @@
    1.68      fprintf(stderr, "Error while executing SQL command selecting initiatives to process:\n%s", PQresultErrorMessage(res));
    1.69      err = 1;
    1.70      PQclear(res);
    1.71 +  } else if (PQnfields(res) < 2) {
    1.72 +    fprintf(stderr, "Too few columns returned by SQL command selecting initiatives to process.\n");
    1.73 +    err = 1;
    1.74 +    PQclear(res);
    1.75    } else {
    1.76      count = PQntuples(res);
    1.77      printf("Number of initiatives to process: %i\n", count);
    1.78      for (i=0; i<count; i++) {
    1.79        char *initiative_id, *escaped_initiative_id;
    1.80 +      int final;
    1.81        char *cmd;
    1.82        PGresult *res2;
    1.83        initiative_id = PQgetvalue(res, i, 0);
    1.84 +      final = (PQgetvalue(res, i, 1)[0] == 't') ? 1 : 0;
    1.85        printf("Processing initiative_id: %s\n", initiative_id);
    1.86        escaped_initiative_id = escapeLiteral(db, initiative_id, strlen(initiative_id));
    1.87        if (!escaped_initiative_id) {
    1.88 @@ -435,11 +459,7 @@
    1.89          err = 1;
    1.90          PQclear(res2);
    1.91        } else {
    1.92 -        if (PQntuples(res2) == 0) {
    1.93 -          printf("Nothing to do.\n");
    1.94 -        } else {
    1.95 -          if (process_initiative(db, res2, escaped_initiative_id)) err = 1;
    1.96 -        }
    1.97 +        if (process_initiative(db, res2, escaped_initiative_id, final)) err = 1;
    1.98          PQclear(res2);
    1.99        }
   1.100        freemem(escaped_initiative_id);

Impressum / About Us