bdb_uval.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. /* $Id$
  2. *
  3. * Copyright (C) 2006-2007 Sippy Software, Inc. <[email protected]>
  4. *
  5. * This file is part of ser, a free SIP server.
  6. *
  7. * ser is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version
  11. *
  12. * For a license to use the ser software under conditions
  13. * other than those described here, or to purchase support for this
  14. * software, please contact iptel.org by e-mail at the following addresses:
  15. * [email protected]
  16. *
  17. * ser is distributed in the hope that it will be useful,
  18. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  20. * GNU General Public License for more details.
  21. *
  22. * You should have received a copy of the GNU General Public License
  23. * along with this program; if not, write to the Free Software
  24. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  25. *
  26. */
  27. #include "bdb.h"
  28. int bdb_urow_db2bdb(db_con_t* _h, db_key_t* _k, db_val_t* _v, int _n, bdb_urow_p *_r)
  29. {
  30. bdb_urow_p r;
  31. bdb_table_p t;
  32. bdb_column_p c;
  33. int found, found_key;
  34. int i, j;
  35. int c_idx;
  36. bdb_uval_p v;
  37. *_r = NULL;
  38. if (_n <= 0) {
  39. #ifdef BDB_EXTRA_DEBUG
  40. LOG(L_ERR, "BDB:bdb_urow_db2bdb: no defined keys to be updated\n");
  41. #endif
  42. return -1;
  43. }
  44. if ((t = bdb_find_table(CON_TABLE(_h))) == NULL) {
  45. #ifdef BDB_EXTRA_DEBUG
  46. LOG(L_ERR, "BDB:bdb_urow_db2bdb: no table in use\n");
  47. #endif
  48. return -1;
  49. };
  50. /* check for dublicates in update set */
  51. for (i = 1; i < _n; i++) {
  52. for (j = 0; j < i; j++) {
  53. if (!strcmp(_k[i], _k[j])) {
  54. #ifdef BDB_EXTRA_DEBUG
  55. LOG(L_ERR, "BDB:bdb_urow_db2bdb: dublicates keys in update set: '%s' and '%s'\n", _k[i], _k[j]);
  56. #endif
  57. return -1;
  58. }
  59. }
  60. }
  61. /* check if all columns exist */
  62. for (i = 0; i < _n; i++) {
  63. found = 0;
  64. /* key column is always first one */
  65. for (c = t->cols, found_key = 1; c != NULL; c = c->next, found_key = 0) {
  66. if (!strcmp(_k[i], c->name.s)) {
  67. found = 1;
  68. break;
  69. }
  70. }
  71. if (found_key == 1) {
  72. LOG(L_ERR, "BDB:bdb_urow_db2bdb: unable to update primary key value\n");
  73. return -1;
  74. }
  75. if (!found) {
  76. LOG(L_ERR, "BDB:bdb_urow_db2bdb: column '%s' does not exist\n", _k[i]);
  77. return -1;
  78. }
  79. }
  80. r = pkg_malloc(sizeof(*r));
  81. memset(r, 0, sizeof(*r));
  82. /* filling data into row */
  83. for (c = t->cols, c_idx = 0; c != NULL; c = c->next, c_idx++) {
  84. for (i = 0; i < _n; i++) {
  85. if (!strcmp(_k[i], c->name.s)) {
  86. #ifdef BDB_EXTRA_DEBUG
  87. LOG(L_NOTICE, "BDB:bdb_urow_db2bdb: filling column '%.*s', c_idx = %0d\n", c->name.len, c->name.s, c_idx);
  88. #endif
  89. v = pkg_malloc(sizeof(*v));
  90. memset(v, 0, sizeof(*v));
  91. v->c_idx = c_idx;
  92. bdb_push_ufield(r, v);
  93. if (bdb_ufield_db2bdb(v, &_v[i]) < 0) {
  94. bdb_free_urow(r);
  95. return -1;
  96. };
  97. }
  98. }
  99. };
  100. *_r = r;
  101. return 0;
  102. };
  103. void bdb_free_urow(bdb_urow_p _r)
  104. {
  105. if (_r->fields != NULL) {
  106. bdb_free_ufield_list(_r->fields);
  107. }
  108. pkg_free(_r);
  109. };
  110. void bdb_free_ufield(bdb_uval_p _v)
  111. {
  112. if (!VAL_NULL(&(_v->v))) {
  113. if (VAL_TYPE(&(_v->v)) == DB_STR || VAL_TYPE(&(_v->v)) == DB_STRING ||
  114. VAL_TYPE(&(_v->v)) == DB_BLOB) {
  115. pkg_free(VAL_STR(&(_v->v)).s);
  116. }
  117. }
  118. pkg_free(_v);
  119. };
  120. void bdb_free_ufield_list(bdb_uval_p _v)
  121. {
  122. bdb_uval_p curr, next;
  123. for (curr = _v; curr != NULL;) {
  124. next = curr->next;
  125. bdb_free_ufield(curr);
  126. curr = next;
  127. }
  128. };
  129. void bdb_push_ufield(bdb_urow_p _r, bdb_uval_p _v)
  130. {
  131. bdb_uval_p f;
  132. if (_r->fields == NULL) {
  133. _r->fields = _v;
  134. return;
  135. }
  136. f = _r->fields;
  137. while (f->next != NULL) {
  138. f = f->next;
  139. }
  140. f->next = _v;
  141. };
  142. int bdb_ufield_db2bdb(bdb_uval_p v, db_val_t* _v)
  143. {
  144. char *s;
  145. VAL_NULL(&(v->v)) = VAL_NULL(_v);
  146. VAL_TYPE(&(v->v)) = VAL_TYPE(_v);
  147. if (!VAL_NULL(&(v->v))) {
  148. switch (VAL_TYPE(_v)) {
  149. case DB_INT:
  150. VAL_INT(&(v->v)) = VAL_INT(_v);
  151. break;
  152. case DB_FLOAT:
  153. VAL_FLOAT(&(v->v)) = VAL_FLOAT(_v);
  154. break;
  155. case DB_DATETIME:
  156. VAL_TIME(&(v->v)) = VAL_TIME(_v);
  157. break;
  158. case DB_BLOB:
  159. s = pkg_malloc(VAL_BLOB(_v).len);
  160. memcpy(s, VAL_BLOB(_v).s, VAL_BLOB(_v).len);
  161. VAL_BLOB(&(v->v)).s = s;
  162. VAL_BLOB(&(v->v)).len = VAL_BLOB(_v).len;
  163. break;
  164. case DB_DOUBLE:
  165. VAL_DOUBLE(&(v->v)) = VAL_DOUBLE(_v);
  166. break;
  167. case DB_STRING:
  168. VAL_STR(&(v->v)).len = strlen(VAL_STRING(_v)) + 1;
  169. s = pkg_malloc(VAL_STR(&(v->v)).len);
  170. strcpy(s, VAL_STRING(_v));
  171. VAL_STRING(&(v->v)) = s;
  172. break;
  173. case DB_STR:
  174. s = pkg_malloc(VAL_STR(_v).len);
  175. memcpy(s, VAL_STR(_v).s, VAL_STR(_v).len);
  176. VAL_STR(&(v->v)).s = s;
  177. VAL_STR(&(v->v)).len = VAL_STR(_v).len;
  178. break;
  179. case DB_BITMAP:
  180. VAL_BITMAP(&(v->v)) = VAL_BITMAP(_v);
  181. break;
  182. default:
  183. LOG(L_ERR, "BDB:bdb_ufield_db2bdb: unknown column type: %0X\n", VAL_TYPE(_v));
  184. return -1;
  185. break;
  186. }
  187. }
  188. return 0;
  189. };