dba_gdbm.c 4.0 KB

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