如何从C中的SQL数据库检索格式的消息?

时间:2014-05-18 02:00:15

标签: sql c database twitter

 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)

我如何将数据库格式化为其他内容?

1 个答案:

答案 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;

此代码存在一些主要问题(主要是内存泄漏),但这应该可以完成您的任务。