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
00073 typedef struct sharedFileInfo_s * sharedFileInfo;
00074
00078 struct sharedFileInfo_s {
00079 int pkgFileNum;
00080 int otherFileNum;
00081 int otherPkg;
00082 int isRemoved;
00083 };
00084
00088 struct rpmte_s {
00089 rpmElementType type;
00091
00092 Header h;
00093
00094 const char * NEVR;
00095
00096 const char * NEVRA;
00097
00098 const char * pkgid;
00099
00100 const char * hdrid;
00101
00102 const char * name;
00103
00104 char * epoch;
00105
00106 char * version;
00107
00108 char * release;
00109
00110 const char * arch;
00111
00112 const char * os;
00113 int isSource;
00115 rpmte parent;
00116 int degree;
00117 int npreds;
00118 int tree;
00119 int depth;
00120 int breadth;
00121 unsigned int db_instance;
00122
00123 tsortInfo tsi;
00125
00126 rpmPRCO PRCO;
00128
00129 rpmfi fi;
00131 uint32_t color;
00132 uint32_t pkgFileSize;
00134
00135 fnpyKey key;
00136
00137 rpmRelocation relocs;
00138 int nrelocs;
00139 int autorelocatex;
00140
00141 FD_t fd;
00143
00144 sharedFileInfo replaced;
00145 int nreplaced;
00147 struct rpmChainLink_s blink;
00148 struct rpmChainLink_s flink;
00149 int linkFailed;
00150 int done;
00152 int installed;
00153 int downgrade;
00155 struct {
00156
00157 alKey addedKey;
00158 struct {
00159
00160 alKey dependsOnKey;
00161 int dboffset;
00162 } removed;
00163 } u;
00164
00165 };
00166
00170 struct rpmtsi_s {
00171
00172 rpmts ts;
00173 int reverse;
00174 int ocsave;
00175 int oc;
00176 };
00177
00178 #endif
00179
00180 #ifdef __cplusplus
00181 extern "C" {
00182 #endif
00183
00189
00190 rpmte rpmteFree( rpmte te)
00191
00192 ;
00193
00205
00206 rpmte rpmteNew(const rpmts ts, Header h, rpmElementType type,
00207 fnpyKey key,
00208 rpmRelocation relocs,
00209 int dboffset,
00210 alKey pkgKey)
00211
00212 ;
00213
00219 extern Header rpmteHeader(rpmte te)
00220 ;
00221
00228 extern Header rpmteSetHeader(rpmte te, Header h)
00229 ;
00230
00236 rpmElementType rpmteType(rpmte te)
00237 ;
00238
00244
00245 extern const char * rpmteN(rpmte te)
00246 ;
00247
00253
00254 extern const char * rpmteE(rpmte te)
00255 ;
00256
00262
00263 extern const char * rpmteV(rpmte te)
00264 ;
00265
00271
00272 extern const char * rpmteR(rpmte te)
00273 ;
00274
00280
00281 extern const char * rpmteA(rpmte te)
00282 ;
00283
00289
00290 extern const char * rpmteO(rpmte te)
00291 ;
00292
00298 extern int rpmteIsSource(rpmte te)
00299 ;
00300
00306 uint32_t rpmteColor(rpmte te)
00307 ;
00308
00315 uint32_t rpmteSetColor(rpmte te, uint32_t color)
00316 ;
00317
00323 unsigned int rpmteDBInstance(rpmte te)
00324 ;
00325
00332 void rpmteSetDBInstance(rpmte te, unsigned int instance)
00333 ;
00334
00341 uint32_t rpmtePkgFileSize(rpmte te)
00342 ;
00343
00349 int rpmteDepth(rpmte te)
00350 ;
00351
00358 int rpmteSetDepth(rpmte te, int ndepth)
00359 ;
00360
00366 int rpmteBreadth(rpmte te)
00367 ;
00368
00375 int rpmteSetBreadth(rpmte te, int nbreadth)
00376 ;
00377
00383 int rpmteNpreds(rpmte te)
00384 ;
00385
00392 int rpmteSetNpreds(rpmte te, int npreds)
00393 ;
00394
00400 int rpmteTree(rpmte te)
00401 ;
00402
00409 int rpmteSetTree(rpmte te, int ntree)
00410 ;
00411
00417
00418 rpmte rpmteParent(rpmte te)
00419 ;
00420
00427
00428 rpmte rpmteSetParent(rpmte te, rpmte pte)
00429 ;
00430
00436 int rpmteDegree(rpmte te)
00437 ;
00438
00445 int rpmteSetDegree(rpmte te, int ndegree)
00446 ;
00447
00453 tsortInfo rpmteTSI(rpmte te)
00454 ;
00455
00460 void rpmteFreeTSI(rpmte te)
00461 ;
00462
00467 void rpmteNewTSI(rpmte te)
00468 ;
00469
00474
00475 void rpmteCleanDS(rpmte te)
00476 ;
00477
00483
00484 alKey rpmteAddedKey(rpmte te)
00485 ;
00486
00493
00494 alKey rpmteSetAddedKey(rpmte te,
00495 alKey npkgKey)
00496 ;
00497
00503 int rpmteDBOffset(rpmte te)
00504 ;
00505
00511
00512 extern const char * rpmteNEVR(rpmte te)
00513 ;
00514
00520
00521
00522 extern const char * rpmteNEVRA(rpmte te)
00523 ;
00524
00525
00531
00532
00533 extern const char * rpmtePkgid(rpmte te)
00534 ;
00535
00536
00542
00543
00544 extern const char * rpmteHdrid(rpmte te)
00545 ;
00546
00547
00553 FD_t rpmteFd(rpmte te)
00554 ;
00555
00561
00562 fnpyKey rpmteKey(rpmte te)
00563 ;
00564
00571 rpmds rpmteDS(rpmte te, rpmTag tag)
00572 ;
00573
00580 rpmfi rpmteFI(rpmte te, rpmTag tag)
00581 ;
00582
00588
00589 void rpmteColorDS(rpmte te, rpmTag tag)
00590 ;
00591
00592
00601 int rpmteChain(rpmte p, rpmte q, Header oh, const char * msg)
00602 ;
00603
00604 #define RPMTE_CHAIN_END "CHAIN END"
00611 int rpmtsiOc(rpmtsi tsi)
00612 ;
00613
00619
00620 rpmtsi rpmtsiFree( rpmtsi tsi)
00621
00622 ;
00623
00631
00632 rpmtsi XrpmtsiFree( rpmtsi tsi,
00633 const char * fn, unsigned int ln)
00634
00635 ;
00636 #define rpmtsiFree(_tsi) XrpmtsiFree(_tsi, __FILE__, __LINE__)
00637
00643
00644 rpmtsi rpmtsiInit(rpmts ts)
00645 ;
00646
00654
00655 rpmtsi XrpmtsiInit(rpmts ts,
00656 const char * fn, unsigned int ln)
00657 ;
00658 #define rpmtsiInit(_ts) XrpmtsiInit(_ts, __FILE__, __LINE__)
00659
00666
00667 rpmte rpmtsiNext(rpmtsi tsi, rpmElementType type)
00668 ;
00669
00670 #if !defined(SWIG)
00671 #if defined(_RPMTE_INTERNAL)
00672
00674 static inline void rpmtePrintID(rpmte p)
00675
00676
00677 {
00678 if (p != NULL) {
00679 if (p->blink.Pkgid) argvPrint("blink.Pkgid", p->blink.Pkgid, NULL);
00680 if (p->blink.Hdrid) argvPrint("blink.Hdrid", p->blink.Hdrid, NULL);
00681 if (p->blink.NEVRA) argvPrint("blink.NEVRA", p->blink.NEVRA, NULL);
00682 if (p->flink.Pkgid) argvPrint("flink.Pkgid", p->flink.Pkgid, NULL);
00683 if (p->flink.Hdrid) argvPrint("flink.Hdrid", p->flink.Hdrid, NULL);
00684 if (p->flink.NEVRA) argvPrint("flink.NEVRA", p->flink.NEVRA, NULL);
00685 }
00686 };
00687
00690 static inline void hdrPrintInstalled(Header h)
00691
00692
00693 {
00694 const char * qfmt = "[%{erasednevra} O:%{packageorigin} P:%{erasedpkgid} H:%{erasedhdrid}\n]";
00695 const char * errstr = "(unknown error)";
00696
00697 const char * str = headerSprintf(h, qfmt, rpmTagTable, rpmHeaderFormats, &errstr);
00698
00699
00700 if (str == NULL)
00701 fprintf(stderr, "error: %s\n", errstr);
00702 else {
00703 fprintf(stderr, "%s", str);
00704 str = _free(str);
00705 }
00706 }
00707
00710 static inline void hdrPrintErased(Header h)
00711
00712
00713 {
00714 const char * qfmt = "[%{installednevra} O:%{packageorigin} P:%{installedpkgid} H:%{installedhdrid}\n]";
00715 const char * errstr = "(unknown error)";
00716
00717 const char * str = headerSprintf(h, qfmt, rpmTagTable, rpmHeaderFormats, &errstr);
00718
00719 if (str == NULL)
00720 fprintf(stderr, "error: %s\n", errstr);
00721 else {
00722 fprintf(stderr, "%s", str);
00723 str = _free(str);
00724 }
00725 }
00726 #endif
00727 #endif
00728
00729 #ifdef __cplusplus
00730 }
00731 #endif
00732
00733 #endif