dba_gdbm.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. /*
  2. +----------------------------------------------------------------------+
  3. | PHP Version 5 |
  4. +----------------------------------------------------------------------+
  5. | Copyright (c) 1997-2016 The PHP Group |
  6. +----------------------------------------------------------------------+
  7. | This source file is subject to version 3.01 of the PHP license, |
  8. | that is bundled with this package in the file LICENSE, and is |
  9. | available through the world-wide-web at the following url: |
  10. | http://www.php.net/license/3_01.txt |
  11. | If you did not receive a copy of the PHP license and are unable to |
  12. | obtain it through the world-wide-web, please send a note to |
  13. | license@php.net so we can mail you a copy immediately. |
  14. +----------------------------------------------------------------------+
  15. | Author: Sascha Schumann <sascha@schumann.cx> |
  16. +----------------------------------------------------------------------+
  17. */
  18. /* $Id$ */
  19. #ifdef HAVE_CONFIG_H
  20. #include "config.h"
  21. #endif
  22. #include "php.h"
  23. #if DBA_GDBM
  24. #include "php_gdbm.h"
  25. #ifdef GDBM_INCLUDE_FILE
  26. #include GDBM_INCLUDE_FILE
  27. #endif
  28. #define GDBM_DATA dba_gdbm_data *dba = info->dbf
  29. #define GDBM_GKEY datum gkey; gkey.dptr = (char *) key; gkey.dsize = keylen
  30. typedef struct {
  31. GDBM_FILE dbf;
  32. datum nextkey;
  33. } dba_gdbm_data;
  34. DBA_OPEN_FUNC(gdbm)
  35. {
  36. GDBM_FILE dbf;
  37. int gmode = 0;
  38. int filemode = 0644;
  39. gmode = info->mode == DBA_READER ? GDBM_READER :
  40. info->mode == DBA_WRITER ? GDBM_WRITER :
  41. info->mode == DBA_CREAT ? GDBM_WRCREAT :
  42. info->mode == DBA_TRUNC ? GDBM_NEWDB : -1;
  43. if(gmode == -1)
  44. return FAILURE; /* not possible */
  45. if(info->argc > 0) {
  46. convert_to_long_ex(info->argv[0]);
  47. filemode = Z_LVAL_PP(info->argv[0]);
  48. }
  49. dbf = gdbm_open(info->path, 0, gmode, filemode, NULL);
  50. if(dbf) {
  51. info->dbf = pemalloc(sizeof(dba_gdbm_data), info->flags&DBA_PERSISTENT);
  52. memset(info->dbf, 0, sizeof(dba_gdbm_data));
  53. ((dba_gdbm_data *) info->dbf)->dbf = dbf;
  54. return SUCCESS;
  55. }
  56. *error = gdbm_strerror(gdbm_errno);
  57. return FAILURE;
  58. }
  59. DBA_CLOSE_FUNC(gdbm)
  60. {
  61. GDBM_DATA;
  62. if(dba->nextkey.dptr) free(dba->nextkey.dptr);
  63. gdbm_close(dba->dbf);
  64. pefree(dba, info->flags&DBA_PERSISTENT);
  65. }
  66. DBA_FETCH_FUNC(gdbm)
  67. {
  68. GDBM_DATA;
  69. datum gval;
  70. char *new = NULL;
  71. GDBM_GKEY;
  72. gval = gdbm_fetch(dba->dbf, gkey);
  73. if(gval.dptr) {
  74. if(newlen) *newlen = gval.dsize;
  75. new = estrndup(gval.dptr, gval.dsize);
  76. free(gval.dptr);
  77. }
  78. return new;
  79. }
  80. DBA_UPDATE_FUNC(gdbm)
  81. {
  82. datum gval;
  83. GDBM_DATA;
  84. GDBM_GKEY;
  85. gval.dptr = (char *) val;
  86. gval.dsize = vallen;
  87. switch (gdbm_store(dba->dbf, gkey, gval, mode == 1 ? GDBM_INSERT : GDBM_REPLACE)) {
  88. case 0:
  89. return SUCCESS;
  90. case 1:
  91. return FAILURE;
  92. case -1:
  93. php_error_docref2(NULL TSRMLS_CC, key, val, E_WARNING, "%s", gdbm_strerror(gdbm_errno));
  94. return FAILURE;
  95. default:
  96. php_error_docref2(NULL TSRMLS_CC, key, val, E_WARNING, "Unknown return value");
  97. return FAILURE;
  98. }
  99. }
  100. DBA_EXISTS_FUNC(gdbm)
  101. {
  102. GDBM_DATA;
  103. GDBM_GKEY;
  104. return gdbm_exists(dba->dbf, gkey) ? SUCCESS : FAILURE;
  105. }
  106. DBA_DELETE_FUNC(gdbm)
  107. {
  108. GDBM_DATA;
  109. GDBM_GKEY;
  110. return gdbm_delete(dba->dbf, gkey) == -1 ? FAILURE : SUCCESS;
  111. }
  112. DBA_FIRSTKEY_FUNC(gdbm)
  113. {
  114. GDBM_DATA;
  115. datum gkey;
  116. char *key = NULL;
  117. if(dba->nextkey.dptr) {
  118. free(dba->nextkey.dptr);
  119. }
  120. gkey = gdbm_firstkey(dba->dbf);
  121. if(gkey.dptr) {
  122. key = estrndup(gkey.dptr, gkey.dsize);
  123. if(newlen) *newlen = gkey.dsize;
  124. dba->nextkey = gkey;
  125. } else {
  126. dba->nextkey.dptr = NULL;
  127. }
  128. return key;
  129. }
  130. DBA_NEXTKEY_FUNC(gdbm)
  131. {
  132. GDBM_DATA;
  133. char *nkey = NULL;
  134. datum gkey;
  135. if(!dba->nextkey.dptr) return NULL;
  136. gkey = gdbm_nextkey(dba->dbf, dba->nextkey);
  137. free(dba->nextkey.dptr);
  138. if(gkey.dptr) {
  139. nkey = estrndup(gkey.dptr, gkey.dsize);
  140. if(newlen) *newlen = gkey.dsize;
  141. dba->nextkey = gkey;
  142. } else {
  143. dba->nextkey.dptr = NULL;
  144. }
  145. return nkey;
  146. }
  147. DBA_OPTIMIZE_FUNC(gdbm)
  148. {
  149. GDBM_DATA;
  150. gdbm_reorganize(dba->dbf);
  151. return SUCCESS;
  152. }
  153. DBA_SYNC_FUNC(gdbm)
  154. {
  155. GDBM_DATA;
  156. gdbm_sync(dba->dbf);
  157. return SUCCESS;
  158. }
  159. DBA_INFO_FUNC(gdbm)
  160. {
  161. return estrdup(gdbm_version);
  162. }
  163. #endif
  164. /*
  165. * Local variables:
  166. * tab-width: 4
  167. * c-basic-offset: 4
  168. * End:
  169. * vim600: sw=4 ts=4 fdm=marker
  170. * vim<600: sw=4 ts=4
  171. */