00001 #ifndef H_RPMTE
00002 #define H_RPMTE
00003
00008 #include <argv.h>
00009
00012
00013
00014 extern int _rpmte_debug;
00015
00016
00020 typedef struct tsortInfo_s * tsortInfo;
00021
00025 typedef struct rpmtsi_s * rpmtsi;
00026
00030 typedef enum rpmElementType_e {
00031 TR_ADDED = (1 << 0),
00032 TR_REMOVED = (1 << 1)
00033 } rpmElementType;
00034
00035 #if defined(_RPMTE_INTERNAL)
00036
00039
00040 struct tsortInfo_s {
00041 union {
00042 int count;
00043
00044 rpmte suc;
00045 } tsi_u;
00046 #define tsi_count tsi_u.count
00047 #define tsi_suc tsi_u.suc
00048
00049 tsortInfo tsi_next;
00050
00051 rpmte tsi_chain;
00052 int tsi_tagn;
00053 int tsi_reqx;
00054 int tsi_queued;
00055 int tsi_qcnt;
00056 };
00057
00058
00062 struct rpmChainLink_s {
00063
00064 ARGV_t Pkgid;
00065
00066 ARGV_t Hdrid;
00067
00068 ARGV_t NEVRA;
00069 };
00070
00074 struct rpmte_s {
00075 rpmElementType type;
00077
00078 Header h;
00079
00080 const char * NEVR;
00081
00082 const char * NEVRA;
00083
00084 const char * pkgid;
00085
00086 const char * hdrid;
00087
00088 const char * name;
00089
00090 char * epoch;
00091
00092 char * version;
00093
00094 char * release;
00095
00096 const char * arch;
00097
00098 const char * os;
00099 int isSource;
00101 rpmte parent;
00102 int degree;
00103 int npreds;
00104 int tree;
00105 int depth;
00106 int breadth;
00107 unsigned int db_instance;
00108
00109 tsortInfo tsi;
00111
00112 rpmPRCO PRCO;
00114
00115 rpmfi fi;
00117 uint_32 color;
00118 uint_32 pkgFileSize;
00120
00121 fnpyKey key;
00122
00123 rpmRelocation relocs;
00124 int nrelocs;
00125 int autorelocatex;
00126
00127 FD_t fd;
00129 struct rpmChainLink_s blink;
00130 struct rpmChainLink_s flink;
00131 int linkFailed;
00132 int done;
00134 int installed;
00135 int downgrade;
00137 struct {
00138
00139 alKey addedKey;
00140 struct {
00141
00142 alKey dependsOnKey;
00143 int dboffset;
00144 } removed;
00145 } u;
00146
00147 };
00148
00152 struct rpmtsi_s {
00153
00154 rpmts ts;
00155 int reverse;
00156 int ocsave;
00157 int oc;
00158 };
00159
00160 #endif
00161
00162 #ifdef __cplusplus
00163 extern "C" {
00164 #endif
00165
00171
00172 rpmte rpmteFree( rpmte te)
00173
00174 ;
00175
00187
00188 rpmte rpmteNew(const rpmts ts, Header h, rpmElementType type,
00189 fnpyKey key,
00190 rpmRelocation relocs,
00191 int dboffset,
00192 alKey pkgKey)
00193
00194 ;
00195
00201 extern Header rpmteHeader(rpmte te)
00202 ;
00203
00210 extern Header rpmteSetHeader(rpmte te, Header h)
00211 ;
00212
00218 rpmElementType rpmteType(rpmte te)
00219 ;
00220
00226
00227 extern const char * rpmteN(rpmte te)
00228 ;
00229
00235
00236 extern const char * rpmteE(rpmte te)
00237 ;
00238
00244
00245 extern const char * rpmteV(rpmte te)
00246 ;
00247
00253
00254 extern const char * rpmteR(rpmte te)
00255 ;
00256
00262
00263 extern const char * rpmteA(rpmte te)
00264 ;
00265
00271
00272 extern const char * rpmteO(rpmte te)
00273 ;
00274
00280 extern int rpmteIsSource(rpmte te)
00281 ;
00282
00288 uint_32 rpmteColor(rpmte te)
00289 ;
00290
00297 uint_32 rpmteSetColor(rpmte te, uint_32 color)
00298 ;
00299
00305 unsigned int rpmteDBInstance(rpmte te)
00306 ;
00307
00314 void rpmteSetDBInstance(rpmte te, unsigned int instance)
00315 ;
00316
00323 uint_32 rpmtePkgFileSize(rpmte te)
00324 ;
00325
00331 int rpmteDepth(rpmte te)
00332 ;
00333
00340 int rpmteSetDepth(rpmte te, int ndepth)
00341 ;
00342
00348 int rpmteBreadth(rpmte te)
00349 ;
00350
00357 int rpmteSetBreadth(rpmte te, int nbreadth)
00358 ;
00359
00365 int rpmteNpreds(rpmte te)
00366 ;
00367
00374 int rpmteSetNpreds(rpmte te, int npreds)
00375 ;
00376
00382 int rpmteTree(rpmte te)
00383 ;
00384
00391 int rpmteSetTree(rpmte te, int ntree)
00392 ;
00393
00399
00400 rpmte rpmteParent(rpmte te)
00401 ;
00402
00409
00410 rpmte rpmteSetParent(rpmte te, rpmte pte)
00411 ;
00412
00418 int rpmteDegree(rpmte te)
00419 ;
00420
00427 int rpmteSetDegree(rpmte te, int ndegree)
00428 ;
00429
00435 tsortInfo rpmteTSI(rpmte te)
00436 ;
00437
00442 void rpmteFreeTSI(rpmte te)
00443 ;
00444
00449 void rpmteNewTSI(rpmte te)
00450 ;
00451
00456
00457 void rpmteCleanDS(rpmte te)
00458 ;
00459
00465
00466 alKey rpmteAddedKey(rpmte te)
00467 ;
00468
00475
00476 alKey rpmteSetAddedKey(rpmte te,
00477 alKey npkgKey)
00478 ;
00479
00485 int rpmteDBOffset(rpmte te)
00486 ;
00487
00493
00494 extern const char * rpmteNEVR(rpmte te)
00495 ;
00496
00502
00503
00504 extern const char * rpmteNEVRA(rpmte te)
00505 ;
00506
00507
00513
00514
00515 extern const char * rpmtePkgid(rpmte te)
00516 ;
00517
00518
00524
00525
00526 extern const char * rpmteHdrid(rpmte te)
00527 ;
00528
00529
00535 FD_t rpmteFd(rpmte te)
00536 ;
00537
00543
00544 fnpyKey rpmteKey(rpmte te)
00545 ;
00546
00553 rpmds rpmteDS(rpmte te, rpmTag tag)
00554 ;
00555
00562 rpmfi rpmteFI(rpmte te, rpmTag tag)
00563 ;
00564
00570
00571 void rpmteColorDS(rpmte te, rpmTag tag)
00572 ;
00573
00574
00583 int rpmteChain(rpmte p, rpmte q, Header oh, const char * msg)
00584 ;
00585
00586 #define RPMTE_CHAIN_END "CHAIN END"
00593 int rpmtsiOc(rpmtsi tsi)
00594 ;
00595
00601
00602 rpmtsi rpmtsiFree( rpmtsi tsi)
00603
00604 ;
00605
00613
00614 rpmtsi XrpmtsiFree( rpmtsi tsi,
00615 const char * fn, unsigned int ln)
00616
00617 ;
00618 #define rpmtsiFree(_tsi) XrpmtsiFree(_tsi, __FILE__, __LINE__)
00619
00625
00626 rpmtsi rpmtsiInit(rpmts ts)
00627 ;
00628
00636
00637 rpmtsi XrpmtsiInit(rpmts ts,
00638 const char * fn, unsigned int ln)
00639 ;
00640 #define rpmtsiInit(_ts) XrpmtsiInit(_ts, __FILE__, __LINE__)
00641
00648
00649 rpmte rpmtsiNext(rpmtsi tsi, rpmElementType type)
00650 ;
00651
00652 #if !defined(SWIG)
00653 #if defined(_RPMTE_INTERNAL)
00654 static inline void rpmtePrintID(rpmte p)
00655
00656
00657 {
00658 if (p != NULL) {
00659 if (p->blink.Pkgid) argvPrint("blink.Pkgid", p->blink.Pkgid, NULL);
00660 if (p->blink.Hdrid) argvPrint("blink.Hdrid", p->blink.Hdrid, NULL);
00661 if (p->blink.NEVRA) argvPrint("blink.NEVRA", p->blink.NEVRA, NULL);
00662 if (p->flink.Pkgid) argvPrint("flink.Pkgid", p->flink.Pkgid, NULL);
00663 if (p->flink.Hdrid) argvPrint("flink.Hdrid", p->flink.Hdrid, NULL);
00664 if (p->flink.NEVRA) argvPrint("flink.NEVRA", p->flink.NEVRA, NULL);
00665 }
00666 };
00667 #endif
00668
00669 static inline void hdrPrintInstalled(Header h)
00670
00671
00672 {
00673 const char * qfmt = "[%{erasednevra} O:%{packageorigin} P:%{erasedpkgid} H:%{erasedhdrid}\n]";
00674 const char * errstr = "(unknown error)";
00675
00676 const char * str = headerSprintf(h, qfmt, rpmTagTable, rpmHeaderFormats, &errstr);
00677
00678
00679 if (str == NULL)
00680 fprintf(stderr, "error: %s\n", errstr);
00681 else {
00682 fprintf(stderr, "%s", str);
00683 str = _free(str);
00684 }
00685 }
00686
00687 static inline void hdrPrintErased(Header h)
00688
00689
00690 {
00691 const char * qfmt = "[%{installednevra} O:%{packageorigin} P:%{installedpkgid} H:%{installedhdrid}\n]";
00692 const char * errstr = "(unknown error)";
00693
00694 const char * str = headerSprintf(h, qfmt, rpmTagTable, rpmHeaderFormats, &errstr);
00695
00696 if (str == NULL)
00697 fprintf(stderr, "error: %s\n", errstr);
00698 else {
00699 fprintf(stderr, "%s", str);
00700 str = _free(str);
00701 }
00702 }
00703 #endif
00704
00705 #ifdef __cplusplus
00706 }
00707 #endif
00708
00709 #endif