2 Unix SMB/CIFS implementation.
3 Utility functions for the dbwrap API
4 Copyright (C) Volker Lendecke 2007
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 int32_t dbwrap_fetch_int32(struct db_context
*db
, const char *keystr
)
28 if (db
->fetch(db
, NULL
, string_term_tdb_data(keystr
), &dbuf
) != 0) {
32 if ((dbuf
.dptr
== NULL
) || (dbuf
.dsize
!= sizeof(int32_t))) {
33 TALLOC_FREE(dbuf
.dptr
);
37 ret
= IVAL(dbuf
.dptr
, 0);
38 TALLOC_FREE(dbuf
.dptr
);
42 int dbwrap_store_int32(struct db_context
*db
, const char *keystr
, int32_t v
)
44 struct db_record
*rec
;
48 rec
= db
->fetch_locked(db
, NULL
, string_term_tdb_data(keystr
));
53 SIVAL(&v_store
, 0, v
);
55 status
= rec
->store(rec
, make_tdb_data((const uint8
*)&v_store
,
59 return NT_STATUS_IS_OK(status
) ? 0 : -1;
62 uint32_t dbwrap_change_uint32_atomic(struct db_context
*db
, const char *keystr
,
63 uint32_t *oldval
, uint32_t change_val
)
65 struct db_record
*rec
;
69 if (!(rec
= db
->fetch_locked(db
, NULL
,
70 string_term_tdb_data(keystr
)))) {
74 if ((rec
->value
.dptr
!= NULL
)
75 && (rec
->value
.dsize
== sizeof(val
))) {
76 val
= IVAL(rec
->value
.dptr
, 0);
81 data
.dsize
= sizeof(val
);
82 data
.dptr
= (uint8
*)&val
;
84 rec
->store(rec
, data
, TDB_REPLACE
);
91 int32
dbwrap_change_int32_atomic(struct db_context
*db
, const char *keystr
,
92 int32
*oldval
, int32 change_val
)
94 struct db_record
*rec
;
98 if (!(rec
= db
->fetch_locked(db
, NULL
,
99 string_term_tdb_data(keystr
)))) {
103 if ((rec
->value
.dptr
!= NULL
)
104 && (rec
->value
.dsize
== sizeof(val
))) {
105 val
= IVAL(rec
->value
.dptr
, 0);
110 data
.dsize
= sizeof(val
);
111 data
.dptr
= (uint8
*)&val
;
113 rec
->store(rec
, data
, TDB_REPLACE
);