while(1)
{
menu();
char *choice = readline("Your choice: ");
switch(choice[0])
{
case 'P':
case 'p':
{
// Post a tweet
char *tweet = readline("Enter tweet: ");
char *lat = readline("Enter latitude (press Enter to skip): ");
char *lon = readline("Enter longitude (press Enter to skip): ");
char query[300];
if (*lat == '\n' || *lon == '\n')
{
uid_t uid = getuid();
struct passwd *pw;
pw = getpwuid(uid);
sprintf(query, "insert into tweet values (default, '%s', '%s', now(), null, null)", pw->pw_name, tweet);
}
else
{
uid_t uid = getuid();
struct passwd *pw;
pw = getpwuid(uid);
sprintf(query, "insert into tweet values (default, '%s', '%s', now(), %s, %s)", pw->pw_name, tweet, lat, lon);
}
res = PQexec(db, query);
if (PQresultStatus(res) == PGRES_COMMAND_OK)
{
printf("INSERT succeeded\n");
}
else
{
printf("INSERT failed\n");
}
PQclear(res);
}
break;
case 'A':
case 'a':
// Read all tweets
{
res = PQexec(db, "select * from tweet");
int rows = PQntuples(res);
printf("Getting %d rows\n", rows);
for (int i = 0; i < rows; i++)
{
char *msg = PQgetvalue(res, i, 0);
printf("%s\n", msg);
}
PQclear(res);
}
break;
我正在尝试将“推文”存储在数据库中。我可以让程序说INSERT SUCCESSFUL,但是当我在菜单中键入“a”来查看所有推文时,只显示推文的数量,而不是消息或用户名等。我是否需要包含< / p>
create table tweet ( id serial primary key, username varchar(15), msg varchar(140), ts timestamp, lat float, lon float);
我的代码中某处?
在输入“a”查看所有推文时,我也必须格式化它:
@username
tweet message
2014-4-20 18:53 (38.765, -121.240)
我如何将数据库格式化为其他内容?
答案 0 :(得分:1)
好的,你的问题似乎是这样的:
char *PQgetvalue(const PGresult *res,
int row_number,
int column_number
);
意思是,您只获得第一列(id)。您应该获得所有列(其中有6个)
int i, j, rows, cols; //define your variables up top
char *tweet, *lat, *lon, *choice, *msg, query[300];
struct passwd *pw;
uid_t uid;
while(1)
{
menu();
choice = readline("Your choice: ");
switch(choice[0])
{
case 'P':
case 'p':
{
// Post a tweet
tweet = readline("Enter tweet: ");
lat = readline("Enter latitude (press Enter to skip): ");
lon = readline("Enter longitude (press Enter to skip): ");
if (*lat == '\n' || *lon == '\n')
{
uid = getuid();
pw = getpwuid(uid);
sprintf(query, "insert into tweet values (default, '%s', '%s', now(), null, null)", pw->pw_name, tweet);
}
else
{
uid = getuid();
pw = getpwuid(uid);
sprintf(query, "insert into tweet values (default, '%s', '%s', now(), %s, %s)", pw->pw_name, tweet, lat, lon);
}
res = PQexec(db, query);
if (PQresultStatus(res) == PGRES_COMMAND_OK)
{
printf("INSERT succeeded\n");
}
else
{
printf("INSERT failed\n");
}
PQclear(res);
}
break;
case 'A':
case 'a':
// Read all tweets
{
res = PQexec(db, "select * from tweet");
rows = PQntuples(res);
cols = 5; //i dont know the PQL method of getting cols num
printf("Getting %d rows\n", rows);
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
msg = PQgetvalue(res, i, j);
printf("%s\t", msg);
}
putchar(10);
}
PQclear(res);
}
break;
此代码存在一些主要问题(主要是内存泄漏),但这应该可以完成您的任务。