dba_dbm.c 3.7 KB

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