dba_ndbm.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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_NDBM
  21. #include "php_ndbm.h"
  22. #include <fcntl.h>
  23. #ifdef NDBM_INCLUDE_FILE
  24. #include NDBM_INCLUDE_FILE
  25. #endif
  26. #define NDBM_GKEY datum gkey; gkey.dptr = (char *) key; gkey.dsize = keylen
  27. DBA_OPEN_FUNC(ndbm)
  28. {
  29. DBM *dbf;
  30. int gmode = 0;
  31. int filemode = 0644;
  32. dba_info *pinfo = (dba_info *) info;
  33. switch(info->mode) {
  34. case DBA_READER:
  35. gmode = O_RDONLY;
  36. break;
  37. case DBA_WRITER:
  38. gmode = O_RDWR;
  39. break;
  40. case DBA_CREAT:
  41. gmode = O_RDWR | O_CREAT;
  42. break;
  43. case DBA_TRUNC:
  44. gmode = O_RDWR | O_CREAT | O_TRUNC;
  45. break;
  46. default:
  47. return FAILURE; /* not possible */
  48. }
  49. if(info->argc > 0) {
  50. filemode = zval_get_long(&info->argv[0]);
  51. }
  52. dbf = dbm_open(info->path, gmode, filemode);
  53. pinfo->dbf = dbf;
  54. return SUCCESS;
  55. }
  56. DBA_CLOSE_FUNC(ndbm)
  57. {
  58. dbm_close(info->dbf);
  59. }
  60. DBA_FETCH_FUNC(ndbm)
  61. {
  62. datum gval;
  63. char *new = NULL;
  64. NDBM_GKEY;
  65. gval = dbm_fetch(info->dbf, gkey);
  66. if(gval.dptr) {
  67. if(newlen) *newlen = gval.dsize;
  68. new = estrndup(gval.dptr, gval.dsize);
  69. }
  70. return new;
  71. }
  72. DBA_UPDATE_FUNC(ndbm)
  73. {
  74. datum gval;
  75. NDBM_GKEY;
  76. gval.dptr = (char *) val;
  77. gval.dsize = vallen;
  78. if(!dbm_store(info->dbf, gkey, gval, mode == 1 ? DBM_INSERT : DBM_REPLACE))
  79. return SUCCESS;
  80. return FAILURE;
  81. }
  82. DBA_EXISTS_FUNC(ndbm)
  83. {
  84. datum gval;
  85. NDBM_GKEY;
  86. gval = dbm_fetch(info->dbf, gkey);
  87. if(gval.dptr) {
  88. return SUCCESS;
  89. }
  90. return FAILURE;
  91. }
  92. DBA_DELETE_FUNC(ndbm)
  93. {
  94. NDBM_GKEY;
  95. return(dbm_delete(info->dbf, gkey) == -1 ? FAILURE : SUCCESS);
  96. }
  97. DBA_FIRSTKEY_FUNC(ndbm)
  98. {
  99. datum gkey;
  100. char *key = NULL;
  101. gkey = dbm_firstkey(info->dbf);
  102. if(gkey.dptr) {
  103. if(newlen) *newlen = gkey.dsize;
  104. key = estrndup(gkey.dptr, gkey.dsize);
  105. }
  106. return key;
  107. }
  108. DBA_NEXTKEY_FUNC(ndbm)
  109. {
  110. datum gkey;
  111. char *nkey = NULL;
  112. gkey = dbm_nextkey(info->dbf);
  113. if(gkey.dptr) {
  114. if(newlen) *newlen = gkey.dsize;
  115. nkey = estrndup(gkey.dptr, gkey.dsize);
  116. }
  117. return nkey;
  118. }
  119. DBA_OPTIMIZE_FUNC(ndbm)
  120. {
  121. return SUCCESS;
  122. }
  123. DBA_SYNC_FUNC(ndbm)
  124. {
  125. return SUCCESS;
  126. }
  127. DBA_INFO_FUNC(ndbm)
  128. {
  129. return estrdup("NDBM");
  130. }
  131. #endif