|
@@ -15,10 +15,10 @@
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
* GNU General Public License for more details.
|
|
*
|
|
*
|
|
- * You should have received a copy of the GNU General Public License
|
|
|
|
- * along with this program; if not, write to the Free Software
|
|
|
|
|
|
+ * You should have received a copy of the GNU General Public License
|
|
|
|
+ * along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
- *
|
|
|
|
|
|
+ *
|
|
*/
|
|
*/
|
|
|
|
|
|
#include <stdio.h>
|
|
#include <stdio.h>
|
|
@@ -69,13 +69,13 @@ dbt_column_p dbt_column_new(char *_s, int _l)
|
|
*/
|
|
*/
|
|
int dbt_column_free(dbt_column_p dcp)
|
|
int dbt_column_free(dbt_column_p dcp)
|
|
{
|
|
{
|
|
-
|
|
|
|
|
|
+
|
|
if(!dcp)
|
|
if(!dcp)
|
|
return -1;
|
|
return -1;
|
|
if(dcp->name.s)
|
|
if(dcp->name.s)
|
|
shm_free(dcp->name.s);
|
|
shm_free(dcp->name.s);
|
|
shm_free(dcp);
|
|
shm_free(dcp);
|
|
-
|
|
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -90,7 +90,7 @@ dbt_row_p dbt_row_new(int _nf)
|
|
_drp = (dbt_row_p)shm_malloc(sizeof(dbt_row_t));
|
|
_drp = (dbt_row_p)shm_malloc(sizeof(dbt_row_t));
|
|
if(!_drp)
|
|
if(!_drp)
|
|
return NULL;
|
|
return NULL;
|
|
-
|
|
|
|
|
|
+
|
|
_drp->fields = (dbt_val_p)shm_malloc(_nf*sizeof(dbt_val_t));
|
|
_drp->fields = (dbt_val_p)shm_malloc(_nf*sizeof(dbt_val_t));
|
|
if(!_drp->fields)
|
|
if(!_drp->fields)
|
|
{
|
|
{
|
|
@@ -112,10 +112,10 @@ dbt_row_p dbt_row_new(int _nf)
|
|
int dbt_row_free(dbt_table_p _dtp, dbt_row_p _drp)
|
|
int dbt_row_free(dbt_table_p _dtp, dbt_row_p _drp)
|
|
{
|
|
{
|
|
int i;
|
|
int i;
|
|
-
|
|
|
|
|
|
+
|
|
if(!_dtp || !_drp)
|
|
if(!_dtp || !_drp)
|
|
return -1;
|
|
return -1;
|
|
-
|
|
|
|
|
|
+
|
|
if(_drp->fields)
|
|
if(_drp->fields)
|
|
{
|
|
{
|
|
for(i=0; i<_dtp->nrcols; i++)
|
|
for(i=0; i<_dtp->nrcols; i++)
|
|
@@ -139,7 +139,7 @@ dbt_table_p dbt_table_new(const str *_tbname, const str *_dbname, const char *pa
|
|
dbt_table_p dtp = NULL;
|
|
dbt_table_p dtp = NULL;
|
|
if(!_tbname || !_dbname || !path)
|
|
if(!_tbname || !_dbname || !path)
|
|
return NULL;
|
|
return NULL;
|
|
-
|
|
|
|
|
|
+
|
|
dtp = (dbt_table_p)shm_malloc(sizeof(dbt_table_t));
|
|
dtp = (dbt_table_p)shm_malloc(sizeof(dbt_table_t));
|
|
if(!dtp)
|
|
if(!dtp)
|
|
goto done;
|
|
goto done;
|
|
@@ -154,7 +154,7 @@ dbt_table_p dbt_table_new(const str *_tbname, const str *_dbname, const char *pa
|
|
memcpy(dtp->name.s, _tbname->s, _tbname->len);
|
|
memcpy(dtp->name.s, _tbname->s, _tbname->len);
|
|
dtp->name.s[_tbname->len] = '\0';
|
|
dtp->name.s[_tbname->len] = '\0';
|
|
dtp->name.len = _tbname->len;
|
|
dtp->name.len = _tbname->len;
|
|
-
|
|
|
|
|
|
+
|
|
dtp->dbname.s = (char*)shm_malloc((_dbname->len+1)*sizeof(char));
|
|
dtp->dbname.s = (char*)shm_malloc((_dbname->len+1)*sizeof(char));
|
|
if(!dtp->dbname.s)
|
|
if(!dtp->dbname.s)
|
|
{
|
|
{
|
|
@@ -180,7 +180,7 @@ dbt_table_p dbt_table_new(const str *_tbname, const str *_dbname, const char *pa
|
|
dtp->mt = s.st_mtime;
|
|
dtp->mt = s.st_mtime;
|
|
LM_DBG("mtime is %d\n", (int)s.st_mtime);
|
|
LM_DBG("mtime is %d\n", (int)s.st_mtime);
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
done:
|
|
done:
|
|
return dtp;
|
|
return dtp;
|
|
}
|
|
}
|
|
@@ -191,7 +191,7 @@ done:
|
|
int dbt_table_free_rows(dbt_table_p _dtp)
|
|
int dbt_table_free_rows(dbt_table_p _dtp)
|
|
{
|
|
{
|
|
dbt_row_p _rp=NULL, _rp0=NULL;
|
|
dbt_row_p _rp=NULL, _rp0=NULL;
|
|
-
|
|
|
|
|
|
+
|
|
if(!_dtp || !_dtp->rows || !_dtp->colv)
|
|
if(!_dtp || !_dtp->rows || !_dtp->colv)
|
|
return -1;
|
|
return -1;
|
|
_rp = _dtp->rows;
|
|
_rp = _dtp->rows;
|
|
@@ -201,9 +201,9 @@ int dbt_table_free_rows(dbt_table_p _dtp)
|
|
_rp=_rp->next;
|
|
_rp=_rp->next;
|
|
dbt_row_free(_dtp, _rp0);
|
|
dbt_row_free(_dtp, _rp0);
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
dbt_table_update_flags(_dtp, DBT_TBFL_MODI, DBT_FL_SET, 1);
|
|
dbt_table_update_flags(_dtp, DBT_TBFL_MODI, DBT_FL_SET, 1);
|
|
-
|
|
|
|
|
|
+
|
|
_dtp->rows = NULL;
|
|
_dtp->rows = NULL;
|
|
_dtp->nrrows = 0;
|
|
_dtp->nrrows = 0;
|
|
|
|
|
|
@@ -217,12 +217,12 @@ int dbt_table_add_row(dbt_table_p _dtp, dbt_row_p _drp)
|
|
{
|
|
{
|
|
if(!_dtp || !_drp)
|
|
if(!_dtp || !_drp)
|
|
return -1;
|
|
return -1;
|
|
-
|
|
|
|
|
|
+
|
|
if(dbt_table_check_row(_dtp, _drp))
|
|
if(dbt_table_check_row(_dtp, _drp))
|
|
return -1;
|
|
return -1;
|
|
-
|
|
|
|
|
|
+
|
|
dbt_table_update_flags(_dtp, DBT_TBFL_MODI, DBT_FL_SET, 1);
|
|
dbt_table_update_flags(_dtp, DBT_TBFL_MODI, DBT_FL_SET, 1);
|
|
-
|
|
|
|
|
|
+
|
|
if(_dtp->rows)
|
|
if(_dtp->rows)
|
|
(_dtp->rows)->prev = _drp;
|
|
(_dtp->rows)->prev = _drp;
|
|
_drp->next = _dtp->rows;
|
|
_drp->next = _dtp->rows;
|
|
@@ -238,7 +238,7 @@ int dbt_table_add_row(dbt_table_p _dtp, dbt_row_p _drp)
|
|
int dbt_table_free(dbt_table_p _dtp)
|
|
int dbt_table_free(dbt_table_p _dtp)
|
|
{
|
|
{
|
|
dbt_column_p _cp=NULL, _cp0=NULL;
|
|
dbt_column_p _cp=NULL, _cp0=NULL;
|
|
-
|
|
|
|
|
|
+
|
|
if(!_dtp)
|
|
if(!_dtp)
|
|
return -1;
|
|
return -1;
|
|
|
|
|
|
@@ -246,10 +246,10 @@ int dbt_table_free(dbt_table_p _dtp)
|
|
shm_free(_dtp->name.s);
|
|
shm_free(_dtp->name.s);
|
|
if(_dtp->dbname.s)
|
|
if(_dtp->dbname.s)
|
|
shm_free(_dtp->dbname.s);
|
|
shm_free(_dtp->dbname.s);
|
|
-
|
|
|
|
|
|
+
|
|
if(_dtp->rows && _dtp->nrrows>0)
|
|
if(_dtp->rows && _dtp->nrrows>0)
|
|
dbt_table_free_rows(_dtp);
|
|
dbt_table_free_rows(_dtp);
|
|
-
|
|
|
|
|
|
+
|
|
_cp = _dtp->cols;
|
|
_cp = _dtp->cols;
|
|
while(_cp)
|
|
while(_cp)
|
|
{
|
|
{
|
|
@@ -272,7 +272,7 @@ int dbt_row_set_val(dbt_row_p _drp, dbt_val_p _vp, int _t, int _idx)
|
|
{
|
|
{
|
|
if(!_drp || !_vp || _idx<0)
|
|
if(!_drp || !_vp || _idx<0)
|
|
return -1;
|
|
return -1;
|
|
-
|
|
|
|
|
|
+
|
|
_drp->fields[_idx].nul = _vp->nul;
|
|
_drp->fields[_idx].nul = _vp->nul;
|
|
_drp->fields[_idx].type = _t;
|
|
_drp->fields[_idx].type = _t;
|
|
|
|
|
|
@@ -283,7 +283,7 @@ int dbt_row_set_val(dbt_row_p _drp, dbt_val_p _vp, int _t, int _idx)
|
|
case DB1_STR:
|
|
case DB1_STR:
|
|
case DB1_BLOB:
|
|
case DB1_BLOB:
|
|
_drp->fields[_idx].type = _t;
|
|
_drp->fields[_idx].type = _t;
|
|
- _drp->fields[_idx].val.str_val.s =
|
|
|
|
|
|
+ _drp->fields[_idx].val.str_val.s =
|
|
(char*)shm_malloc((_vp->val.str_val.len+1)*sizeof(char));
|
|
(char*)shm_malloc((_vp->val.str_val.len+1)*sizeof(char));
|
|
if(!_drp->fields[_idx].val.str_val.s)
|
|
if(!_drp->fields[_idx].val.str_val.s)
|
|
{
|
|
{
|
|
@@ -295,14 +295,14 @@ int dbt_row_set_val(dbt_row_p _drp, dbt_val_p _vp, int _t, int _idx)
|
|
_drp->fields[_idx].val.str_val.s[_vp->val.str_val.len] = '\0';
|
|
_drp->fields[_idx].val.str_val.s[_vp->val.str_val.len] = '\0';
|
|
_drp->fields[_idx].val.str_val.len = _vp->val.str_val.len;
|
|
_drp->fields[_idx].val.str_val.len = _vp->val.str_val.len;
|
|
break;
|
|
break;
|
|
-
|
|
|
|
|
|
+
|
|
case DB1_STRING:
|
|
case DB1_STRING:
|
|
_drp->fields[_idx].type = _t;
|
|
_drp->fields[_idx].type = _t;
|
|
_drp->fields[_idx].val.str_val.len=_vp->val.str_val.len;
|
|
_drp->fields[_idx].val.str_val.len=_vp->val.str_val.len;
|
|
-
|
|
|
|
- _drp->fields[_idx].val.str_val.s =
|
|
|
|
|
|
+
|
|
|
|
+ _drp->fields[_idx].val.str_val.s =
|
|
(char*)shm_malloc((_drp->fields[_idx].val.str_val.len+1)
|
|
(char*)shm_malloc((_drp->fields[_idx].val.str_val.len+1)
|
|
- *sizeof(char));
|
|
|
|
|
|
+ *sizeof(char));
|
|
if(!_drp->fields[_idx].val.str_val.s)
|
|
if(!_drp->fields[_idx].val.str_val.s)
|
|
{
|
|
{
|
|
_drp->fields[_idx].nul = 1;
|
|
_drp->fields[_idx].nul = 1;
|
|
@@ -312,33 +312,33 @@ int dbt_row_set_val(dbt_row_p _drp, dbt_val_p _vp, int _t, int _idx)
|
|
_drp->fields[_idx].val.str_val.len);
|
|
_drp->fields[_idx].val.str_val.len);
|
|
_drp->fields[_idx].val.str_val.s[_drp->fields[_idx].val.str_val.len] = '\0';
|
|
_drp->fields[_idx].val.str_val.s[_drp->fields[_idx].val.str_val.len] = '\0';
|
|
break;
|
|
break;
|
|
-
|
|
|
|
|
|
+
|
|
case DB1_DOUBLE:
|
|
case DB1_DOUBLE:
|
|
_drp->fields[_idx].type = DB1_DOUBLE;
|
|
_drp->fields[_idx].type = DB1_DOUBLE;
|
|
_drp->fields[_idx].val.double_val = _vp->val.double_val;
|
|
_drp->fields[_idx].val.double_val = _vp->val.double_val;
|
|
break;
|
|
break;
|
|
-
|
|
|
|
|
|
+
|
|
case DB1_INT:
|
|
case DB1_INT:
|
|
_drp->fields[_idx].type = DB1_INT;
|
|
_drp->fields[_idx].type = DB1_INT;
|
|
_drp->fields[_idx].val.int_val = _vp->val.int_val;
|
|
_drp->fields[_idx].val.int_val = _vp->val.int_val;
|
|
break;
|
|
break;
|
|
-
|
|
|
|
|
|
+
|
|
case DB1_DATETIME:
|
|
case DB1_DATETIME:
|
|
_drp->fields[_idx].type = _t;
|
|
_drp->fields[_idx].type = _t;
|
|
_drp->fields[_idx].val.int_val = (int)_vp->val.time_val;
|
|
_drp->fields[_idx].val.int_val = (int)_vp->val.time_val;
|
|
break;
|
|
break;
|
|
-
|
|
|
|
|
|
+
|
|
case DB1_BITMAP:
|
|
case DB1_BITMAP:
|
|
_drp->fields[_idx].type = DB1_INT;
|
|
_drp->fields[_idx].type = DB1_INT;
|
|
_drp->fields[_idx].val.int_val = (int)_vp->val.bitmap_val;
|
|
_drp->fields[_idx].val.int_val = (int)_vp->val.bitmap_val;
|
|
break;
|
|
break;
|
|
-
|
|
|
|
|
|
+
|
|
default:
|
|
default:
|
|
_drp->fields[_idx].nul = 1;
|
|
_drp->fields[_idx].nul = 1;
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -349,10 +349,10 @@ int dbt_row_update_val(dbt_row_p _drp, dbt_val_p _vp, int _t, int _idx)
|
|
{
|
|
{
|
|
if(!_drp || !_vp || _idx<0)
|
|
if(!_drp || !_vp || _idx<0)
|
|
return -1;
|
|
return -1;
|
|
-
|
|
|
|
|
|
+
|
|
_drp->fields[_idx].nul = _vp->nul;
|
|
_drp->fields[_idx].nul = _vp->nul;
|
|
_drp->fields[_idx].type = _t;
|
|
_drp->fields[_idx].type = _t;
|
|
-
|
|
|
|
|
|
+
|
|
if(!_vp->nul)
|
|
if(!_vp->nul)
|
|
{
|
|
{
|
|
switch(_t)
|
|
switch(_t)
|
|
@@ -363,8 +363,8 @@ int dbt_row_update_val(dbt_row_p _drp, dbt_val_p _vp, int _t, int _idx)
|
|
// free if already exists
|
|
// free if already exists
|
|
if(_drp->fields[_idx].val.str_val.s)
|
|
if(_drp->fields[_idx].val.str_val.s)
|
|
shm_free(_drp->fields[_idx].val.str_val.s);
|
|
shm_free(_drp->fields[_idx].val.str_val.s);
|
|
-
|
|
|
|
- _drp->fields[_idx].val.str_val.s =
|
|
|
|
|
|
+
|
|
|
|
+ _drp->fields[_idx].val.str_val.s =
|
|
(char*)shm_malloc((_vp->val.str_val.len+1)*sizeof(char));
|
|
(char*)shm_malloc((_vp->val.str_val.len+1)*sizeof(char));
|
|
if(!_drp->fields[_idx].val.str_val.s)
|
|
if(!_drp->fields[_idx].val.str_val.s)
|
|
{
|
|
{
|
|
@@ -376,7 +376,7 @@ int dbt_row_update_val(dbt_row_p _drp, dbt_val_p _vp, int _t, int _idx)
|
|
_drp->fields[_idx].val.str_val.s[_vp->val.str_val.len] = '\0';
|
|
_drp->fields[_idx].val.str_val.s[_vp->val.str_val.len] = '\0';
|
|
_drp->fields[_idx].val.str_val.len = _vp->val.str_val.len;
|
|
_drp->fields[_idx].val.str_val.len = _vp->val.str_val.len;
|
|
break;
|
|
break;
|
|
-
|
|
|
|
|
|
+
|
|
case DB1_STRING:
|
|
case DB1_STRING:
|
|
/* free if already exists */
|
|
/* free if already exists */
|
|
if(_drp->fields[_idx].val.str_val.s)
|
|
if(_drp->fields[_idx].val.str_val.s)
|
|
@@ -388,10 +388,10 @@ int dbt_row_update_val(dbt_row_p _drp, dbt_val_p _vp, int _t, int _idx)
|
|
else
|
|
else
|
|
_drp->fields[_idx].val.str_val.len
|
|
_drp->fields[_idx].val.str_val.len
|
|
=strlen(_vp->val.string_val);
|
|
=strlen(_vp->val.string_val);
|
|
-
|
|
|
|
- _drp->fields[_idx].val.str_val.s =
|
|
|
|
|
|
+
|
|
|
|
+ _drp->fields[_idx].val.str_val.s =
|
|
(char*)shm_malloc((_drp->fields[_idx].val.str_val.len+1)
|
|
(char*)shm_malloc((_drp->fields[_idx].val.str_val.len+1)
|
|
- *sizeof(char));
|
|
|
|
|
|
+ *sizeof(char));
|
|
if(!_drp->fields[_idx].val.str_val.s)
|
|
if(!_drp->fields[_idx].val.str_val.s)
|
|
{
|
|
{
|
|
_drp->fields[_idx].nul = 1;
|
|
_drp->fields[_idx].nul = 1;
|
|
@@ -401,34 +401,34 @@ int dbt_row_update_val(dbt_row_p _drp, dbt_val_p _vp, int _t, int _idx)
|
|
_drp->fields[_idx].val.str_val.len);
|
|
_drp->fields[_idx].val.str_val.len);
|
|
_drp->fields[_idx].val.str_val.s[_vp->val.str_val.len] = '\0';
|
|
_drp->fields[_idx].val.str_val.s[_vp->val.str_val.len] = '\0';
|
|
break;
|
|
break;
|
|
-
|
|
|
|
|
|
+
|
|
case DB1_DOUBLE:
|
|
case DB1_DOUBLE:
|
|
_drp->fields[_idx].type = _t;
|
|
_drp->fields[_idx].type = _t;
|
|
_drp->fields[_idx].val.double_val = _vp->val.double_val;
|
|
_drp->fields[_idx].val.double_val = _vp->val.double_val;
|
|
break;
|
|
break;
|
|
-
|
|
|
|
|
|
+
|
|
case DB1_INT:
|
|
case DB1_INT:
|
|
_drp->fields[_idx].type = _t;
|
|
_drp->fields[_idx].type = _t;
|
|
_drp->fields[_idx].val.int_val = _vp->val.int_val;
|
|
_drp->fields[_idx].val.int_val = _vp->val.int_val;
|
|
break;
|
|
break;
|
|
-
|
|
|
|
|
|
+
|
|
case DB1_DATETIME:
|
|
case DB1_DATETIME:
|
|
_drp->fields[_idx].type = _t;
|
|
_drp->fields[_idx].type = _t;
|
|
_drp->fields[_idx].val.int_val = (int)_vp->val.time_val;
|
|
_drp->fields[_idx].val.int_val = (int)_vp->val.time_val;
|
|
break;
|
|
break;
|
|
-
|
|
|
|
|
|
+
|
|
case DB1_BITMAP:
|
|
case DB1_BITMAP:
|
|
_drp->fields[_idx].type = _t;
|
|
_drp->fields[_idx].type = _t;
|
|
_drp->fields[_idx].val.int_val = (int)_vp->val.bitmap_val;
|
|
_drp->fields[_idx].val.int_val = (int)_vp->val.bitmap_val;
|
|
break;
|
|
break;
|
|
-
|
|
|
|
|
|
+
|
|
default:
|
|
default:
|
|
LM_ERR("unsupported type %d in update\n",_t);
|
|
LM_ERR("unsupported type %d in update\n",_t);
|
|
_drp->fields[_idx].nul = 1;
|
|
_drp->fields[_idx].nul = 1;
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -440,10 +440,10 @@ int dbt_table_check_row(dbt_table_p _dtp, dbt_row_p _drp)
|
|
int i;
|
|
int i;
|
|
if(!_dtp || _dtp->nrcols <= 0 || !_drp)
|
|
if(!_dtp || _dtp->nrcols <= 0 || !_drp)
|
|
return -1;
|
|
return -1;
|
|
-
|
|
|
|
|
|
+
|
|
for(i=0; i<_dtp->nrcols; i++)
|
|
for(i=0; i<_dtp->nrcols; i++)
|
|
{
|
|
{
|
|
- if(!_drp->fields[i].nul
|
|
|
|
|
|
+ if(!_drp->fields[i].nul
|
|
&& dbt_is_neq_type(_dtp->colv[i]->type, _drp->fields[i].type))
|
|
&& dbt_is_neq_type(_dtp->colv[i]->type, _drp->fields[i].type))
|
|
{
|
|
{
|
|
LM_ERR("incompatible types - field %d [%d/%d]\n",i,
|
|
LM_ERR("incompatible types - field %d [%d/%d]\n",i,
|
|
@@ -452,7 +452,7 @@ int dbt_table_check_row(dbt_table_p _dtp, dbt_row_p _drp)
|
|
}
|
|
}
|
|
if(_dtp->colv[i]->flag & DBT_FLAG_NULL)
|
|
if(_dtp->colv[i]->flag & DBT_FLAG_NULL)
|
|
continue;
|
|
continue;
|
|
-
|
|
|
|
|
|
+
|
|
if(!_drp->fields[i].nul)
|
|
if(!_drp->fields[i].nul)
|
|
continue;
|
|
continue;
|
|
|
|
|
|
@@ -468,7 +468,7 @@ int dbt_table_check_row(dbt_table_p _dtp, dbt_row_p _drp)
|
|
LM_ERR("null value not allowed - field %d\n",i);
|
|
LM_ERR("null value not allowed - field %d\n",i);
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -479,15 +479,15 @@ int dbt_table_update_flags(dbt_table_p _dtp, int _f, int _o, int _m)
|
|
{
|
|
{
|
|
if(!_dtp)
|
|
if(!_dtp)
|
|
return -1;
|
|
return -1;
|
|
-
|
|
|
|
|
|
+
|
|
if(_o == DBT_FL_SET)
|
|
if(_o == DBT_FL_SET)
|
|
_dtp->flag |= _f;
|
|
_dtp->flag |= _f;
|
|
else if(_o == DBT_FL_UNSET)
|
|
else if(_o == DBT_FL_UNSET)
|
|
_dtp->flag &= ~_f;
|
|
_dtp->flag &= ~_f;
|
|
-
|
|
|
|
|
|
+
|
|
if(_m)
|
|
if(_m)
|
|
_dtp->mark = (int)time(NULL);
|
|
_dtp->mark = (int)time(NULL);
|
|
-
|
|
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|