rpm  5.4.10
rpmds-rb.c
Go to the documentation of this file.
1 
6 #include "system.h"
7 #include "rpm-rb.h"
8 
9 #include "rpmds-rb.h"
10 
11 #ifdef NOTYET
12 #include <argv.h>
13 #include <mire.h>
14 #endif
15 
16 #define _RPMDS_INTERNAL
17 #include <rpmtag.h>
18 #include <rpmtypes.h>
19 #include <rpmtag.h>
20 #include <rpmio.h>
21 #include <rpmds.h>
22 
23 #include "../debug.h"
24 
25 
26 VALUE rpmdsClass;
27 
28 
29 /*@unchecked@*/
30 static int _debug = 0;
31 
32 /* --- helpers */
33 static void *
34 rpmds_ptr(VALUE s)
35 {
36  void *ptr;
37  Data_Get_Struct(s, void, ptr);
38  return ptr;
39 }
40 
41 /* --- Object methods */
42 
43 static void
44 initMethods(VALUE klass)
45 {
46 }
47 
48 /* --- Object properties */
49 static VALUE
51 {
52 if (_debug)
53 fprintf(stderr, "==> %s(0x%lx)\n", __FUNCTION__, s);
54  return INT2FIX(_debug);
55 }
56 
57 static VALUE
58 rpmds_debug_set(VALUE s, VALUE v)
59 {
60 if (_debug)
61 fprintf(stderr, "==> %s(0x%lx, 0x%lx)\n", __FUNCTION__, s, v);
62  return INT2FIX(_debug = FIX2INT(v));
63 }
64 
65 static VALUE
67 {
68  rpmds ds = rpmds_ptr(s);
69 if (_debug)
70 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds);
71  return INT2FIX(rpmdsCount(ds));
72 }
73 
74 /* XXX FIXME: what to call the method? */
75 static VALUE
77 {
78  rpmds ds = rpmds_ptr(s);
79 if (_debug)
80 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds);
81  return rb_str_new2(rpmdsType(ds));
82 }
83 
84 static VALUE
85 rpmds_Ix_get(VALUE s)
86 {
87  rpmds ds = rpmds_ptr(s);
88 if (_debug)
89 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds);
90  return INT2FIX(rpmdsIx(ds));
91 }
92 
93 static VALUE
94 rpmds_Ix_set(VALUE s, VALUE v)
95 {
96  rpmds ds = rpmds_ptr(s);
97  int ix = FIX2INT(v);
98 if (_debug)
99 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds);
100  if (ix != rpmdsIx(ds)) {
101  (void) rpmdsSetIx(ds, ix-1);
102  /* XXX flush and recreate N and DNEVR with a rpmdsNext() step */
103  (void) rpmdsNext(ds);
104  }
105  return INT2FIX(rpmdsIx(ds));
106 }
107 
108 static VALUE
109 rpmds_BT_get(VALUE s)
110 {
111  rpmds ds = rpmds_ptr(s);
112 if (_debug)
113 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds);
114  return INT2FIX(rpmdsBT(ds));
115 }
116 
117 static VALUE
118 rpmds_BT_set(VALUE s, VALUE v)
119 {
120  rpmds ds = rpmds_ptr(s);
121  int BT = FIX2INT(v);
122 if (_debug)
123 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds);
124  (void) rpmdsSetBT(ds, BT);
125  return INT2FIX(rpmdsBT(ds));
126 }
127 
128 static VALUE
130 {
131  rpmds ds = rpmds_ptr(s);
132 if (_debug)
133 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds);
134  return INT2FIX(rpmdsColor(ds));
135 }
136 
137 static VALUE
138 rpmds_Color_set(VALUE s, VALUE v)
139 {
140  rpmds ds = rpmds_ptr(s);
141  int color = FIX2INT(v);
142 if (_debug)
143 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds);
144  (void) rpmdsSetColor(ds, color);
145  return INT2FIX(rpmdsColor(ds));
146 }
147 
148 static VALUE
150 {
151  rpmds ds = rpmds_ptr(s);
152 if (_debug)
153 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds);
154  return INT2FIX(rpmdsNoPromote(ds));
155 }
156 
157 static VALUE
158 rpmds_NoPromote_set(VALUE s, VALUE v)
159 {
160  rpmds ds = rpmds_ptr(s);
161  int nopromote = FIX2INT(v);
162 if (_debug)
163 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds);
164  (void) rpmdsSetNoPromote(ds, nopromote);
165  return INT2FIX(rpmdsNoPromote(ds));
166 }
167 
168 static VALUE
169 rpmds_N_get(VALUE s)
170 {
171  rpmds ds = rpmds_ptr(s);
172 if (_debug)
173 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds);
174  return rb_str_new2(rpmdsN(ds));
175 }
176 
177 static VALUE
179 {
180  rpmds ds = rpmds_ptr(s);
181 if (_debug)
182 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds);
183  return rb_str_new2(rpmdsEVR(ds));
184 }
185 
186 static VALUE
188 {
189  rpmds ds = rpmds_ptr(s);
190 if (_debug)
191 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds);
192  return INT2FIX(rpmdsFlags(ds));
193 }
194 
195 static VALUE
197 {
198  rpmds ds = rpmds_ptr(s);
199 if (_debug)
200 fprintf(stderr, "==> %s(0x%lx) ptr %p\n", __FUNCTION__, s, ds);
201  return rb_str_new2(rpmdsDNEVR(ds));
202 }
203 
204 static void
205 initProperties(VALUE klass)
206 {
207  rb_define_method(klass, "debug", rpmds_debug_get, 0);
208  rb_define_method(klass, "debug=", rpmds_debug_set, 1);
209  rb_define_method(klass, "length", rpmds_Count_get, 0);
210  rb_define_method(klass, "ix", rpmds_Ix_get, 0);
211  rb_define_method(klass, "ix=", rpmds_Ix_set, 1);
212  rb_define_method(klass, "Type", rpmds_Type_get, 0);
213  rb_define_method(klass, "buildtime", rpmds_BT_get, 0);
214  rb_define_method(klass, "buildtime=", rpmds_BT_set, 1);
215  rb_define_method(klass, "color", rpmds_Color_get, 0);
216  rb_define_method(klass, "color=", rpmds_Color_set, 1);
217  rb_define_method(klass, "nopromote", rpmds_NoPromote_get, 0);
218  rb_define_method(klass, "nopromote=", rpmds_NoPromote_set, 1);
219  rb_define_method(klass, "N", rpmds_N_get, 0);
220  rb_define_method(klass, "EVR", rpmds_EVR_get, 0);
221  rb_define_method(klass, "F", rpmds_Flags_get, 0);
222  rb_define_method(klass, "DNEVR", rpmds_DNEVR_get, 0);
223 }
224 
225 /* --- Object ctors/dtors */
226 static void
228 {
229 if (_debug)
230 fprintf(stderr, "==> %s(%p)\n", __FUNCTION__, ds);
231  ds = rpmdsFree(ds);
232 }
233 
234 static VALUE
235 rpmds_new(int argc, VALUE *argv, VALUE s)
236 {
237  VALUE v_hdr, v_tag;
238  rpmTag tag = RPMTAG_NAME;
239  int flags = 0;
240  rpmds ds;
241 
242  rb_scan_args(argc, argv, "02", &v_hdr, &v_tag);
243 
244  if (!NIL_P(v_tag))
245  tag = FIX2INT(v_tag);
246 
247  if (!NIL_P(v_hdr)) {
248  Header h = rpmds_ptr(v_hdr);
249  ds = rpmdsNew(h, tag, flags);
250  } else
251  (void) rpmdsRpmlib(&ds, NULL);
252 
253 if (_debug)
254 fprintf(stderr, "==> %s(%p[%d], 0x%lx) mi %p\n", __FUNCTION__, argv, argc, s, ds);
255  return Data_Wrap_Struct(s, 0, rpmds_free, ds);
256 }
257 
258 /* --- Class initialization */
259 
260 void
262 {
263  rpmdsClass = rb_define_class_under(rpmModule, "Ds", rb_cObject);
264 if (_debug)
265 fprintf(stderr, "==> %s() rpmdsClass 0x%lx\n", __FUNCTION__, rpmdsClass);
266 #ifdef NOTYET
267  rb_include_module(rpmdsClass, rb_mEnumerable);
268 #endif
269  rb_define_singleton_method(rpmdsClass, "new", rpmds_new, -1);
272 }
273 
274 VALUE
275 rpmrb_NewDs(void *_ds)
276 {
277  return Data_Wrap_Struct(rpmdsClass, 0, rpmds_free, _ds);
278 }
279