00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include <stdio.h>
00031 #include <string.h>
00032 #include <time.h>
00033 #include <sys/types.h>
00034 #include <sys/stat.h>
00035 #include <dirent.h>
00036
00037 #include "../../mem/shm_mem.h"
00038 #include "../../mem/mem.h"
00039 #include "../../dprint.h"
00040 #include "../../locking.h"
00041
00042 #include "dbt_util.h"
00043 #include "dbt_lib.h"
00044
00045
00049 dbt_column_p dbt_column_new(char *_s, int _l)
00050 {
00051 dbt_column_p dcp = NULL;
00052 if(!_s || _l <=0)
00053 return NULL;
00054 dcp = (dbt_column_p)shm_malloc(sizeof(dbt_column_t));
00055 if(!dcp)
00056 return NULL;
00057 dcp->name.s = (char*)shm_malloc((_l+1)*sizeof(char));
00058 if(!dcp->name.s)
00059 {
00060 shm_free(dcp);
00061 return NULL;
00062 }
00063 dcp->name.len = _l;
00064 strncpy(dcp->name.s, _s, _l);
00065 dcp->name.s[_l] = '\0';
00066 dcp->next = dcp->prev = NULL;
00067 dcp->type = 0;
00068 dcp->flag = DBT_FLAG_UNSET;
00069
00070 return dcp;
00071 }
00072
00076 int dbt_column_free(dbt_column_p dcp)
00077 {
00078
00079 if(!dcp)
00080 return -1;
00081 if(dcp->name.s)
00082 shm_free(dcp->name.s);
00083 shm_free(dcp);
00084
00085 return 0;
00086 }
00087
00091 dbt_row_p dbt_row_new(int _nf)
00092 {
00093 int i;
00094 dbt_row_p _drp = NULL;
00095
00096 _drp = (dbt_row_p)shm_malloc(sizeof(dbt_row_t));
00097 if(!_drp)
00098 return NULL;
00099
00100 _drp->fields = (dbt_val_p)shm_malloc(_nf*sizeof(dbt_val_t));
00101 if(!_drp->fields)
00102 {
00103 shm_free(_drp);
00104 return NULL;
00105 }
00106 memset(_drp->fields, 0, _nf*sizeof(dbt_val_t));
00107 for(i=0; i<_nf; i++)
00108 _drp->fields[i].nul = 1;
00109
00110 _drp->next = _drp->prev = NULL;
00111
00112 return _drp;
00113 }
00114
00118 int dbt_row_free(dbt_table_p _dtp, dbt_row_p _drp)
00119 {
00120 int i;
00121
00122 if(!_dtp || !_drp)
00123 return -1;
00124
00125 if(_drp->fields)
00126 {
00127 for(i=0; i<_dtp->nrcols; i++)
00128 if((_dtp->colv[i]->type==DB1_STR || _dtp->colv[i]->type==DB1_STRING
00129 || _dtp->colv[i]->type==DB1_BLOB)
00130 && _drp->fields[i].val.str_val.s)
00131 shm_free(_drp->fields[i].val.str_val.s);
00132 shm_free(_drp->fields);
00133 }
00134 shm_free(_drp);
00135
00136 return 0;
00137 }
00138
00142 dbt_table_p dbt_table_new(const str *_tbname, const str *_dbname, const char *path)
00143 {
00144 struct stat s;
00145 dbt_table_p dtp = NULL;
00146 if(!_tbname || !_dbname || !path)
00147 return NULL;
00148
00149 dtp = (dbt_table_p)shm_malloc(sizeof(dbt_table_t));
00150 if(!dtp)
00151 goto done;
00152 memset(dtp, 0, sizeof(dbt_table_t));
00153 dtp->name.s = (char*)shm_malloc((_tbname->len+1)*sizeof(char));
00154 if(!dtp->name.s)
00155 {
00156 shm_free(dtp);
00157 dtp = NULL;
00158 goto done;
00159 }
00160 memcpy(dtp->name.s, _tbname->s, _tbname->len);
00161 dtp->name.s[_tbname->len] = '\0';
00162 dtp->name.len = _tbname->len;
00163
00164 dtp->dbname.s = (char*)shm_malloc((_dbname->len+1)*sizeof(char));
00165 if(!dtp->dbname.s)
00166 {
00167 shm_free(dtp->name.s);
00168 shm_free(dtp);
00169 dtp = NULL;
00170 goto done;
00171 }
00172 memcpy(dtp->dbname.s, _dbname->s, _dbname->len);
00173 dtp->dbname.s[_dbname->len] = '\0';
00174 dtp->dbname.len = _dbname->len;
00175
00176 dtp->rows = NULL;
00177 dtp->cols = NULL;
00178 dtp->colv = NULL;
00179 dtp->mark = (int)time(NULL);
00180 dtp->flag = DBT_TBFL_ZERO;
00181 dtp->nrrows = dtp->nrcols = dtp->auto_val = 0;
00182 dtp->auto_col = -1;
00183 dtp->mt = 0;
00184 if(stat(path, &s) == 0)
00185 {
00186 dtp->mt = s.st_mtime;
00187 LM_DBG("mtime is %d\n", (int)s.st_mtime);
00188 }
00189
00190 done:
00191 return dtp;
00192 }
00193
00197 int dbt_table_free_rows(dbt_table_p _dtp)
00198 {
00199 dbt_row_p _rp=NULL, _rp0=NULL;
00200
00201 if(!_dtp || !_dtp->rows || !_dtp->colv)
00202 return -1;
00203 _rp = _dtp->rows;
00204 while(_rp)
00205 {
00206 _rp0=_rp;
00207 _rp=_rp->next;
00208 dbt_row_free(_dtp, _rp0);
00209 }
00210
00211 dbt_table_update_flags(_dtp, DBT_TBFL_MODI, DBT_FL_SET, 1);
00212
00213 _dtp->rows = NULL;
00214 _dtp->nrrows = 0;
00215
00216 return 0;
00217 }
00218
00222 int dbt_table_add_row(dbt_table_p _dtp, dbt_row_p _drp)
00223 {
00224 if(!_dtp || !_drp)
00225 return -1;
00226
00227 if(dbt_table_check_row(_dtp, _drp))
00228 return -1;
00229
00230 dbt_table_update_flags(_dtp, DBT_TBFL_MODI, DBT_FL_SET, 1);
00231
00232 if(_dtp->rows)
00233 (_dtp->rows)->prev = _drp;
00234 _drp->next = _dtp->rows;
00235 _dtp->rows = _drp;
00236 _dtp->nrrows++;
00237
00238 return 0;
00239 }
00240
00244 int dbt_table_free(dbt_table_p _dtp)
00245 {
00246 dbt_column_p _cp=NULL, _cp0=NULL;
00247
00248 if(!_dtp)
00249 return -1;
00250
00251 if(_dtp->name.s)
00252 shm_free(_dtp->name.s);
00253 if(_dtp->dbname.s)
00254 shm_free(_dtp->dbname.s);
00255
00256 if(_dtp->rows && _dtp->nrrows>0)
00257 dbt_table_free_rows(_dtp);
00258
00259 _cp = _dtp->cols;
00260 while(_cp)
00261 {
00262 _cp0=_cp;
00263 _cp=_cp->next;
00264 dbt_column_free(_cp0);
00265 }
00266 if(_dtp->colv)
00267 shm_free(_dtp->colv);
00268
00269 shm_free(_dtp);
00270
00271 return 0;
00272 }
00273
00277 int dbt_row_set_val(dbt_row_p _drp, dbt_val_p _vp, int _t, int _idx)
00278 {
00279 if(!_drp || !_vp || _idx<0)
00280 return -1;
00281
00282 _drp->fields[_idx].nul = _vp->nul;
00283 _drp->fields[_idx].type = _t;
00284
00285 if(!_vp->nul)
00286 {
00287 switch(_t)
00288 {
00289 case DB1_STR:
00290 case DB1_BLOB:
00291 _drp->fields[_idx].type = _t;
00292 _drp->fields[_idx].val.str_val.s =
00293 (char*)shm_malloc((_vp->val.str_val.len+1)*sizeof(char));
00294 if(!_drp->fields[_idx].val.str_val.s)
00295 {
00296 _drp->fields[_idx].nul = 1;
00297 return -1;
00298 }
00299 memcpy(_drp->fields[_idx].val.str_val.s, _vp->val.str_val.s,
00300 _vp->val.str_val.len);
00301 _drp->fields[_idx].val.str_val.s[_vp->val.str_val.len] = '\0';
00302 _drp->fields[_idx].val.str_val.len = _vp->val.str_val.len;
00303 break;
00304
00305 case DB1_STRING:
00306 _drp->fields[_idx].type = _t;
00307 _drp->fields[_idx].val.str_val.len=_vp->val.str_val.len;
00308
00309 _drp->fields[_idx].val.str_val.s =
00310 (char*)shm_malloc((_drp->fields[_idx].val.str_val.len+1)
00311 *sizeof(char));
00312 if(!_drp->fields[_idx].val.str_val.s)
00313 {
00314 _drp->fields[_idx].nul = 1;
00315 return -1;
00316 }
00317 memcpy(_drp->fields[_idx].val.str_val.s, _vp->val.string_val,
00318 _drp->fields[_idx].val.str_val.len);
00319 _drp->fields[_idx].val.str_val.s[_drp->fields[_idx].val.str_val.len] = '\0';
00320 break;
00321
00322 case DB1_DOUBLE:
00323 _drp->fields[_idx].type = DB1_DOUBLE;
00324 _drp->fields[_idx].val.double_val = _vp->val.double_val;
00325 break;
00326
00327 case DB1_INT:
00328 _drp->fields[_idx].type = DB1_INT;
00329 _drp->fields[_idx].val.int_val = _vp->val.int_val;
00330 break;
00331
00332 case DB1_DATETIME:
00333 _drp->fields[_idx].type = _t;
00334 _drp->fields[_idx].val.int_val = (int)_vp->val.time_val;
00335 break;
00336
00337 case DB1_BITMAP:
00338 _drp->fields[_idx].type = DB1_INT;
00339 _drp->fields[_idx].val.int_val = (int)_vp->val.bitmap_val;
00340 break;
00341
00342 default:
00343 _drp->fields[_idx].nul = 1;
00344 return -1;
00345 }
00346 }
00347
00348 return 0;
00349 }
00350
00354 int dbt_row_update_val(dbt_row_p _drp, dbt_val_p _vp, int _t, int _idx)
00355 {
00356 if(!_drp || !_vp || _idx<0)
00357 return -1;
00358
00359 _drp->fields[_idx].nul = _vp->nul;
00360 _drp->fields[_idx].type = _t;
00361
00362 if(!_vp->nul)
00363 {
00364 switch(_t)
00365 {
00366 case DB1_BLOB:
00367 case DB1_STR:
00368 _drp->fields[_idx].type = _t;
00369
00370 if(_drp->fields[_idx].val.str_val.s)
00371 shm_free(_drp->fields[_idx].val.str_val.s);
00372
00373 _drp->fields[_idx].val.str_val.s =
00374 (char*)shm_malloc((_vp->val.str_val.len+1)*sizeof(char));
00375 if(!_drp->fields[_idx].val.str_val.s)
00376 {
00377 _drp->fields[_idx].nul = 1;
00378 return -1;
00379 }
00380 memcpy(_drp->fields[_idx].val.str_val.s, _vp->val.str_val.s,
00381 _vp->val.str_val.len);
00382 _drp->fields[_idx].val.str_val.s[_vp->val.str_val.len] = '\0';
00383 _drp->fields[_idx].val.str_val.len = _vp->val.str_val.len;
00384 break;
00385
00386 case DB1_STRING:
00387
00388 if(_drp->fields[_idx].val.str_val.s)
00389 shm_free(_drp->fields[_idx].val.str_val.s);
00390
00391 _drp->fields[_idx].type = _t;
00392 if(_vp->type==DB1_STR)
00393 _drp->fields[_idx].val.str_val.len=_vp->val.str_val.len;
00394 else
00395 _drp->fields[_idx].val.str_val.len
00396 =strlen(_vp->val.string_val);
00397
00398 _drp->fields[_idx].val.str_val.s =
00399 (char*)shm_malloc((_drp->fields[_idx].val.str_val.len+1)
00400 *sizeof(char));
00401 if(!_drp->fields[_idx].val.str_val.s)
00402 {
00403 _drp->fields[_idx].nul = 1;
00404 return -1;
00405 }
00406 memcpy(_drp->fields[_idx].val.str_val.s, _vp->val.string_val,
00407 _drp->fields[_idx].val.str_val.len);
00408 _drp->fields[_idx].val.str_val.s[_vp->val.str_val.len] = '\0';
00409 break;
00410
00411 case DB1_DOUBLE:
00412 _drp->fields[_idx].type = _t;
00413 _drp->fields[_idx].val.double_val = _vp->val.double_val;
00414 break;
00415
00416 case DB1_INT:
00417 _drp->fields[_idx].type = _t;
00418 _drp->fields[_idx].val.int_val = _vp->val.int_val;
00419 break;
00420
00421 case DB1_DATETIME:
00422 _drp->fields[_idx].type = _t;
00423 _drp->fields[_idx].val.int_val = (int)_vp->val.time_val;
00424 break;
00425
00426 case DB1_BITMAP:
00427 _drp->fields[_idx].type = _t;
00428 _drp->fields[_idx].val.int_val = (int)_vp->val.bitmap_val;
00429 break;
00430
00431 default:
00432 LM_ERR("unsupported type %d in update\n",_t);
00433 _drp->fields[_idx].nul = 1;
00434 return -1;
00435 }
00436 }
00437
00438 return 0;
00439 }
00440
00444 int dbt_table_check_row(dbt_table_p _dtp, dbt_row_p _drp)
00445 {
00446 int i;
00447 if(!_dtp || _dtp->nrcols <= 0 || !_drp)
00448 return -1;
00449
00450 for(i=0; i<_dtp->nrcols; i++)
00451 {
00452 if(!_drp->fields[i].nul
00453 && dbt_is_neq_type(_dtp->colv[i]->type, _drp->fields[i].type))
00454 {
00455 LM_DBG("incompatible types - field %d [%d/%d]\n",i,
00456 _dtp->colv[i]->type, _drp->fields[i].type);
00457 return -1;
00458 }
00459 if(_dtp->colv[i]->flag & DBT_FLAG_NULL)
00460 continue;
00461
00462 if(!_drp->fields[i].nul)
00463 continue;
00464
00465 if(_dtp->colv[i]->type==DB1_INT
00466 && (_dtp->colv[i]->flag & DBT_FLAG_AUTO)
00467 && i==_dtp->auto_col)
00468 {
00469 _drp->fields[i].nul = 0;
00470 _drp->fields[i].val.int_val = ++_dtp->auto_val;
00471 continue;
00472 }
00473
00474 LM_DBG("null value not allowed - field %d\n",i);
00475 return -1;
00476 }
00477
00478 return 0;
00479 }
00480
00484 int dbt_table_update_flags(dbt_table_p _dtp, int _f, int _o, int _m)
00485 {
00486 if(!_dtp)
00487 return -1;
00488
00489 if(_o == DBT_FL_SET)
00490 _dtp->flag |= _f;
00491 else if(_o == DBT_FL_UNSET)
00492 _dtp->flag &= ~_f;
00493
00494 if(_m)
00495 _dtp->mark = (int)time(NULL);
00496
00497 return 0;
00498 }
00499