4

我不熟悉使用 gwan 服务器(链接)以及在 c 中编程。我想知道在 gwan 服务器的 ac 脚本中使用 mysql 的最简单方法是什么?

我已经尝试过这里使用的 dbi.c,项目页面可以在这里找到,但也发现 mysql 本身有 ac API,你可以在这里找到。

有人有使用其中一个或两个的经验吗?有哪些优点/缺点?对于像我这样的菜鸟来说,是否有其他库可以让连接到 mysql 变得容易?

任何帮助表示赞赏。

谢谢!

[编辑] libdbi 线程也是安全的吗?似乎不是。

[编辑 2] 似乎 mysql lib 本身是一种简单的方法,除非您认为以后可能会切换数据库类型,因为 libdbi 似乎能够拥有不同的驱动程序,这对抽象很有好处。

如果我在处理程序的主函数中有任何“mysql 代码”,对我来说与 GWAN 相关,它似乎不安全并且间歇性地导致随机错误,但是如果我将“mysql 代码”放入 init 函数并放入我需要的任何数据在从全局指针之一访问的 kv 存储中,随机错误完全消失了。(我使用的是 libdbi,我认为 mysql api 是一样的)

希望这可以帮助

4

1 回答 1

4

我总是更喜欢使用本机 c api...

#pragma link "/usr/lib/libmysqlclient.so"

#include "gwan.h"
#include <mysql/mysql.h>


int
main (int argc, char **argv)
{
  MYSQL_RES *result;
  MYSQL_ROW row;
  MYSQL conn, *conn_h;

  conn_h = mysql_init (&conn);
  if (!conn_h)
    {
      return 200;
    }

  if (!mysql_real_connect (conn_h, "localhost", ctx->usr, ctx->psw, NULL, 0, NULL, 0))
    {
      mysql_close (conn_h);
      return 200;
    }

  mysql_select_db (conn_h, "");

  char *query = "";

  if (mysql_query (conn_h, query))
    {
      mysql_close (conn_h);
      return 200;
    }

  result = mysql_store_result (conn_h);
  if (!result)
    {
      mysql_close (conn_h);
      return 200;
    }

  if (mysql_num_rows (result) == 0)
    {
      return 200;
    }

  while ((row = mysql_fetch_row (result)))
    {
      /* do something with row[i] */
    }

  mysql_free_result (result);
  mysql_close (conn_h);

  return 200;  // Ok
}

请记住,如果您计划生成线程,则需要初始化 mysql 库(此代码不是线程安全的)。

希望这对您有所帮助。

于 2012-07-06T14:07:01.003 回答