本文整理汇总了C++中PQclear函数的典型用法代码示例。如果您正苦于以下问题:C++ PQclear函数的具体用法?C++ PQclear怎么用?C++ PQclear使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了PQclear函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: main
int main(void)
{
char hostname[STRSIZE], port[STRSIZE], dbname[STRSIZE], login[STRSIZE], password[STRSIZE], tablename[STRSIZE], query[STRSIZE*2];
int noffields, noftuples, i, j;
PGconn *conn;
PGresult *exres;
#ifdef WIN32
system("chcp 65001"); // Устанавливает кодовую страницу utf-8 (для вывода русских символов)
//setlocale(LC_ALL, ".65001");
#endif
EnterConnectionInfo(hostname, port, dbname, login, password);
conn = PQsetdbLogin(hostname, port, NULL, NULL, dbname, login, password);
if(PQstatus(conn) == CONNECTION_BAD) {
printf("connection error\n");
return 1;
}
printf("enter table name: ");
fgets(tablename, STRSIZE, stdin); tablename[STRSIZE-1] = 0;
if(strlen(tablename) > 0)
tablename[strlen(tablename)-1] = 0;
strcpy(query, "SELECT * FROM ");
strcat(query, tablename);
exres = PQexec(conn, query);
switch(PQresultStatus(exres)) {
case PGRES_TUPLES_OK:
break;
case PGRES_FATAL_ERROR:
printf("can\'t read table \'%s\'\n", tablename);
goto EXIT;
case PGRES_EMPTY_QUERY:
printf("Something goes wrong^_^\'\n");
goto EXIT;
case PGRES_COMMAND_OK:
printf("Table is empty\n");
goto EXIT;
}
//PGRES_TUPLES_OK
noffields = PQnfields(exres);
noftuples = PQntuples(exres);
printf("Table contains %d tuples(rows) with %d fields(columns)\n", noftuples, noffields);
// Рисуем заголовок
for(j = 0; j < noffields; j++)
printf("|%-18s|", PQfname(exres, j));
printf("\n");
for(j = 0; j < noffields; j++)
printf("|__________________|");
printf("\n");
// Рисуем остальную таблицу
for(i = 0; i < noftuples; i++) {
for(j = 0; j < noffields; j++) {
printf("|%-18s|", PQgetvalue(exres, i, j));
}
printf("\n");
}
EXIT:
PQclear(exres);
PQfinish(conn);
return 0;
}
示例2: gpdb_get_hostlist
//.........这里部分代码省略.........
CHECKMEM(hostinfo_holder->addressinfo_tail);
hostinfo_holder->addressinfo_tail = hostinfo_holder->addressinfo_tail->next;
// second is address
hostinfo_holder->addressinfo_tail->address = strdup(PQgetvalue(result, i, 1));
CHECKMEM(hostinfo_holder->addressinfo_tail->address);
// one for hostname one for address
hostinfo_holder->address_count = 2;
}
else
{
// permenant memory for address list -- stored for duration
hostinfo_holder->addressinfo_tail->next = calloc(1, sizeof(addressinfo_holder_t));
CHECKMEM(hostinfo_holder->addressinfo_tail);
hostinfo_holder->addressinfo_tail = hostinfo_holder->addressinfo_tail->next;
// permenant memory for address list -- stored for duration
hostinfo_holder->addressinfo_tail->address = strdup(PQgetvalue(result, i, 1));
CHECKMEM(hostinfo_holder->addressinfo_tail->address);
hostinfo_holder->address_count++;
}
}
// if we have any appliance specific hosts such as hadoop nodes add them to the hash table
if (get_appliance_hosts_and_add_to_hosts(pool, htab))
{
TR0(("Not an appliance: checking for SW Only hadoop hosts.\n"));
get_hadoop_hosts_and_add_to_hosts(pool, htab, opt); // Not an appliance, so check for SW only hadoop nodes.
}
unique_hosts = apr_hash_count(htab);
// allocate memory for host list (not freed ever)
hosts = calloc(unique_hosts, sizeof(host_t));
apr_hash_index_t* hi;
void* vptr;
int hostcounter = 0;
for (hi = apr_hash_first(0, htab); hi; hi = apr_hash_next(hi))
{
// sanity check
if (hostcounter >= unique_hosts)
{
gpmon_fatalx(FLINE, 0, "host counter exceeds unique hosts");
}
apr_hash_this(hi, 0, 0, &vptr);
hostinfo_holder = vptr;
hosts[hostcounter].hostname = strdup(hostinfo_holder->hostname);
hosts[hostcounter].data_dir = strdup(hostinfo_holder->datadir);
if (hostinfo_holder->smon_dir)
{
hosts[hostcounter].smon_bin_location = strdup(hostinfo_holder->smon_dir);
}
hosts[hostcounter].is_master = hostinfo_holder->is_master;
hosts[hostcounter].addressinfo_head = hostinfo_holder->addressinfo_head;
hosts[hostcounter].addressinfo_tail = hostinfo_holder->addressinfo_tail;
hosts[hostcounter].address_count = hostinfo_holder->address_count;
hosts[hostcounter].connection_hostname.current = hosts[hostcounter].addressinfo_head;
hosts[hostcounter].snmp_hostname.current = hosts[hostcounter].addressinfo_head;
if (hostinfo_holder->is_hdm)
hosts[hostcounter].is_hdm = 1;
if (hostinfo_holder->is_hdw)
hosts[hostcounter].is_hdw = 1;
if (hostinfo_holder->is_etl)
hosts[hostcounter].is_etl = 1;
if (hostinfo_holder->is_hbw)
hosts[hostcounter].is_hbw = 1;
if (hostinfo_holder->is_hdc)
hosts[hostcounter].is_hdc = 1;
apr_thread_mutex_create(&hosts[hostcounter].mutex, APR_THREAD_MUTEX_UNNESTED, global_pool); // use the global pool so the mutexes last beyond this function
hostcounter++;
}
*hostcnt = hostcounter;
}
apr_pool_destroy(pool);
PQclear(result);
PQfinish(conn);
if (!hosts || *hostcnt < 1)
{
gpmon_fatalx(FLINE, 0, "no valid hosts found");
}
*host_table = hosts;
}
示例3: definitions
/****************************************************
initBuckets
Initialize the bucket definition list
If an error occured, write the error to stdout
@param PGconn *pgConn Database connection object
@param int bucketpool_pk
@param cacheroot_t *pcroot license cache root
@return an array of bucket definitions (in eval order)
or 0 if error.
****************************************************/
FUNCTION pbucketdef_t initBuckets(PGconn *pgConn, int bucketpool_pk, cacheroot_t *pcroot)
{
char *fcnName = "initBuckets";
char sqlbuf[256];
char filepath[256];
char hostname[256];
PGresult *result;
pbucketdef_t bucketDefList = 0;
int numRows, rowNum;
int rv, numErrors=0;
struct stat statbuf;
/* reasonable input validation */
if ((!pgConn) || (!bucketpool_pk))
{
printf("ERROR: %s.%s.%d Invalid input pgConn: %lx, bucketpool_pk: %d.\n",
__FILE__, fcnName, __LINE__, (unsigned long)pgConn, bucketpool_pk);
return 0;
}
/* get bucket defs from db */
sprintf(sqlbuf, "select bucket_pk, bucket_type, bucket_regex, bucket_filename, stopon, bucket_name, applies_to from bucket_def where bucketpool_fk=%d order by bucket_evalorder asc", bucketpool_pk);
result = PQexec(pgConn, sqlbuf);
if (checkPQresult(pgConn, result, sqlbuf, fcnName, __LINE__)) return 0;
numRows = PQntuples(result);
if (numRows == 0) /* no bucket recs for pool? return error */
{
printf("ERROR: %s.%s.%d No bucket defs for pool %d.\n",
__FILE__, fcnName, __LINE__, bucketpool_pk);
PQclear(result);
return 0;
}
bucketDefList = calloc(numRows+1, sizeof(bucketdef_t));
if (bucketDefList == 0)
{
printf("ERROR: %s.%s.%d No memory to allocate %d bucket defs.\n",
__FILE__, fcnName, __LINE__, numRows);
return 0;
}
/* put each db bucket def into bucketDefList in eval order */
for (rowNum=0; rowNum<numRows; rowNum++)
{
bucketDefList[rowNum].bucket_pk = atoi(PQgetvalue(result, rowNum, 0));
bucketDefList[rowNum].bucket_type = atoi(PQgetvalue(result, rowNum, 1));
bucketDefList[rowNum].bucketpool_pk = bucketpool_pk;
/* compile regex if type 3 (REGEX) */
if (bucketDefList[rowNum].bucket_type == 3)
{
rv = regcomp(&bucketDefList[rowNum].compRegex, PQgetvalue(result, rowNum, 2),
REG_NOSUB | REG_ICASE | REG_EXTENDED);
if (rv != 0)
{
printf("ERROR: %s.%s.%d Invalid regular expression for bucketpool_pk: %d, bucket: %s\n",
__FILE__, fcnName, __LINE__, bucketpool_pk, PQgetvalue(result, rowNum, 5));
numErrors++;
}
bucketDefList[rowNum].regex = strdup(PQgetvalue(result, rowNum, 2));
}
bucketDefList[rowNum].dataFilename = strdup(PQgetvalue(result, rowNum, 3));
/* verify that external file dataFilename exists */
if (strlen(bucketDefList[rowNum].dataFilename) > 0)
{
snprintf(filepath, sizeof(filepath), "%s/bucketpools/%d/%s",
PROJECTSTATEDIR, bucketpool_pk, bucketDefList[rowNum].dataFilename);
if (stat(filepath, &statbuf) == -1)
{
hostname[0] = 0;
gethostname(hostname, sizeof(hostname));
printf("ERROR: %s.%s.%d File: %s is missing on host: %s. bucketpool_pk: %d, bucket: %s\n",
__FILE__, fcnName, __LINE__, filepath, hostname, bucketpool_pk, PQgetvalue(result, rowNum, 5));
numErrors++;
}
}
/* MATCH_EVERY */
if (bucketDefList[rowNum].bucket_type == 1)
bucketDefList[rowNum].match_every = getMatchEvery(pgConn, bucketpool_pk, bucketDefList[rowNum].dataFilename, pcroot);
/* MATCH_ONLY */
if (bucketDefList[rowNum].bucket_type == 2)
{
bucketDefList[rowNum].match_only = getMatchOnly(pgConn, bucketpool_pk, bucketDefList[rowNum].dataFilename, pcroot);
//.........这里部分代码省略.........
示例4: main
//.........这里部分代码省略.........
if (!pset.logfile)
{
fprintf(stderr, _("%s: could not open log file \"%s\": %s\n"),
pset.progname, options.logfilename, strerror(errno));
exit(EXIT_FAILURE);
}
}
if (!options.no_psqlrc)
process_psqlrc(argv[0]);
/*
* If any actions were given by user, process them in the order in which
* they were specified. Note single_txn is only effective in this mode.
*/
if (options.actions.head != NULL)
{
PGresult *res;
SimpleActionListCell *cell;
successResult = EXIT_SUCCESS; /* silence compiler */
if (options.single_txn)
{
if ((res = PSQLexec("BEGIN")) == NULL)
{
if (pset.on_error_stop)
{
successResult = EXIT_USER;
goto error;
}
}
else
PQclear(res);
}
for (cell = options.actions.head; cell; cell = cell->next)
{
if (cell->action == ACT_SINGLE_QUERY)
{
if (pset.echo == PSQL_ECHO_ALL)
puts(cell->val);
successResult = SendQuery(cell->val)
? EXIT_SUCCESS : EXIT_FAILURE;
}
else if (cell->action == ACT_SINGLE_SLASH)
{
PsqlScanState scan_state;
if (pset.echo == PSQL_ECHO_ALL)
puts(cell->val);
scan_state = psql_scan_create(&psqlscan_callbacks);
psql_scan_setup(scan_state,
cell->val, strlen(cell->val),
pset.encoding, standard_strings());
successResult = HandleSlashCmds(scan_state, NULL) != PSQL_CMD_ERROR
? EXIT_SUCCESS : EXIT_FAILURE;
psql_scan_destroy(scan_state);
}
else if (cell->action == ACT_FILE)
{
successResult = process_file(cell->val, false);
示例5: main
//.........这里部分代码省略.........
PQExpBufferData sql;
PGconn *conn;
PGresult *result;
progname = get_progname(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
handle_help_version_opts(argc, argv, "dropuser", help);
while ((c = getopt_long(argc, argv, "h:p:U:wWei", long_options, &optindex)) != -1)
{
switch (c)
{
case 'h':
host = pg_strdup(optarg);
break;
case 'p':
port = pg_strdup(optarg);
break;
case 'U':
username = pg_strdup(optarg);
break;
case 'w':
prompt_password = TRI_NO;
break;
case 'W':
prompt_password = TRI_YES;
break;
case 'e':
echo = true;
break;
case 'i':
interactive = true;
break;
case 0:
/* this covers the long options */
break;
default:
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1);
}
}
switch (argc - optind)
{
case 0:
break;
case 1:
dropuser = argv[optind];
break;
default:
fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"),
progname, argv[optind + 1]);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1);
}
if (dropuser == NULL)
{
if (interactive)
dropuser = simple_prompt("Enter name of role to drop: ", 128, true);
else
{
fprintf(stderr, _("%s: missing required argument role name\n"), progname);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1);
}
}
if (interactive)
{
printf(_("Role \"%s\" will be permanently removed.\n"), dropuser);
if (!yesno_prompt("Are you sure?"))
exit(0);
}
initPQExpBuffer(&sql);
appendPQExpBuffer(&sql, "DROP ROLE %s%s;",
(if_exists ? "IF EXISTS " : ""), fmtId(dropuser));
conn = connectDatabase("postgres", host, port, username, prompt_password,
progname, false, false);
if (echo)
printf("%s\n", sql.data);
result = PQexec(conn, sql.data);
if (PQresultStatus(result) != PGRES_COMMAND_OK)
{
fprintf(stderr, _("%s: removal of role \"%s\" failed: %s"),
progname, dropuser, PQerrorMessage(conn));
PQfinish(conn);
exit(1);
}
PQclear(result);
PQfinish(conn);
exit(0);
}
示例6: ows_storage_fill_attributes
/*
* Retrieve columns name and type of a table related a given layer
*/
static void ows_storage_fill_attributes(ows * o, ows_layer * l)
{
buffer *sql;
PGresult *res;
buffer *b, *t;
int i, end;
list_node *ln;
assert(o);
assert(l);
assert(l->storage);
sql = buffer_init();
buffer_add_str(sql, "SELECT a.attname AS field, t.typname AS type ");
buffer_add_str(sql, "FROM pg_class c, pg_attribute a, pg_type t, pg_namespace n WHERE n.nspname = '");
buffer_copy(sql, l->storage->schema);
buffer_add_str(sql, "' AND c.relname = '");
buffer_copy(sql, l->storage->table);
buffer_add_str(sql, "' AND c.relnamespace = n.oid AND a.attrelid = c.oid AND a.atttypid = t.oid");
if (l->include_items) {
buffer_add_str(sql, " AND a.attname IN (");
for (ln = l->include_items->first ; ln ; ln = ln->next) {
buffer_add_str(sql, "'");
buffer_copy(sql, ln->value);
buffer_add_str(sql, "', ");
}
if (l->include_items->first && l->storage->pkey) {
buffer_add_str(sql, "'");
buffer_copy(sql, l->storage->pkey );
buffer_add_str(sql, "',");
}
buffer_add_str(sql, " '');");
} else {
buffer_add_str(sql, " AND a.attnum > 0;");
}
res = ows_psql_exec(o, sql->buf);
buffer_free(sql);
if (PQresultStatus(res) != PGRES_TUPLES_OK) {
PQclear(res);
ows_error(o, OWS_ERROR_REQUEST_SQL_FAILED, "Unable to access pg_* tables.", "fill_attributes");
return;
}
for (i = 0, end = PQntuples(res); i < end; i++) {
b = buffer_init();
t = buffer_init();
buffer_add_str(b, PQgetvalue(res, i, 0));
buffer_add_str(t, PQgetvalue(res, i, 1));
/* If the column is a geometry, get its real geometry type */
if (buffer_cmp(t, "geometry")) {
PGresult *geom_res;
buffer *geom_sql = buffer_init();
buffer_add_str(geom_sql, "SELECT type from geometry_columns where f_table_schema='");
buffer_copy(geom_sql, l->storage->schema);
buffer_add_str(geom_sql,"' and f_table_name='");
buffer_copy(geom_sql, l->storage->table);
buffer_add_str(geom_sql,"' and f_geometry_column='");
buffer_copy(geom_sql, b);
buffer_add_str(geom_sql,"';");
geom_res = ows_psql_exec(o, geom_sql->buf);
buffer_free(geom_sql);
if (PQresultStatus(geom_res) != PGRES_TUPLES_OK || PQntuples(geom_res) == 0) {
PQclear(res);
PQclear(geom_res);
ows_error(o, OWS_ERROR_REQUEST_SQL_FAILED,
"Unable to access geometry_columns table, try Populate_Geometry_Columns()", "fill_attributes");
return;
}
buffer_empty(t);
buffer_add_str(t, PQgetvalue(geom_res, 0, 0));
PQclear(geom_res);
}
array_add(l->storage->attributes, b, t);
}
PQclear(res);
}
示例7: PQclear_app
void PQclear_app(finalizeonce *res) {
if (res->isfinalized)
return;
PQclear((PGresult *) (res->encapobj));
res->isfinalized = 1;
}
示例8: main
//.........这里部分代码省略.........
if (UseRepository)
{
/* Check Permissions */
if (GetUploadPerm(pgConn, atoi(Upload_Pk), user_pk) < PERM_WRITE)
{
LOG_ERROR("You have no update permissions on upload %s", Upload_Pk);
SafeExit(100);
}
COMMIT_HASH = fo_sysconfig(AgentName, "COMMIT_HASH");
VERSION = fo_sysconfig(AgentName, "VERSION");
sprintf(agent_rev, "%s.%s", VERSION, COMMIT_HASH);
/* Get the unpack agent key */
agent_pk = fo_GetAgentKey(pgConn, AgentName, atoi(Upload_Pk), agent_rev,agent_desc);
InitCmd();
/* Make sure ars table exists */
if (!fo_CreateARSTable(pgConn, AgentARSName)) SafeExit(0);
/* Has this user previously unpacked this upload_pk successfully?
* In this case we are done. No new ars record is needed since no
* processing is initiated.
* The unpack version is ignored.
*/
snprintf(SQL,MAXSQL,
"SELECT ars_pk from %s where upload_fk='%s' and ars_success=TRUE",
AgentARSName, Upload_Pk);
result = PQexec(pgConn, SQL);
if (fo_checkPQresult(pgConn, result, SQL, __FILE__, __LINE__)) SafeExit(101);
if (PQntuples(result) > 0) /* if there is a value */
{
PQclear(result);
LOG_WARNING("Upload_pk %s, has already been unpacked. No further action required",
Upload_Pk)
SafeExit(0);
}
PQclear(result);
/* write the unpack_ars start record */
ars_pk = fo_WriteARS(pgConn, ars_pk, atoi(Upload_Pk), agent_pk, AgentARSName, 0, 0);
/* Get Pfile path and Pfile_Pk, from Upload_Pk */
snprintf(SQL,MAXSQL,
"SELECT pfile.pfile_sha1 || '.' || pfile.pfile_md5 || '.' || pfile.pfile_size AS pfile, pfile_fk, pfile_size FROM upload INNER JOIN pfile ON upload.pfile_fk = pfile.pfile_pk WHERE upload.upload_pk = '%s'",
Upload_Pk);
result = PQexec(pgConn, SQL);
if (fo_checkPQresult(pgConn, result, SQL, __FILE__, __LINE__)) SafeExit(102);
if (PQntuples(result) > 0) /* if there is a value */
{
Pfile = strdup(PQgetvalue(result,0,0));
Pfile_Pk = strdup(PQgetvalue(result,0,1));
Pfile_size = atol(PQgetvalue(result, 0, 2));
if (Pfile_size == 0)
{
PQclear(result);
LOG_WARNING("Uploaded file (Upload_pk %s), is zero length. There is nothing to unpack.",
Upload_Pk)
SafeExit(0);
}
PQclear(result);
}
示例9: vacuumlo
/*
* This vacuums LOs of one database. It returns 0 on success, -1 on failure.
*/
int
vacuumlo(char *database, struct _param * param)
{
PGconn *conn;
PGresult *res,
*res2;
char buf[BUFSIZE];
int matched;
int deleted;
int i;
static char *password = NULL;
bool new_pass;
if (param->pg_prompt == TRI_YES && password == NULL)
password = simple_prompt("Password: ", 100, false);
/*
* Start the connection. Loop until we have a password if requested by
* backend.
*/
do
{
new_pass = false;
conn = PQsetdbLogin(param->pg_host,
param->pg_port,
NULL,
NULL,
database,
param->pg_user,
password);
if (!conn)
{
fprintf(stderr, "Connection to database \"%s\" failed\n",
database);
return -1;
}
if (PQstatus(conn) == CONNECTION_BAD &&
PQconnectionNeedsPassword(conn) &&
password == NULL &&
param->pg_prompt != TRI_NO)
{
PQfinish(conn);
password = simple_prompt("Password: ", 100, false);
new_pass = true;
}
} while (new_pass);
/* check to see that the backend connection was successfully made */
if (PQstatus(conn) == CONNECTION_BAD)
{
fprintf(stderr, "Connection to database \"%s\" failed:\n%s",
database, PQerrorMessage(conn));
PQfinish(conn);
return -1;
}
if (param->verbose)
{
fprintf(stdout, "Connected to %s\n", database);
if (param->dry_run)
fprintf(stdout, "Test run: no large objects will be removed!\n");
}
/*
* Don't get fooled by any non-system catalogs
*/
res = PQexec(conn, "SET search_path = pg_catalog");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "Failed to set search_path:\n");
fprintf(stderr, "%s", PQerrorMessage(conn));
PQclear(res);
PQfinish(conn);
return -1;
}
PQclear(res);
/*
* First we create and populate the LO temp table
*/
buf[0] = '\0';
strcat(buf, "CREATE TEMP TABLE vacuum_l AS ");
if (PQserverVersion(conn) >= 90000)
strcat(buf, "SELECT oid AS lo FROM pg_largeobject_metadata");
else
strcat(buf, "SELECT DISTINCT loid AS lo FROM pg_largeobject");
res = PQexec(conn, buf);
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "Failed to create temp table:\n");
fprintf(stderr, "%s", PQerrorMessage(conn));
PQclear(res);
PQfinish(conn);
return -1;
}
//.........这里部分代码省略.........
示例10: postgres_plugin_get
/**
* Iterate over the results for a particular key
* in the datastore.
*
* @param cls closure (our "struct Plugin")
* @param key
* @param type entries of which type are relevant?
* @param iter maybe NULL (to just count)
* @param iter_cls closure for iter
* @return the number of results found
*/
static unsigned int
postgres_plugin_get (void *cls, const struct GNUNET_HashCode * key,
enum GNUNET_BLOCK_Type type,
GNUNET_DATACACHE_Iterator iter, void *iter_cls)
{
struct Plugin *plugin = cls;
uint32_t btype = htonl (type);
const char *paramValues[] = {
(const char *) key,
(const char *) &btype,
};
int paramLengths[] = {
sizeof (struct GNUNET_HashCode),
sizeof (btype),
};
const int paramFormats[] = { 1, 1 };
struct GNUNET_TIME_Absolute expiration_time;
uint32_t size;
unsigned int cnt;
unsigned int i;
unsigned int path_len;
const struct GNUNET_PeerIdentity *path;
PGresult *res;
res =
PQexecPrepared (plugin->dbh, (type == 0) ? "getk" : "getkt",
(type == 0) ? 1 : 2, paramValues, paramLengths,
paramFormats, 1);
if (GNUNET_OK !=
GNUNET_POSTGRES_check_result (plugin->dbh, res, PGRES_TUPLES_OK, "PQexecPrepared",
(type == 0) ? "getk" : "getkt"))
{
LOG (GNUNET_ERROR_TYPE_DEBUG,
"Ending iteration (postgres error)\n");
return 0;
}
if (0 == (cnt = PQntuples (res)))
{
/* no result */
LOG (GNUNET_ERROR_TYPE_DEBUG,
"Ending iteration (no more results)\n");
PQclear (res);
return 0;
}
if (iter == NULL)
{
PQclear (res);
return cnt;
}
if ((4 != PQnfields (res)) || (sizeof (uint64_t) != PQfsize (res, 0)) ||
(sizeof (uint32_t) != PQfsize (res, 1)))
{
GNUNET_break (0);
PQclear (res);
return 0;
}
for (i = 0; i < cnt; i++)
{
expiration_time.abs_value =
GNUNET_ntohll (*(uint64_t *) PQgetvalue (res, i, 0));
type = ntohl (*(uint32_t *) PQgetvalue (res, i, 1));
size = PQgetlength (res, i, 2);
path_len = PQgetlength (res, i, 3);
if (0 != (path_len % sizeof (struct GNUNET_PeerIdentity)))
{
GNUNET_break (0);
path_len = 0;
}
path_len %= sizeof (struct GNUNET_PeerIdentity);
path = (const struct GNUNET_PeerIdentity *) PQgetvalue (res, i, 3);
LOG (GNUNET_ERROR_TYPE_DEBUG,
"Found result of size %u bytes and type %u in database\n",
(unsigned int) size, (unsigned int) type);
if (GNUNET_SYSERR ==
iter (iter_cls, key, size, PQgetvalue (res, i, 2),
(enum GNUNET_BLOCK_Type) type,
expiration_time,
path_len,
path))
{
LOG (GNUNET_ERROR_TYPE_DEBUG,
"Ending iteration (client error)\n");
PQclear (res);
return cnt;
}
}
PQclear (res);
//.........这里部分代码省略.........
示例11: init_connection
/**
* @brief Get a database handle
*
* @param plugin global context
* @return GNUNET_OK on success, GNUNET_SYSERR on error
*/
static int
init_connection (struct Plugin *plugin)
{
PGresult *ret;
plugin->dbh = GNUNET_POSTGRES_connect (plugin->env->cfg,
"datacache-postgres");
if (NULL == plugin->dbh)
return GNUNET_SYSERR;
ret =
PQexec (plugin->dbh,
"CREATE TEMPORARY TABLE gn090dc ("
" type INTEGER NOT NULL DEFAULT 0,"
" discard_time BIGINT NOT NULL DEFAULT 0,"
" key BYTEA NOT NULL DEFAULT '',"
" value BYTEA NOT NULL DEFAULT '',"
" path BYTEA DEFAULT '')"
"WITH OIDS");
if ( (ret == NULL) ||
((PQresultStatus (ret) != PGRES_COMMAND_OK) &&
(0 != strcmp ("42P07", /* duplicate table */
PQresultErrorField
(ret,
PG_DIAG_SQLSTATE)))))
{
(void) GNUNET_POSTGRES_check_result (plugin->dbh, ret,
PGRES_COMMAND_OK, "CREATE TABLE",
"gn090dc");
PQfinish (plugin->dbh);
plugin->dbh = NULL;
return GNUNET_SYSERR;
}
if (PQresultStatus (ret) == PGRES_COMMAND_OK)
{
if ((GNUNET_OK !=
GNUNET_POSTGRES_exec (plugin->dbh, "CREATE INDEX idx_key ON gn090dc (key)")) ||
(GNUNET_OK !=
GNUNET_POSTGRES_exec (plugin->dbh, "CREATE INDEX idx_dt ON gn090dc (discard_time)")))
{
PQclear (ret);
PQfinish (plugin->dbh);
plugin->dbh = NULL;
return GNUNET_SYSERR;
}
}
PQclear (ret);
ret =
PQexec (plugin->dbh,
"ALTER TABLE gn090dc ALTER value SET STORAGE EXTERNAL");
if (GNUNET_OK !=
GNUNET_POSTGRES_check_result (plugin->dbh, ret, PGRES_COMMAND_OK, "ALTER TABLE", "gn090dc"))
{
PQfinish (plugin->dbh);
plugin->dbh = NULL;
return GNUNET_SYSERR;
}
PQclear (ret);
ret = PQexec (plugin->dbh, "ALTER TABLE gn090dc ALTER key SET STORAGE PLAIN");
if (GNUNET_OK !=
GNUNET_POSTGRES_check_result (plugin->dbh, ret, PGRES_COMMAND_OK, "ALTER TABLE", "gn090dc"))
{
PQfinish (plugin->dbh);
plugin->dbh = NULL;
return GNUNET_SYSERR;
}
PQclear (ret);
if ((GNUNET_OK !=
GNUNET_POSTGRES_prepare (plugin->dbh, "getkt",
"SELECT discard_time,type,value,path FROM gn090dc "
"WHERE key=$1 AND type=$2 ", 2)) ||
(GNUNET_OK !=
GNUNET_POSTGRES_prepare (plugin->dbh, "getk",
"SELECT discard_time,type,value,path FROM gn090dc "
"WHERE key=$1", 1)) ||
(GNUNET_OK !=
GNUNET_POSTGRES_prepare (plugin->dbh, "getm",
"SELECT length(value),oid,key FROM gn090dc "
"ORDER BY discard_time ASC LIMIT 1", 0)) ||
(GNUNET_OK !=
GNUNET_POSTGRES_prepare (plugin->dbh, "delrow", "DELETE FROM gn090dc WHERE oid=$1", 1)) ||
(GNUNET_OK !=
GNUNET_POSTGRES_prepare (plugin->dbh, "put",
"INSERT INTO gn090dc (type, discard_time, key, value, path) "
"VALUES ($1, $2, $3, $4, $5)", 5)))
{
PQfinish (plugin->dbh);
plugin->dbh = NULL;
return GNUNET_SYSERR;
}
return GNUNET_OK;
}
示例12: SCIA_LV1_DEL_ENTRY
/*+++++++++++++++++++++++++ Main Program or Function +++++++++++++++*/
void SCIA_LV1_DEL_ENTRY( PGconn *conn, bool be_verbose, const char *flname )
{
register int nr;
unsigned int indx;
char sql_query[SQL_STR_SIZE];
char procStage[2];
char *cpntr, sciafl[SHORT_STRING_LENGTH];
int nrow, numChar;
PGresult *res, *res_update;
/*
* strip path of file-name
*/
if ( (cpntr = strrchr( flname, '/' )) != NULL ) {
(void) nadc_strlcpy( sciafl, ++cpntr, SHORT_STRING_LENGTH );
} else {
(void) nadc_strlcpy( sciafl, flname, SHORT_STRING_LENGTH );
}
/*
* check if we have to reverse field "softVersion[1]" in table "stateinfo"
*/
numChar = snprintf( sql_query, SQL_STR_SIZE, SELECT_FROM_STATEINFO,
sciafl );
if ( be_verbose )
(void) printf( "%s(): %s [%-d]\n", __func__, sql_query, numChar );
if ( numChar >= SQL_STR_SIZE )
NADC_RETURN_ERROR( NADC_ERR_STRLEN, "sql_query" );
res = PQexec( conn, sql_query );
if ( PQresultStatus( res ) != PGRES_TUPLES_OK ) {
NADC_RETURN_ERROR( NADC_ERR_SQL, PQresultErrorMessage(res) );
}
/* return when no entries are found */
if ( (nrow = PQntuples( res )) == 0 ) goto done;
/*
* update field "softVersion[1]" in table "stateinfo"
*/
(void) nadc_strlcpy( procStage, sciafl+10, 2 );
for ( nr = 0; nr < nrow; nr++ ) {
cpntr = PQgetvalue( res, nr, 0 );
indx = (unsigned int) strtoul( cpntr, (char **)NULL, 10 );
numChar = snprintf( sql_query, SQL_STR_SIZE,
UPDATE_STATEINFO, indx, procStage );
if ( be_verbose )
(void) printf( "%s(): %s [%-d]\n", __func__, sql_query, numChar );
if ( numChar >= SQL_STR_SIZE )
NADC_RETURN_ERROR( NADC_ERR_STRLEN, "sql_query" );
res_update = PQexec( conn, sql_query );
if ( PQresultStatus( res_update ) != PGRES_COMMAND_OK ) {
NADC_ERROR( NADC_ERR_SQL,
PQresultErrorMessage(res_update) );
PQclear( res_update );
goto done;
}
PQclear( res_update );
}
done:
PQclear( res );
/*
* remove entry from table "meta__1P"
* referenced entries in table "stateinfo_meta__0P" are removed by the engine
*/
numChar = snprintf( sql_query, SQL_STR_SIZE, DELETE_FROM_META, sciafl );
if ( be_verbose )
(void) printf( "%s(): %s [%-d]\n", __func__, sql_query, numChar );
if ( numChar >= SQL_STR_SIZE )
NADC_RETURN_ERROR( NADC_ERR_STRLEN, "sql_query" );
res = PQexec( conn, sql_query );
if ( PQresultStatus( res ) != PGRES_COMMAND_OK )
NADC_ERROR( NADC_ERR_SQL, PQresultErrorMessage(res) );
PQclear( res );
}
示例13: ExecQueryUsingCursor
/*
* ExecQueryUsingCursor: run a SELECT-like query using a cursor
*
* This feature allows result sets larger than RAM to be dealt with.
*
* Returns true if the query executed successfully, false otherwise.
*
* If pset.timing is on, total query time (exclusive of result-printing) is
* stored into *elapsed_msec.
*/
static bool
ExecQueryUsingCursor(const char *query, double *elapsed_msec)
{
bool OK = true;
PGresult *results;
PQExpBufferData buf;
printQueryOpt my_popt = pset.popt;
FILE *queryFout_copy = pset.queryFout;
bool queryFoutPipe_copy = pset.queryFoutPipe;
bool started_txn = false;
bool did_pager = false;
int ntuples;
char fetch_cmd[64];
instr_time before,
after;
int flush_error;
*elapsed_msec = 0;
/* initialize print options for partial table output */
my_popt.topt.start_table = true;
my_popt.topt.stop_table = false;
my_popt.topt.prior_records = 0;
if (pset.timing)
INSTR_TIME_SET_CURRENT(before);
/* if we're not in a transaction, start one */
if (PQtransactionStatus(pset.db) == PQTRANS_IDLE)
{
results = PQexec(pset.db, "BEGIN");
OK = AcceptResult(results) &&
(PQresultStatus(results) == PGRES_COMMAND_OK);
PQclear(results);
if (!OK)
return false;
started_txn = true;
}
/* Send DECLARE CURSOR */
initPQExpBuffer(&buf);
appendPQExpBuffer(&buf, "DECLARE _psql_cursor NO SCROLL CURSOR FOR\n%s",
query);
results = PQexec(pset.db, buf.data);
OK = AcceptResult(results) &&
(PQresultStatus(results) == PGRES_COMMAND_OK);
PQclear(results);
termPQExpBuffer(&buf);
if (!OK)
goto cleanup;
if (pset.timing)
{
INSTR_TIME_SET_CURRENT(after);
INSTR_TIME_SUBTRACT(after, before);
*elapsed_msec += INSTR_TIME_GET_MILLISEC(after);
}
snprintf(fetch_cmd, sizeof(fetch_cmd),
"FETCH FORWARD %d FROM _psql_cursor",
pset.fetch_count);
/* prepare to write output to \g argument, if any */
if (pset.gfname)
{
/* keep this code in sync with PrintQueryTuples */
pset.queryFout = stdout; /* so it doesn't get closed */
/* open file/pipe */
if (!setQFout(pset.gfname))
{
pset.queryFout = queryFout_copy;
pset.queryFoutPipe = queryFoutPipe_copy;
OK = false;
goto cleanup;
}
}
/* clear any pre-existing error indication on the output stream */
clearerr(pset.queryFout);
for (;;)
{
if (pset.timing)
INSTR_TIME_SET_CURRENT(before);
/* get FETCH_COUNT tuples at a time */
results = PQexec(pset.db, fetch_cmd);
//.........这里部分代码省略.........
示例14: SendQuery
/*
* SendQuery: send the query string to the backend
* (and print out results)
*
* Note: This is the "front door" way to send a query. That is, use it to
* send queries actually entered by the user. These queries will be subject to
* single step mode.
* To send "back door" queries (generated by slash commands, etc.) in a
* controlled way, use PSQLexec().
*
* Returns true if the query executed successfully, false otherwise.
*/
bool
SendQuery(const char *query)
{
PGresult *results;
PGTransactionStatusType transaction_status;
double elapsed_msec = 0;
bool OK,
on_error_rollback_savepoint = false;
static bool on_error_rollback_warning = false;
if (!pset.db)
{
psql_error("You are currently not connected to a database.\n");
return false;
}
if (pset.singlestep)
{
char buf[3];
printf(_("***(Single step mode: verify command)*******************************************\n"
"%s\n"
"***(press return to proceed or enter x and return to cancel)********************\n"),
query);
fflush(stdout);
if (fgets(buf, sizeof(buf), stdin) != NULL)
if (buf[0] == 'x')
return false;
}
else if (pset.echo == PSQL_ECHO_QUERIES)
{
puts(query);
fflush(stdout);
}
if (pset.logfile)
{
fprintf(pset.logfile,
_("********* QUERY **********\n"
"%s\n"
"**************************\n\n"), query);
fflush(pset.logfile);
}
SetCancelConn();
transaction_status = PQtransactionStatus(pset.db);
if (transaction_status == PQTRANS_IDLE &&
!pset.autocommit &&
!command_no_begin(query))
{
results = PQexec(pset.db, "BEGIN");
if (PQresultStatus(results) != PGRES_COMMAND_OK)
{
psql_error("%s", PQerrorMessage(pset.db));
PQclear(results);
ResetCancelConn();
return false;
}
PQclear(results);
transaction_status = PQtransactionStatus(pset.db);
}
if (transaction_status == PQTRANS_INTRANS &&
pset.on_error_rollback != PSQL_ERROR_ROLLBACK_OFF &&
(pset.cur_cmd_interactive ||
pset.on_error_rollback == PSQL_ERROR_ROLLBACK_ON))
{
if (on_error_rollback_warning == false && pset.sversion < 80000)
{
fprintf(stderr, _("The server (version %d.%d) does not support savepoints for ON_ERROR_ROLLBACK.\n"),
pset.sversion / 10000, (pset.sversion / 100) % 100);
on_error_rollback_warning = true;
}
else
{
results = PQexec(pset.db, "SAVEPOINT pg_psql_temporary_savepoint");
if (PQresultStatus(results) != PGRES_COMMAND_OK)
{
psql_error("%s", PQerrorMessage(pset.db));
PQclear(results);
ResetCancelConn();
return false;
}
PQclear(results);
on_error_rollback_savepoint = true;
}
//.........这里部分代码省略.........
示例15: get_tablespace_paths
/*
* get_tablespace_paths()
*
* Scans pg_tablespace and returns a malloc'ed array of all tablespace
* paths. Its the caller's responsibility to free the array.
*/
static void
get_tablespace_paths(void)
{
PGconn *conn = connectToServer(&old_cluster, "template1");
PGresult *res;
int tblnum;
int i_spclocation;
char query[QUERY_ALLOC];
snprintf(query, sizeof(query),
"SELECT %s "
"FROM pg_catalog.pg_tablespace "
"WHERE spcname != 'pg_default' AND "
" spcname != 'pg_global'",
/* 9.2 removed the spclocation column */
(GET_MAJOR_VERSION(old_cluster.major_version) <= 901) ?
"spclocation" : "pg_catalog.pg_tablespace_location(oid) AS spclocation");
res = executeQueryOrDie(conn, "%s", query);
if ((os_info.num_old_tablespaces = PQntuples(res)) != 0)
os_info.old_tablespaces = (char **) pg_malloc(
os_info.num_old_tablespaces * sizeof(char *));
else
os_info.old_tablespaces = NULL;
i_spclocation = PQfnumber(res, "spclocation");
for (tblnum = 0; tblnum < os_info.num_old_tablespaces; tblnum++)
{
struct stat statBuf;
os_info.old_tablespaces[tblnum] = pg_strdup(
PQgetvalue(res, tblnum, i_spclocation));
/*
* Check that the tablespace path exists and is a directory.
* Effectively, this is checking only for tables/indexes in
* non-existent tablespace directories. Databases located in
* non-existent tablespaces already throw a backend error.
* Non-existent tablespace directories can occur when a data directory
* that contains user tablespaces is moved as part of pg_upgrade
* preparation and the symbolic links are not updated.
*/
if (stat(os_info.old_tablespaces[tblnum], &statBuf) != 0)
{
if (errno == ENOENT)
report_status(PG_FATAL,
"tablespace directory \"%s\" does not exist\n",
os_info.old_tablespaces[tblnum]);
else
report_status(PG_FATAL,
"could not stat tablespace directory \"%s\": %s\n",
os_info.old_tablespaces[tblnum], strerror(errno));
}
if (!S_ISDIR(statBuf.st_mode))
report_status(PG_FATAL,
"tablespace path \"%s\" is not a directory\n",
os_info.old_tablespaces[tblnum]);
}
PQclear(res);
PQfinish(conn);
return;
}