bool OutputQtDocument::writeCanonical() { m_cursor.insertBlock(); m_cursor.insertText(tr("Canonical form of problem is :")); m_cursor.insertBlock(); m_cursor.insertText(QString("F(%1) = ").arg(m_variableName.toUpper())); if(SimplexMethod::OptimizeToMax == m_params->funcType()) m_cursor.insertText("-("); bool firstFlag = true; for(size_t j=0; j < m_params->width(); j++) { if(m_params->variableType(j) == SimplexMethod::VariableArtificial) { putVariable(j, "W", true, firstFlag); } else putVariable(j, m_params->rowC(j), firstFlag); } if(SimplexMethod::OptimizeToMax == m_params->funcType()) m_cursor.insertText(") -> max"); else m_cursor.insertText(" -> min"); // limits for(size_t i=0; i < m_params->height(); i++) { m_cursor.insertBlock(); firstFlag = true; for(size_t j=0; j < m_params->width(); j++) { putVariable(j, m_params->matrixA(i, j), firstFlag); } switch(m_params->columnCompareOp(i)) { case SimplexMethod::Equal: m_cursor.insertText(" = "); break; case SimplexMethod::GreatEqual: m_cursor.insertText(" >= "); break; default: m_cursor.insertText(" <= "); break; } m_cursor.insertText(formatDouble(m_params->columnB(i))); } m_cursor.insertBlock(); m_cursor.insertText(m_variableName); m_cursor.insertText(" >= 0"); m_cursor.insertBlock(); return true; }
static void doCustom(CState * state, int n, int debug) { PGresult *res; CState *st = &state[n]; Command **commands; top: commands = sql_files[st->use_file]; if (st->listen) { /* are we receiver? */ if (commands[st->state]->type == SQL_COMMAND) { if (debug) fprintf(stderr, "client %d receiving\n", n); if (!PQconsumeInput(st->con)) { /* there's something wrong */ fprintf(stderr, "Client %d aborted in state %d. Probably the backend died while processing.\n", n, st->state); remains--; /* I've aborted */ PQfinish(st->con); st->con = NULL; return; } if (PQisBusy(st->con)) return; /* don't have the whole result yet */ } /* * transaction finished: record the time it took in the log */ if (use_log && commands[st->state + 1] == NULL) { double diff; struct timeval now; gettimeofday(&now, NULL); diff = (int) (now.tv_sec - st->txn_begin.tv_sec) * 1000000.0 + (int) (now.tv_usec - st->txn_begin.tv_usec); fprintf(LOGFILE, "%d %d %.0f\n", st->id, st->cnt, diff); } if (commands[st->state]->type == SQL_COMMAND) { res = PQgetResult(st->con); if (pg_strncasecmp(commands[st->state]->argv[0], "select", 6) != 0) { if (check(state, res, n, PGRES_COMMAND_OK)) return; } else { if (check(state, res, n, PGRES_TUPLES_OK)) return; } PQclear(res); discard_response(st); } if (commands[st->state + 1] == NULL) { if (is_connect) { PQfinish(st->con); st->con = NULL; } if (++st->cnt >= nxacts) { remains--; /* I've done */ if (st->con != NULL) { PQfinish(st->con); st->con = NULL; } return; } } /* increment state counter */ st->state++; if (commands[st->state] == NULL) { st->state = 0; st->use_file = getrand(0, num_files - 1); commands = sql_files[st->use_file]; } } if (st->con == NULL) { if ((st->con = doConnect()) == NULL) { fprintf(stderr, "Client %d aborted in establishing connection.\n", n); remains--; /* I've aborted */ PQfinish(st->con); st->con = NULL; return; } } if (use_log && st->state == 0) gettimeofday(&(st->txn_begin), NULL); if (commands[st->state]->type == SQL_COMMAND) { char *sql; if ((sql = strdup(commands[st->state]->argv[0])) == NULL || (sql = assignVariables(st, sql)) == NULL) { fprintf(stderr, "out of memory\n"); st->ecnt++; return; } if (debug) fprintf(stderr, "client %d sending %s\n", n, sql); if (PQsendQuery(st->con, sql) == 0) { if (debug) fprintf(stderr, "PQsendQuery(%s)failed\n", sql); st->ecnt++; } else { st->listen = 1; /* flags that should be listened */ } free(sql); } else if (commands[st->state]->type == META_COMMAND) { int argc = commands[st->state]->argc, i; char **argv = commands[st->state]->argv; if (debug) { fprintf(stderr, "client %d executing \\%s", n, argv[0]); for (i = 1; i < argc; i++) fprintf(stderr, " %s", argv[i]); fprintf(stderr, "\n"); } if (pg_strcasecmp(argv[0], "setrandom") == 0) { char *var; int min, max; char res[64]; if (*argv[2] == ':') { if ((var = getVariable(st, argv[2] + 1)) == NULL) { fprintf(stderr, "%s: undefined variable %s\n", argv[0], argv[2]); st->ecnt++; return; } min = atoi(var); } else min = atoi(argv[2]); #ifdef NOT_USED if (min < 0) { fprintf(stderr, "%s: invalid minimum number %d\n", argv[0], min); st->ecnt++; return; } #endif if (*argv[3] == ':') { if ((var = getVariable(st, argv[3] + 1)) == NULL) { fprintf(stderr, "%s: undefined variable %s\n", argv[0], argv[3]); st->ecnt++; return; } max = atoi(var); } else max = atoi(argv[3]); if (max < min || max > MAX_RANDOM_VALUE) { fprintf(stderr, "%s: invalid maximum number %d\n", argv[0], max); st->ecnt++; return; } #ifdef DEBUG printf("min: %d max: %d random: %d\n", min, max, getrand(min, max)); #endif snprintf(res, sizeof(res), "%d", getrand(min, max)); if (putVariable(st, argv[1], res) == false) { fprintf(stderr, "%s: out of memory\n", argv[0]); st->ecnt++; return; } st->listen = 1; } else if (pg_strcasecmp(argv[0], "set") == 0) { char *var; int ope1, ope2; char res[64]; if (*argv[2] == ':') { if ((var = getVariable(st, argv[2] + 1)) == NULL) { fprintf(stderr, "%s: undefined variable %s\n", argv[0], argv[2]); st->ecnt++; return; } ope1 = atoi(var); } else ope1 = atoi(argv[2]); if (argc < 5) snprintf(res, sizeof(res), "%d", ope1); else { if (*argv[4] == ':') { if ((var = getVariable(st, argv[4] + 1)) == NULL) { fprintf(stderr, "%s: undefined variable %s\n", argv[0], argv[4]); st->ecnt++; return; } ope2 = atoi(var); } else ope2 = atoi(argv[4]); if (strcmp(argv[3], "+") == 0) snprintf(res, sizeof(res), "%d", ope1 + ope2); else if (strcmp(argv[3], "-") == 0) snprintf(res, sizeof(res), "%d", ope1 - ope2); else if (strcmp(argv[3], "*") == 0) snprintf(res, sizeof(res), "%d", ope1 * ope2); else if (strcmp(argv[3], "/") == 0) { if (ope2 == 0) { fprintf(stderr, "%s: division by zero\n", argv[0]); st->ecnt++; return; } snprintf(res, sizeof(res), "%d", ope1 / ope2); } else { fprintf(stderr, "%s: unsupported operator %s\n", argv[0], argv[3]); st->ecnt++; return; } } if (putVariable(st, argv[1], res) == false) { fprintf(stderr, "%s: out of memory\n", argv[0]); st->ecnt++; return; } st->listen = 1; } goto top; } }
int main(int argc, char **argv) { int c; int is_init_mode = 0; /* initialize mode? */ int is_no_vacuum = 0; /* no vacuum at all before testing? */ int is_full_vacuum = 0; /* do full vacuum before testing? */ int debug = 0; /* debug flag */ int ttype = 0; /* transaction type. 0: TPC-B, 1: SELECT only, * 2: skip update of branches and tellers */ char *filename = NULL; CState *state; /* status of clients */ struct timeval tv1; /* start up time */ struct timeval tv2; /* after establishing all connections to the * backend */ struct timeval tv3; /* end time */ int i; fd_set input_mask; int nsocks; /* return from select(2) */ int maxsock; /* max socket number to be waited */ #ifdef HAVE_GETRLIMIT struct rlimit rlim; #endif PGconn *con; PGresult *res; char *env; char val[64]; if ((env = getenv("PGHOST")) != NULL && *env != '\0') pghost = env; if ((env = getenv("PGPORT")) != NULL && *env != '\0') pgport = env; else if ((env = getenv("PGUSER")) != NULL && *env != '\0') login = env; state = (CState *) malloc(sizeof(CState)); if (state == NULL) { fprintf(stderr, "Couldn't allocate memory for state\n"); exit(1); } memset(state, 0, sizeof(*state)); while ((c = getopt(argc, argv, "ih:nvp:dc:t:s:U:P:CNSlf:D:")) != -1) { switch (c) { case 'i': is_init_mode++; break; case 'h': pghost = optarg; break; case 'n': is_no_vacuum++; break; case 'v': is_full_vacuum++; break; case 'p': pgport = optarg; break; case 'd': debug++; break; case 'S': ttype = 1; break; case 'N': ttype = 2; break; case 'c': nclients = atoi(optarg); if (nclients <= 0 || nclients > MAXCLIENTS) { fprintf(stderr, "invalid number of clients: %d\n", nclients); exit(1); } #ifdef HAVE_GETRLIMIT #ifdef RLIMIT_NOFILE /* most platforms use RLIMIT_NOFILE */ if (getrlimit(RLIMIT_NOFILE, &rlim) == -1) #else /* but BSD doesn't ... */ if (getrlimit(RLIMIT_OFILE, &rlim) == -1) #endif /* RLIMIT_NOFILE */ { fprintf(stderr, "getrlimit failed: %s\n", strerror(errno)); exit(1); } if (rlim.rlim_cur <= (nclients + 2)) { fprintf(stderr, "You need at least %d open files but you are only allowed to use %ld.\n", nclients + 2, (long) rlim.rlim_cur); fprintf(stderr, "Use limit/ulimit to increase the limit before using pgbench.\n"); exit(1); } #endif /* HAVE_GETRLIMIT */ break; case 'C': is_connect = 1; break; case 's': scale = atoi(optarg); if (scale <= 0) { fprintf(stderr, "invalid scaling factor: %d\n", scale); exit(1); } break; case 't': nxacts = atoi(optarg); if (nxacts <= 0) { fprintf(stderr, "invalid number of transactions: %d\n", nxacts); exit(1); } break; case 'U': login = optarg; break; case 'P': pwd = optarg; break; case 'l': use_log = true; break; case 'f': ttype = 3; filename = optarg; if (process_file(filename) == false || *sql_files[num_files - 1] == NULL) exit(1); break; case 'D': { char *p; if ((p = strchr(optarg, '=')) == NULL || p == optarg || *(p + 1) == '\0') { fprintf(stderr, "invalid variable definition: %s\n", optarg); exit(1); } *p++ = '\0'; if (putVariable(&state[0], optarg, p) == false) { fprintf(stderr, "Couldn't allocate memory for variable\n"); exit(1); } } break; default: usage(); exit(1); break; } } if (argc > optind) dbName = argv[optind]; else { if ((env = getenv("PGDATABASE")) != NULL && *env != '\0') dbName = env; else if (login != NULL && *login != '\0') dbName = login; else dbName = ""; } if (is_init_mode) { init(); exit(0); } remains = nclients; if (getVariable(&state[0], "scale") == NULL) { snprintf(val, sizeof(val), "%d", scale); if (putVariable(&state[0], "scale", val) == false) { fprintf(stderr, "Couldn't allocate memory for variable\n"); exit(1); } } if (nclients > 1) { state = (CState *) realloc(state, sizeof(CState) * nclients); if (state == NULL) { fprintf(stderr, "Couldn't allocate memory for state\n"); exit(1); } memset(state + 1, 0, sizeof(*state) * (nclients - 1)); snprintf(val, sizeof(val), "%d", scale); for (i = 1; i < nclients; i++) { int j; for (j = 0; j < state[0].nvariables; j++) { if (putVariable(&state[i], state[0].variables[j].name, state[0].variables[j].value) == false) { fprintf(stderr, "Couldn't allocate memory for variable\n"); exit(1); } } if (putVariable(&state[i], "scale", val) == false) { fprintf(stderr, "Couldn't allocate memory for variable\n"); exit(1); } } } if (use_log) { char logpath[64]; snprintf(logpath, 64, "pgbench_log.%d", getpid()); LOGFILE = fopen(logpath, "w"); if (LOGFILE == NULL) { fprintf(stderr, "Couldn't open logfile \"%s\": %s", logpath, strerror(errno)); exit(1); } } if (debug) { printf("pghost: %s pgport: %s nclients: %d nxacts: %d dbName: %s\n", pghost, pgport, nclients, nxacts, dbName); } /* opening connection... */ con = doConnect(); if (con == NULL) exit(1); if (PQstatus(con) == CONNECTION_BAD) { fprintf(stderr, "Connection to database '%s' failed.\n", dbName); fprintf(stderr, "%s", PQerrorMessage(con)); exit(1); } if (ttype != 3) { /* * get the scaling factor that should be same as count(*) from * branches if this is not a custom query */ res = PQexec(con, "select count(*) from branches"); if (PQresultStatus(res) != PGRES_TUPLES_OK) { fprintf(stderr, "%s", PQerrorMessage(con)); exit(1); } scale = atoi(PQgetvalue(res, 0, 0)); if (scale < 0) { fprintf(stderr, "count(*) from branches invalid (%d)\n", scale); exit(1); } PQclear(res); snprintf(val, sizeof(val), "%d", scale); if (putVariable(&state[0], "scale", val) == false) { fprintf(stderr, "Couldn't allocate memory for variable\n"); exit(1); } if (nclients > 1) { for (i = 1; i < nclients; i++) { if (putVariable(&state[i], "scale", val) == false) { fprintf(stderr, "Couldn't allocate memory for variable\n"); exit(1); } } } } if (!is_no_vacuum) { fprintf(stderr, "starting vacuum..."); res = PQexec(con, "vacuum branches"); if (PQresultStatus(res) != PGRES_COMMAND_OK) { fprintf(stderr, "%s", PQerrorMessage(con)); exit(1); } PQclear(res); res = PQexec(con, "vacuum tellers"); if (PQresultStatus(res) != PGRES_COMMAND_OK) { fprintf(stderr, "%s", PQerrorMessage(con)); exit(1); } PQclear(res); res = PQexec(con, "delete from history"); if (PQresultStatus(res) != PGRES_COMMAND_OK) { fprintf(stderr, "%s", PQerrorMessage(con)); exit(1); } PQclear(res); res = PQexec(con, "vacuum history"); if (PQresultStatus(res) != PGRES_COMMAND_OK) { fprintf(stderr, "%s", PQerrorMessage(con)); exit(1); } PQclear(res); fprintf(stderr, "end.\n"); if (is_full_vacuum) { fprintf(stderr, "starting full vacuum..."); res = PQexec(con, "vacuum analyze accounts"); if (PQresultStatus(res) != PGRES_COMMAND_OK) { fprintf(stderr, "%s", PQerrorMessage(con)); exit(1); } PQclear(res); fprintf(stderr, "end.\n"); } } PQfinish(con); /* set random seed */ gettimeofday(&tv1, NULL); srandom((unsigned int) tv1.tv_usec); /* get start up time */ gettimeofday(&tv1, NULL); if (is_connect == 0) { /* make connections to the database */ for (i = 0; i < nclients; i++) { state[i].id = i; if ((state[i].con = doConnect()) == NULL) exit(1); } } /* time after connections set up */ gettimeofday(&tv2, NULL); /* process bultin SQL scripts */ switch (ttype) { case 0: sql_files[0] = process_builtin(tpc_b); num_files = 1; break; case 1: sql_files[0] = process_builtin(select_only); num_files = 1; break; case 2: sql_files[0] = process_builtin(simple_update); num_files = 1; break; default: break; } /* send start up queries in async manner */ for (i = 0; i < nclients; i++) { Command **commands = sql_files[state[i].use_file]; int prev_ecnt = state[i].ecnt; state[i].use_file = getrand(0, num_files - 1); doCustom(state, i, debug); if (state[i].ecnt > prev_ecnt && commands[state[i].state]->type == META_COMMAND) { fprintf(stderr, "Client %d aborted in state %d. Execution meta-command failed.\n", i, state[i].state); remains--; /* I've aborted */ PQfinish(state[i].con); state[i].con = NULL; } } for (;;) { if (remains <= 0) { /* all done ? */ disconnect_all(state); /* get end time */ gettimeofday(&tv3, NULL); printResults(ttype, state, &tv1, &tv2, &tv3); if (LOGFILE) fclose(LOGFILE); exit(0); } FD_ZERO(&input_mask); maxsock = -1; for (i = 0; i < nclients; i++) { Command **commands = sql_files[state[i].use_file]; if (state[i].con && commands[state[i].state]->type != META_COMMAND) { int sock = PQsocket(state[i].con); if (sock < 0) { disconnect_all(state); exit(1); } FD_SET(sock, &input_mask); if (maxsock < sock) maxsock = sock; } } if (maxsock != -1) { if ((nsocks = select(maxsock + 1, &input_mask, (fd_set *) NULL, (fd_set *) NULL, (struct timeval *) NULL)) < 0) { if (errno == EINTR) continue; /* must be something wrong */ disconnect_all(state); fprintf(stderr, "select failed: %s\n", strerror(errno)); exit(1); } else if (nsocks == 0) { /* timeout */ fprintf(stderr, "select timeout\n"); for (i = 0; i < nclients; i++) { fprintf(stderr, "client %d:state %d cnt %d ecnt %d listen %d\n", i, state[i].state, state[i].cnt, state[i].ecnt, state[i].listen); } exit(0); } } /* ok, backend returns reply */ for (i = 0; i < nclients; i++) { Command **commands = sql_files[state[i].use_file]; int prev_ecnt = state[i].ecnt; if (state[i].con && (FD_ISSET(PQsocket(state[i].con), &input_mask) || commands[state[i].state]->type == META_COMMAND)) { doCustom(state, i, debug); } if (state[i].ecnt > prev_ecnt && commands[state[i].state]->type == META_COMMAND) { fprintf(stderr, "Client %d aborted in state %d. Execution meta-command failed.\n", i, state[i].state); remains--; /* I've aborted */ PQfinish(state[i].con); state[i].con = NULL; } } } }