rpm  5.4.15
rpmbag.c
Go to the documentation of this file.
1 
5 #include "system.h"
6 
7 #include <rpmiotypes.h>
8 #include <rpmio.h> /* for *Pool methods */
9 #include <rpmlog.h>
10 #include <rpmurl.h>
11 #define _RPMBAG_INTERNAL
12 #include <rpmbag.h>
13 
14 #include "debug.h"
15 
16 #ifdef __cplusplus
17 GENfree(rpmsdb)
18 GENfree(rpmsdb *)
19 #endif /* __cplusplus */
20 
21 /*@unchecked@*/
22 int _rpmbag_debug = 0;
23 
24 static size_t _maxnsdbp = 5;
25 
26 static void rpmbagFini(void * _bag)
27  /*@globals fileSystem @*/
28  /*@modifies *_bag, fileSystem @*/
29 {
30  rpmbag bag = (rpmbag) _bag;
31 
32  bag->sdbp = _free(bag->sdbp);
33  bag->nsdbp = 0;
34  bag->fn = _free(bag->fn);
35  bag->flags = 0;
36 }
37 
38 /*@unchecked@*/ /*@only@*/ /*@null@*/
40 
41 static rpmbag rpmbagGetPool(/*@null@*/ rpmioPool pool)
42  /*@globals _rpmbagPool, fileSystem @*/
43  /*@modifies pool, _rpmbagPool, fileSystem @*/
44 {
45  rpmbag bag;
46 
47  if (_rpmbagPool == NULL) {
48  _rpmbagPool = rpmioNewPool("bag", sizeof(*bag), -1, _rpmbag_debug,
49  NULL, NULL, rpmbagFini);
50  pool = _rpmbagPool;
51  }
52  bag = (rpmbag) rpmioGetPool(pool, sizeof(*bag));
53  memset(((char *)bag)+sizeof(bag->_item), 0, sizeof(*bag)-sizeof(bag->_item));
54  return bag;
55 }
56 
57 rpmbag rpmbagNew(const char * fn, int flags)
58 {
59  rpmbag bag = rpmbagGetPool(_rpmbagPool);
60 
61  if (fn)
62  bag->fn = xstrdup(fn);
63  bag->flags = flags;
64 
65  bag->sdbp = (rpmsdb *) xcalloc(_maxnsdbp, sizeof(*bag->sdbp));
66 
67  return rpmbagLink(bag);
68 }
69 
70 int rpmbagAdd(rpmbag bag, void *_db, int dbmode)
71 {
72  if (bag && bag->sdbp && bag->nsdbp < _maxnsdbp) {
73  rpmsdb * sdbp = bag->sdbp;
74  int i = bag->nsdbp++; /* XXX find empty slot */
75  sdbp[i] = (rpmsdb) xcalloc(1, sizeof(*sdbp[i]));
76  sdbp[i]->dbmode = dbmode;
77  sdbp[i]->_db = _db;
78  }
79 
80  return 0;
81 }
82 
83 int rpmbagDel(rpmbag bag, int i)
84 {
85 
86  if (bag && bag->sdbp && i >= 0 && i <= (int)_maxnsdbp) {
87  rpmsdb * sdbp = bag->sdbp;
88  memset(sdbp[i], 0, sizeof(*sdbp[i]));
89  sdbp[i] = _free(sdbp[i]);
90  if ((i+1) == (int)bag->nsdbp) /* XXX find empty slot */
91  bag->nsdbp--;
92  }
93 
94  return 0;
95 }
char * xstrdup(const char *str)
Definition: rpmmalloc.c:321
rpmbag rpmbagLink(rpmbag bag)
Reference a bag wrapper instance.
rpmbag rpmbagNew(const char *fn, int flags)
Create and load a bag wrapper.
Definition: rpmbag.c:57
rpmioPool _rpmbagPool
Definition: rpmbag.c:39
struct rpmsdb_s * rpmsdb
Definition: rpmbag.h:16
Yet Another syslog(3) API clone.
void * xcalloc(size_t nmemb, size_t size)
Definition: rpmmalloc.c:300
rpmioItem rpmioGetPool(rpmioPool pool, size_t size)
Get unused item from pool, or alloc a new item.
Definition: rpmmalloc.c:220
int rpmbagDel(rpmbag bag, int i)
Definition: rpmbag.c:83
int _rpmbag_debug
Definition: rpmbag.c:22
static rpmbag rpmbagGetPool(rpmioPool pool)
Definition: rpmbag.c:41
const char const bson int mongo_write_concern int flags
Definition: mongo.h:485
int rpmbagAdd(rpmbag bag, void *_db, int dbmode)
Definition: rpmbag.c:70
const char const int i
Definition: bson.h:778
rpmioPool rpmioNewPool(const char *name, size_t size, int limit, int flags, char *(*dbg)(void *item), void(*init)(void *item), void(*fini)(void *item))
Create a memory pool.
Definition: rpmmalloc.c:109
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
Definition: rpmiotypes.h:756
static size_t _maxnsdbp
Definition: rpmbag.c:24
static void rpmbagFini(void *_bag)
Definition: rpmbag.c:26
struct rpmbag_s * rpmbag
Definition: rpmbag.h:15