You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

200 lines
4.1 KiB

24 years ago
23 years ago
24 years ago
23 years ago
  1. /*
  2. +----------------------------------------------------------------------+
  3. | PHP Version 4 |
  4. +----------------------------------------------------------------------+
  5. | Copyright (c) 1997-2003 The PHP Group |
  6. +----------------------------------------------------------------------+
  7. | This source file is subject to version 3.0 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_0.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. if(gdbm_store(dba->dbf, gkey, gval,
  88. mode == 1 ? GDBM_INSERT : GDBM_REPLACE) == 0)
  89. return SUCCESS;
  90. php_error_docref2(NULL TSRMLS_CC, key, val, E_WARNING, "%s", gdbm_strerror(gdbm_errno));
  91. return FAILURE;
  92. }
  93. DBA_EXISTS_FUNC(gdbm)
  94. {
  95. GDBM_DATA;
  96. GDBM_GKEY;
  97. return gdbm_exists(dba->dbf, gkey) ? SUCCESS : FAILURE;
  98. }
  99. DBA_DELETE_FUNC(gdbm)
  100. {
  101. GDBM_DATA;
  102. GDBM_GKEY;
  103. return gdbm_delete(dba->dbf, gkey) == -1 ? FAILURE : SUCCESS;
  104. }
  105. DBA_FIRSTKEY_FUNC(gdbm)
  106. {
  107. GDBM_DATA;
  108. datum gkey;
  109. char *key = NULL;
  110. if(dba->nextkey.dptr) {
  111. free(dba->nextkey.dptr);
  112. }
  113. gkey = gdbm_firstkey(dba->dbf);
  114. if(gkey.dptr) {
  115. key = estrndup(gkey.dptr, gkey.dsize);
  116. if(newlen) *newlen = gkey.dsize;
  117. dba->nextkey = gkey;
  118. } else {
  119. dba->nextkey.dptr = NULL;
  120. }
  121. return key;
  122. }
  123. DBA_NEXTKEY_FUNC(gdbm)
  124. {
  125. GDBM_DATA;
  126. char *nkey = NULL;
  127. datum gkey;
  128. if(!dba->nextkey.dptr) return NULL;
  129. gkey = gdbm_nextkey(dba->dbf, dba->nextkey);
  130. free(dba->nextkey.dptr);
  131. if(gkey.dptr) {
  132. nkey = estrndup(gkey.dptr, gkey.dsize);
  133. if(newlen) *newlen = gkey.dsize;
  134. dba->nextkey = gkey;
  135. } else {
  136. dba->nextkey.dptr = NULL;
  137. }
  138. return nkey;
  139. }
  140. DBA_OPTIMIZE_FUNC(gdbm)
  141. {
  142. GDBM_DATA;
  143. gdbm_reorganize(dba->dbf);
  144. return SUCCESS;
  145. }
  146. DBA_SYNC_FUNC(gdbm)
  147. {
  148. GDBM_DATA;
  149. gdbm_sync(dba->dbf);
  150. return SUCCESS;
  151. }
  152. DBA_INFO_FUNC(gdbm)
  153. {
  154. return estrdup(gdbm_version);
  155. }
  156. #endif
  157. /*
  158. * Local variables:
  159. * tab-width: 4
  160. * c-basic-offset: 4
  161. * End:
  162. * vim600: sw=4 ts=4 fdm=marker
  163. * vim<600: sw=4 ts=4
  164. */