dba_dbm.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  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_DBM
  24. #include "php_dbm.h"
  25. #ifdef DBM_INCLUDE_FILE
  26. #include DBM_INCLUDE_FILE
  27. #endif
  28. #if DBA_GDBM
  29. #include "php_gdbm.h"
  30. #endif
  31. #include <unistd.h>
  32. #include <sys/types.h>
  33. #include <sys/stat.h>
  34. #include <fcntl.h>
  35. #define DBM_DATA dba_dbm_data *dba = info->dbf
  36. #define DBM_GKEY datum gkey; gkey.dptr = (char *) key; gkey.dsize = keylen
  37. #define TRUNC_IT(extension, mode) \
  38. snprintf(buf, MAXPATHLEN, "%s" extension, info->path); \
  39. buf[MAXPATHLEN-1] = '\0'; \
  40. if((fd = VCWD_OPEN_MODE(buf, O_CREAT | mode | O_WRONLY, filemode)) == -1) \
  41. return FAILURE; \
  42. close(fd);
  43. typedef struct {
  44. datum nextkey;
  45. } dba_dbm_data;
  46. DBA_OPEN_FUNC(dbm)
  47. {
  48. int fd;
  49. int filemode = 0644;
  50. if(info->argc > 0) {
  51. convert_to_long_ex(info->argv[0]);
  52. filemode = Z_LVAL_PP(info->argv[0]);
  53. }
  54. if(info->mode == DBA_TRUNC) {
  55. char buf[MAXPATHLEN];
  56. /* dbm/ndbm original */
  57. TRUNC_IT(".pag", O_TRUNC);
  58. TRUNC_IT(".dir", O_TRUNC);
  59. }
  60. if(info->mode == DBA_CREAT) {
  61. char buf[MAXPATHLEN];
  62. TRUNC_IT(".pag", 0);
  63. TRUNC_IT(".dir", 0);
  64. }
  65. if(dbminit((char *) info->path) == -1) {
  66. return FAILURE;
  67. }
  68. info->dbf = pemalloc(sizeof(dba_dbm_data), info->flags&DBA_PERSISTENT);
  69. memset(info->dbf, 0, sizeof(dba_dbm_data));
  70. return SUCCESS;
  71. }
  72. DBA_CLOSE_FUNC(dbm)
  73. {
  74. pefree(info->dbf, info->flags&DBA_PERSISTENT);
  75. dbmclose();
  76. }
  77. DBA_FETCH_FUNC(dbm)
  78. {
  79. datum gval;
  80. char *new = NULL;
  81. DBM_GKEY;
  82. gval = fetch(gkey);
  83. if(gval.dptr) {
  84. if(newlen) *newlen = gval.dsize;
  85. new = estrndup(gval.dptr, gval.dsize);
  86. }
  87. return new;
  88. }
  89. DBA_UPDATE_FUNC(dbm)
  90. {
  91. datum gval;
  92. DBM_GKEY;
  93. if (mode == 1) { /* insert */
  94. gval = fetch(gkey);
  95. if(gval.dptr) {
  96. return FAILURE;
  97. }
  98. }
  99. gval.dptr = (char *) val;
  100. gval.dsize = vallen;
  101. return (store(gkey, gval) == -1 ? FAILURE : SUCCESS);
  102. }
  103. DBA_EXISTS_FUNC(dbm)
  104. {
  105. datum gval;
  106. DBM_GKEY;
  107. gval = fetch(gkey);
  108. if(gval.dptr) {
  109. return SUCCESS;
  110. }
  111. return FAILURE;
  112. }
  113. DBA_DELETE_FUNC(dbm)
  114. {
  115. DBM_GKEY;
  116. return(delete(gkey) == -1 ? FAILURE : SUCCESS);
  117. }
  118. DBA_FIRSTKEY_FUNC(dbm)
  119. {
  120. DBM_DATA;
  121. datum gkey;
  122. char *key = NULL;
  123. gkey = firstkey();
  124. if(gkey.dptr) {
  125. if(newlen) *newlen = gkey.dsize;
  126. key = estrndup(gkey.dptr, gkey.dsize);
  127. dba->nextkey = gkey;
  128. } else
  129. dba->nextkey.dptr = NULL;
  130. return key;
  131. }
  132. DBA_NEXTKEY_FUNC(dbm)
  133. {
  134. DBM_DATA;
  135. datum gkey;
  136. char *nkey = NULL;
  137. if(!dba->nextkey.dptr) return NULL;
  138. gkey = nextkey(dba->nextkey);
  139. if(gkey.dptr) {
  140. if(newlen) *newlen = gkey.dsize;
  141. nkey = estrndup(gkey.dptr, gkey.dsize);
  142. dba->nextkey = gkey;
  143. } else
  144. dba->nextkey.dptr = NULL;
  145. return nkey;
  146. }
  147. DBA_OPTIMIZE_FUNC(dbm)
  148. {
  149. /* dummy */
  150. return SUCCESS;
  151. }
  152. DBA_SYNC_FUNC(dbm)
  153. {
  154. return SUCCESS;
  155. }
  156. DBA_INFO_FUNC(dbm)
  157. {
  158. #if DBA_GDBM
  159. if (!strcmp(DBM_VERSION, "GDBM"))
  160. {
  161. return dba_info_gdbm(hnd, info TSRMLS_CC);
  162. }
  163. #endif
  164. return estrdup(DBM_VERSION);
  165. }
  166. #endif
  167. /*
  168. * Local variables:
  169. * tab-width: 4
  170. * c-basic-offset: 4
  171. * End:
  172. * vim600: sw=4 ts=4 fdm=marker
  173. * vim<600: sw=4 ts=4
  174. */