db.c
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:7k
源码类别:

P2P编程

开发平台:

Visual C++

  1. /*
  2.  *  Openmysee
  3.  *
  4.  *  This program is free software; you can redistribute it and/or modify
  5.  *  it under the terms of the GNU General Public License as published by
  6.  *  the Free Software Foundation; either version 2 of the License, or
  7.  *  (at your option) any later version.
  8.  *
  9.  *  This program is distributed in the hope that it will be useful,
  10.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  *  GNU General Public License for more details.
  13.  *
  14.  *  You should have received a copy of the GNU General Public License
  15.  *  along with this program; if not, write to the Free Software
  16.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  *
  18.  */
  19.  
  20. #include <db.h>
  21. #include "echo.h"
  22. #define MAGIC_TIME 1.3
  23. DB *USERDB;
  24. int
  25. db_init (char *home, char *database)
  26. {
  27. DB_ENV *dbenv = NULL;
  28. DB_TXN *txnp = NULL;
  29. int flags, ret;
  30. int cachesize = 1000 * 65536;
  31. //      struct stat st_buf;
  32. DB *dbp = NULL;
  33. //      if (stat (database, &st_buf) < 0 || (!S_ISREG (st_buf.st_mode)))
  34. //              return -1;
  35. if ((ret = db_env_create (&dbenv, 0)) != 0)
  36. {
  37. dbenv->err (dbenv, ret, "db_env_create");
  38. return -1;
  39. }
  40. dbenv->set_errfile (dbenv, stderr);
  41. //      dbenv->set_errpfx (dbenv, prefix);
  42. (void) dbenv->set_cachesize (dbenv, 0,
  43.      cachesize ==
  44.      0 ? 50 * 1024 *
  45.      1024 : (u_int32_t) cachesize, 0);
  46. flags = DB_CREATE | DB_PRIVATE | DB_INIT_MPOOL | DB_INIT_TXN | DB_INIT_LOCK;
  47. if ((ret = dbenv->open (dbenv, home, flags, 0)) != 0)
  48. {
  49. dbenv->err (dbenv, ret, "DB_ENV->open: %s", home);
  50. (void) dbenv->close (dbenv, 0);
  51. return -1;
  52. }
  53. /* Create and initialize database object, open the database. */
  54. if ((ret = db_create (&dbp, dbenv, 0)) != 0)
  55. {
  56. return -1;
  57. }
  58. dbp->set_errfile (dbp, stderr);
  59. //      dbp->set_errpfx (dbp, progname);
  60. if ((ret = dbp->set_pagesize (dbp, 65536)) != 0)
  61. {
  62. dbp->err (dbp, ret, "set_pagesize");
  63. goto err1;
  64. }
  65. if ((ret = dbenv->txn_begin (dbenv, NULL, &txnp, 0)) != 0)
  66. goto err1;
  67. if ((ret =
  68.      dbp->open (dbp, txnp, database, NULL, DB_BTREE, DB_CREATE,
  69. 0664)) != 0)
  70. {
  71. dbp->err (dbp, ret, "%s: open", database);
  72. goto err1;
  73. }
  74. if (txnp != NULL)
  75. ret = txnp->commit (txnp, 0);
  76. txnp = NULL;
  77. if (ret != 0)
  78. goto err1;
  79. USERDB = dbp;
  80. return 0;
  81.       err1:
  82. if (txnp != NULL)
  83. (void) txnp->abort (txnp);
  84. (void) dbp->close (dbp, 0);
  85. return (1);
  86. }
  87. int
  88. isAllowed (int id, char *md5, char *cname, float bitrate,
  89.    float *limitedbitrate, int *issave)
  90. {
  91. DB *dbp;
  92. DB_TXN *txnp = NULL;
  93. char *p;
  94. DBT key, data;
  95. int ret;
  96. dbp = USERDB;
  97. memset (&key, 0, sizeof (key));
  98. key.data = &id;
  99. key.size = sizeof (id);
  100. memset (&data, 0, sizeof (data));
  101. dbp->dbenv->txn_begin (dbp->dbenv, NULL, &txnp, 0);
  102. if ((ret = dbp->get (dbp, txnp, &key, &data, 0)) != 0)
  103. {
  104. dbp->err (dbp, ret, "DB->get");
  105. ret = -ERR_NO_SUCH_PEER;
  106. goto err;
  107. }
  108. if (data.size == 0 || (p = data.data) == NULL)
  109. {
  110. ret = -ERR_NO_SUCH_PEER;
  111. goto err;
  112. }
  113. if (strncmp (md5, p, MD5_LEN) != 0)
  114. {
  115. ret = -ERR_AUTHORIZATION;
  116. goto err;
  117. }
  118. p += MD5_LEN;
  119. if (strcmp (p, cname) != 0)
  120. {
  121. ret = -ERR_AUTHORIZATION;
  122. goto err;
  123. }
  124. p += strlen (cname) + 1;
  125. *limitedbitrate = (*(float *) p) * MAGIC_TIME;
  126. p += sizeof (float);
  127. *issave = *(int *)p;
  128. if (*limitedbitrate < bitrate)
  129. {
  130. ret = -ERR_EXCEED_BITRATE;
  131. goto err;
  132. }
  133. if (txnp != NULL)
  134. ret = txnp->commit (txnp, 0);
  135. else ret = 0;
  136. // if (data.data)
  137. // free (data.data);
  138. return (ret);
  139.       err:if (txnp != NULL)
  140. (void) txnp->abort (txnp);
  141. //   if (data.data) free (data.data);
  142. return ret;
  143. }
  144. int
  145. db_list ()
  146. {
  147. DB *dbp;
  148. DBC *dbcp;
  149. DBT key, data;
  150. DB_TXN *txnp;
  151. int ret;
  152. char *md5pass;
  153. char *cname;
  154. float bitrate;
  155. int issave;
  156. dbp = USERDB;
  157. memset (&key, 0, sizeof (key));
  158. memset (&data, 0, sizeof (data));
  159. dbp->dbenv->txn_begin (dbp->dbenv, NULL, &txnp, 0);
  160. dbp->cursor (dbp, txnp, &dbcp, 0);
  161. while ((ret = dbcp->c_get (dbcp, &key, &data, DB_NEXT)) == 0)
  162. {
  163. md5pass = data.data;
  164. cname = md5pass + MD5_LEN;
  165. bitrate = *(float *) (cname + strlen (cname) + 1);
  166. issave = *(int *) (cname + strlen (cname) + 1 + sizeof (float));
  167. printf ("%d length %d:%.32s,%s,%f,%dn", *(int *) key.data,
  168. data.size, md5pass, cname, bitrate, issave);
  169. //              if (stat (data.data + 2 * sizeof (int), &st_buf) < 0
  170. //                  || (!S_ISREG (st_buf.st_mode)))
  171. //                      ret = dbp->del (dbp, NULL, &key, 0);
  172. // if (key.data)
  173. // free (key.data);
  174. // if (data.data)
  175. // free (data.data);
  176. }
  177. dbcp->c_close (dbcp);
  178. if (txnp)
  179. txnp->commit (txnp, 0);
  180. return (0);
  181. }
  182. int
  183. db_add (int userid, char *pass, char *cname, float limited, int issave)
  184. {
  185. DB *dbp;
  186. DBT key, data;
  187. DB_TXN *txnp;
  188. char *p;
  189. int ret, cnamelen;
  190. /*
  191.  * Insert records into the database, where the key is the user
  192.  * input and the data is the user input in reverse order.
  193.  */
  194. dbp = USERDB;
  195. cnamelen = strlen (cname);
  196. memset (&key, 0, sizeof (DBT));
  197. memset (&data, 0, sizeof (DBT));
  198. key.data = &userid;
  199. key.size = sizeof (int);
  200. data.size = MD5_LEN + cnamelen + 1 + sizeof (float) + sizeof(int);
  201. p = malloc (data.size);
  202. assert (p);
  203. data.data = p;
  204. memcpy (p, pass, MD5_LEN);
  205. p += MD5_LEN;
  206. memcpy (p, cname, cnamelen + 1);
  207. p += cnamelen + 1;
  208. *(float *) p = limited;
  209. p += sizeof (float);
  210. *(int *) p = issave;
  211. if ((ret = dbp->dbenv->txn_begin (dbp->dbenv, NULL, &txnp, 0)) != 0)
  212. goto err;
  213. if ((ret = dbp->put (dbp, txnp, &key, &data, 0)) != 0)
  214. {
  215. dbp->err (dbp, ret, "DB->put");
  216. goto err;
  217. }
  218. if (txnp != NULL)
  219. ret = txnp->commit (txnp, 0);
  220. else ret = 0;
  221. if (data.data) free (data.data);
  222. return (ret);
  223.       err:if (txnp != NULL)
  224. (void) txnp->abort (txnp);
  225. if (data.data) free (data.data);
  226. return -1;
  227. }
  228. int
  229. db_del (int userid)
  230. {
  231. DB *dbp;
  232. DBT key, data;
  233. DB_TXN *txnp;
  234. int ret;
  235. /*
  236.  * Insert records into the database, where the key is the user
  237.  * input and the data is the user input in reverse order.
  238.  */
  239. dbp = USERDB;
  240. memset (&key, 0, sizeof (DBT));
  241. memset (&data, 0, sizeof (DBT));
  242. key.data = &userid;
  243. key.size = sizeof (int);
  244. if ((ret = dbp->dbenv->txn_begin (dbp->dbenv, NULL, &txnp, 0)) != 0)
  245. goto err;
  246. if ((ret = dbp->del (dbp, txnp, &key, 0)) != 0)
  247. {
  248. dbp->err (dbp, ret, "DB->put");
  249. goto err;
  250. }
  251. if (txnp != NULL)
  252. ret = txnp->commit (txnp, 0);
  253. else ret = 0;
  254. return (ret);
  255.       err:if (txnp != NULL)
  256. (void) txnp->abort (txnp);
  257. return -1;
  258. }
  259. int db_end ()
  260. {
  261. if (USERDB) USERDB->close (USERDB, 0);
  262. return 0;
  263. }