RPM Community Forums

Mailing List Message of <rpm-cvs>

[CVS] RPM: rpm/perl/ Makefile.PL.in Makefile.am RPM.xs RPM_Header.xs R...

From: Olivier Thauvin <nanardon@rpm5.org>
Date: Sat 28 Jul 2007 - 00:31:12 CEST
Message-Id: <20070727223112.827D73484F3@rpm5.org>
  RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Olivier Thauvin
  Root:   /v/rpm/cvs                       Email:  nanardon@rpm5.org
  Module: rpm                              Date:   28-Jul-2007 00:31:12
  Branch: HEAD                             Handle: 2007072723311200

  Added files:
    rpm/perl                RPM_Header.xs RPM_Ts.xs
  Modified files:
    rpm/perl                Makefile.PL.in Makefile.am RPM.xs

  Log:
    - start to split code into several xs

  Summary:
    Revision    Changes     Path
    1.4         +1  -1      rpm/perl/Makefile.PL.in
    1.4         +1  -1      rpm/perl/Makefile.am
    1.7         +11 -348    rpm/perl/RPM.xs
    1.1         +129 -0     rpm/perl/RPM_Header.xs
    1.1         +266 -0     rpm/perl/RPM_Ts.xs
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/perl/Makefile.PL.in
  ============================================================================
  $ cvs diff -u -r1.3 -r1.4 Makefile.PL.in
  --- rpm/perl/Makefile.PL.in	27 Jul 2007 21:18:16 -0000	1.3
  +++ rpm/perl/Makefile.PL.in	27 Jul 2007 22:31:12 -0000	1.4
  @@ -4,7 +4,7 @@
   
   WriteMakefile(
   	      'NAME'	=> 'RPM',
  -	      'OBJECT'	=> 'RPM.o',
  +	      'OBJECT'	=> 'RPM.o RPM_Ts.o',
   	      'VERSION_FROM' => 'RPM.pm',		# finds $VERSION
   	      'MAKEFILE'=> 'Makefile.perl',
   	      'LIBS'	=> ['@LIBS@'],			# e.g., '-lm' 
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/perl/Makefile.am
  ============================================================================
  $ cvs diff -u -r1.3 -r1.4 Makefile.am
  --- rpm/perl/Makefile.am	27 Jul 2007 21:18:16 -0000	1.3
  +++ rpm/perl/Makefile.am	27 Jul 2007 22:31:12 -0000	1.4
  @@ -6,7 +6,7 @@
   
   noinst_DATA = .made_mod
   
  -.made_mod: Makefile.perl
  +.made_mod: Makefile.perl RPM.xs
   	$(MAKE) -fMakefile.perl
   	touch $@
   
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/perl/RPM.xs
  ============================================================================
  $ cvs diff -u -r1.6 -r1.7 RPM.xs
  --- rpm/perl/RPM.xs	27 Jul 2007 21:30:46 -0000	1.6
  +++ rpm/perl/RPM.xs	27 Jul 2007 22:31:12 -0000	1.7
  @@ -1,8 +1,18 @@
  +#include "EXTERN.h"
  +#include "perl.h"
  +#include "XSUB.h"
  +
  +#undef Fflush
  +#undef Mkdir
  +#undef Stat
  +
  +#if #DYING
   #include <stdio.h>
   #include <string.h>
   #include <utime.h>
  -#include <rpmio.h>
  +#endif
   #include "rpmlib.h"
  +#include <rpmio.h>
   #include "rpmcli.h"
   
   #include "rpmts.h"
  @@ -12,126 +22,6 @@
   #include "rpmdb.h"
   #include "misc.h"
   
  -#include "EXTERN.h"
  -#include "perl.h"
  -#include "XSUB.h"
  -
  -/* Chip, this is somewhat stripped down from the default callback used by
  -   the rpmcli.  It has to be here to insure that we open the pkg again. 
  -   If we don't do this we get segfaults.  I also, kept the updating of some
  -   of the rpmcli static vars, but I may not have needed to do this.
  -
  -   Also, we probably want to give a nice interface such that we could allow
  -   users of RPM to do their own callback, but that will have to come later.
  -*/
  -void * _null_callback(
  -	const void * arg, 
  -	const rpmCallbackType what, 
  -	const unsigned long long amount, 
  -	const unsigned long long total, 
  -	fnpyKey key, 
  -	rpmCallbackData data)
  -{
  -	Header h = (Header) arg;
  -	char * s;
  -	int flags = (int) ((long)data);
  -	void * rc = NULL;
  -	const char * filename = (const char *)key;
  -	static FD_t fd = NULL;
  -	int xx;
  -
  -	/* Code stolen from rpminstall.c and modified */
  -	switch(what) {
  -		case RPMCALLBACK_INST_OPEN_FILE:
  -	 		if (filename == NULL || filename[0] == '\0')
  -			     return NULL;
  -			fd = Fopen(filename, "r.ufdio");
  -			/* FIX: still necessary? */
  -			if (fd == NULL || Ferror(fd)) {
  -				fprintf(stderr, "open of %s failed!\n", filename);
  -				if (fd != NULL) {
  -					xx = Fclose(fd);
  -					fd = NULL;
  -				}
  -			} else
  -				fd = fdLink(fd, "persist (showProgress)");
  -			return (void *)fd;
  -	 		break;
  -
  -	case RPMCALLBACK_INST_CLOSE_FILE:
  -		/* FIX: still necessary? */
  -		fd = fdFree(fd, "persist (showProgress)");
  -		if (fd != NULL) {
  -			xx = Fclose(fd);
  -			fd = NULL;
  -		}
  -		break;
  -
  -	case RPMCALLBACK_INST_START:
  -		rpmcliHashesCurrent = 0;
  -		if (h == NULL || !(flags & INSTALL_LABEL))
  -			break;
  -		break;
  -
  -	case RPMCALLBACK_TRANS_PROGRESS:
  -	case RPMCALLBACK_INST_PROGRESS:
  -		break;
  -
  -	case RPMCALLBACK_TRANS_START:
  -		rpmcliHashesCurrent = 0;
  -		rpmcliProgressTotal = 1;
  -		rpmcliProgressCurrent = 0;
  -		break;
  -
  -	case RPMCALLBACK_TRANS_STOP:
  -		rpmcliProgressTotal = rpmcliPackagesTotal;
  -		rpmcliProgressCurrent = 0;
  -		break;
  -
  -	case RPMCALLBACK_REPACKAGE_START:
  -		rpmcliHashesCurrent = 0;
  -		rpmcliProgressTotal = total;
  -		rpmcliProgressCurrent = 0;
  -		break;
  -
  -	case RPMCALLBACK_REPACKAGE_PROGRESS:
  -		break;
  -
  -	case RPMCALLBACK_REPACKAGE_STOP:
  -		rpmcliProgressTotal = total;
  -		rpmcliProgressCurrent = total;
  -		rpmcliProgressTotal = rpmcliPackagesTotal;
  -		rpmcliProgressCurrent = 0;
  -		break;
  -
  -	case RPMCALLBACK_UNINST_PROGRESS:
  -		break;
  -	case RPMCALLBACK_UNINST_START:
  -		break;
  -	case RPMCALLBACK_UNINST_STOP:
  -		break;
  -	case RPMCALLBACK_UNPACK_ERROR:
  -		break;
  -	case RPMCALLBACK_CPIO_ERROR:
  -		break;
  -	case RPMCALLBACK_UNKNOWN:
  -		break;
  -	default:
  -		break;
  -	}
  -	
  -	return rc;	
  -}
  -
  -void
  -_populate_header_tags(HV *href)
  -{
  -    int i = 0;
  -
  -    for (i = 0; i < rpmTagTableSize; i++) {
  -        hv_store(href, rpmTagTable[i].name, strlen(rpmTagTable[i].name), newSViv(rpmTagTable[i].val), 0);
  -    }
  -}
   
   void
   _populate_constant(HV *href, char *name, int val)
  @@ -369,230 +259,3 @@
   	rpmdbFreeIterator(i);
   
   
  -MODULE = RPM		PACKAGE = RPM::C::Header
  -
  -void
  -DESTROY(h)
  -	Header h
  -    CODE:
  -	headerFree(h);
  -
  -void
  -tag_by_id(h, tag)
  -	Header h
  -	int tag
  -    PREINIT:
  -	void *ret = NULL;
  -	int type;
  -	int n;
  -	int ok;
  -    PPCODE:
  -	ok = headerGetEntry(h, tag, &type, &ret, &n);
  -
  -	if (!ok) {
  -		/* nop, empty stack */
  -	}
  -	else {
  -		switch(type)
  -		{
  -		case RPM_STRING_ARRAY_TYPE:
  -			{
  -			int i;
  -			char **s;
  -
  -			EXTEND(SP, n);
  -			s = (char **)ret;
  -
  -			for (i = 0; i < n; i++) {
  -				PUSHs(sv_2mortal(newSVpv(s[i], 0)));
  -			}
  -			}
  -			break;
  -		case RPM_STRING_TYPE:
  -			PUSHs(sv_2mortal(newSVpv((char *)ret, 0)));
  -			break;
  -		case RPM_CHAR_TYPE:
  -		case RPM_INT8_TYPE:
  -		case RPM_INT16_TYPE:
  -		case RPM_INT32_TYPE:
  -			{
  -			int i;
  -			int *r;
  -
  -			EXTEND(SP, n);
  -			r = (int *)ret;
  -
  -			for (i = 0; i < n; i++) {
  -				PUSHs(sv_2mortal(newSViv(r[i])));
  -			}
  -			}
  -			break;
  -		default:
  -			croak("unknown rpm tag type %d", type);
  -		}
  -	}
  -	headerFreeData(ret, type);
  -
  -int
  -_header_compare(h1, h2)
  -	Header h1
  -	Header h2
  -    CODE:
  -	RETVAL = rpmVersionCompare(h1, h2);
  -    OUTPUT:
  -        RETVAL
  -
  -int
  -_header_is_source(h)
  -	Header h
  -    CODE:
  -	RETVAL = headerIsEntry(h, RPMTAG_SOURCEPACKAGE);
  -    OUTPUT:
  -	RETVAL
  -
  -void
  -_header_sprintf(h, format)
  -	Header h
  -	char * format
  -    PREINIT:
  -	char * s;
  -    PPCODE:
  -	s =  headerSprintf(h, format, rpmTagTable, rpmHeaderFormats, NULL);
  -	PUSHs(sv_2mortal(newSVpv((char *)s, 0)));
  -	s = _free(s);
  -
  -
  -MODULE = RPM		PACKAGE = RPM::C::Transaction
  -
  -void
  -DESTROY(t)
  -	rpmts t
  -    CODE:
  -	t = rpmtsFree(t);
  -
  -# XXX:  Add relocations some day. 
  -int
  -_add_install(t, h, fn, upgrade)
  -	rpmts  t
  -	Header h
  -	char * fn
  -	int    upgrade
  -    PREINIT:
  -	rpmRC rc = 0;
  -    CODE:
  -	rc = rpmtsAddInstallElement(t, h, (fnpyKey) fn, upgrade, NULL);
  -	RETVAL = (rc == RPMRC_OK) ? 1 : 0;
  -    OUTPUT:
  -	RETVAL	
  -
  -int
  -_add_delete(t, h, offset)
  -	rpmts        t
  -	Header       h
  -	unsigned int offset
  -    PREINIT:
  -	rpmRC rc = 0;
  -    CODE:
  -	rc = rpmtsAddEraseElement(t, h, offset);
  -	RETVAL = (rc == RPMRC_OK) ? 1 : 0;
  -    OUTPUT:
  -	RETVAL	
  -
  -int
  -_element_count(t)
  -	rpmts t
  -PREINIT:
  -	int ret;
  -CODE:
  -	ret    = rpmtsNElements(t);
  -	RETVAL = ret;
  -OUTPUT:
  -	RETVAL
  -
  -int
  -_close_db(t)
  -	rpmts t
  -PREINIT:
  -	int ret;
  -CODE:
  -	ret    = rpmtsCloseDB(t);
  -	RETVAL = (ret == 0) ? 1 : 0;
  -OUTPUT:
  -	RETVAL
  -
  -int
  -_check(t)
  -	rpmts t
  -PREINIT:
  -	int ret;
  -CODE:
  -	ret    = rpmtsCheck(t);
  -	RETVAL = (ret == 0) ? 1 : 0;
  -OUTPUT:
  -	RETVAL
  -
  -int
  -_order(t)
  -	rpmts t
  -PREINIT:
  -	int ret;
  -CODE:
  -	ret    = rpmtsOrder(t);
  -	/* XXX:  May want to do something different here.  It actually
  -	         returns the number of non-ordered elements...maybe we
  -	         want this?
  -	*/
  -	RETVAL = (ret == 0) ? 1 : 0;
  -OUTPUT:
  -	RETVAL
  -
  -void
  -_elements(t, type)
  -	rpmts t;
  -	rpmElementType type;
  -PREINIT:
  -	rpmtsi       i;
  -	rpmte        te;
  -	const char * NEVR;
  -PPCODE:
  -	i = rpmtsiInit(t);
  -	if(i == NULL) {
  -		printf("Did not get a thing!\n");
  -		return;	
  -	} else {
  -		while((te = rpmtsiNext(i, type)) != NULL) {
  -			NEVR = rpmteNEVR(te);
  -			XPUSHs(sv_2mortal(newSVpv(NEVR,	0)));
  -		}
  -		i = rpmtsiFree(i);
  -	}
  -
  -int
  -_run(t, ok_probs, prob_filter)
  -	rpmts t
  -	rpmprobFilterFlags prob_filter 
  -    PREINIT:
  -	int i;
  -	rpmProblem p;
  -	int ret;
  -    CODE:
  -	/* Make sure we could run this transactions */
  -	ret = rpmtsCheck(t);
  -	if (ret != 0) {
  -		RETVAL = 0;
  -		return;
  -	}
  -	ret = rpmtsOrder(t);
  -	if (ret != 0) {
  -		RETVAL = 0;
  -		return;
  -	}
  -
  -	/* XXX:  Should support callbacks eventually */
  -	(void) rpmtsSetNotifyCallback(t, _null_callback, (void *) ((long)0));
  -	ret    = rpmtsRun(t, NULL, prob_filter);
  -	RETVAL = (ret == 0) ? 1 : 0;
  -    OUTPUT:
  -	RETVAL
  -
  -
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/perl/RPM_Header.xs
  ============================================================================
  $ cvs diff -u -r0 -r1.1 RPM_Header.xs
  --- /dev/null	2007-07-28 00:31:01 +0200
  +++ RPM_Header.xs	2007-07-28 00:31:12 +0200
  @@ -0,0 +1,129 @@
  +#include "EXTERN.h"
  +#include "perl.h"
  +#include "XSUB.h"
  +
  +#undef Fflush
  +#undef Mkdir
  +#undef Stat
  +
  +#if #DYING
  +#include <stdio.h>
  +#include <string.h>
  +#include <utime.h>
  +#endif
  +#include "rpmlib.h"
  +#include <rpmio.h>
  +#include "rpmcli.h"
  +
  +#include "rpmts.h"
  +#include "rpmte.h"
  +
  +#include "header.h"
  +#include "rpmdb.h"
  +#include "misc.h"
  +
  +
  +void
  +_populate_header_tags(HV *href)
  +{
  +    int i = 0;
  +
  +    for (i = 0; i < rpmTagTableSize; i++) {
  +        hv_store(href, rpmTagTable[i].name, strlen(rpmTagTable[i].name), newSViv(rpmTagTable[i].val), 0);
  +    }
  +}
  +
  +MODULE = RPM_Header		PACKAGE = RPM::Header
  +
  +PROTOTYPES: ENABLE
  +
  +void
  +DESTROY(h)
  +	Header h
  +    CODE:
  +	headerFree(h);
  +
  +void
  +tag_by_id(h, tag)
  +	Header h
  +	int tag
  +    PREINIT:
  +	void *ret = NULL;
  +	int type;
  +	int n;
  +	int ok;
  +    PPCODE:
  +	ok = headerGetEntry(h, tag, &type, &ret, &n);
  +
  +	if (!ok) {
  +		/* nop, empty stack */
  +	}
  +	else {
  +		switch(type)
  +		{
  +		case RPM_STRING_ARRAY_TYPE:
  +			{
  +			int i;
  +			char **s;
  +
  +			EXTEND(SP, n);
  +			s = (char **)ret;
  +
  +			for (i = 0; i < n; i++) {
  +				PUSHs(sv_2mortal(newSVpv(s[i], 0)));
  +			}
  +			}
  +			break;
  +		case RPM_STRING_TYPE:
  +			PUSHs(sv_2mortal(newSVpv((char *)ret, 0)));
  +			break;
  +		case RPM_CHAR_TYPE:
  +		case RPM_INT8_TYPE:
  +		case RPM_INT16_TYPE:
  +		case RPM_INT32_TYPE:
  +			{
  +			int i;
  +			int *r;
  +
  +			EXTEND(SP, n);
  +			r = (int *)ret;
  +
  +			for (i = 0; i < n; i++) {
  +				PUSHs(sv_2mortal(newSViv(r[i])));
  +			}
  +			}
  +			break;
  +		default:
  +			croak("unknown rpm tag type %d", type);
  +		}
  +	}
  +	headerFreeData(ret, type);
  +
  +int
  +_header_compare(h1, h2)
  +	Header h1
  +	Header h2
  +    CODE:
  +	RETVAL = rpmVersionCompare(h1, h2);
  +    OUTPUT:
  +        RETVAL
  +
  +int
  +_header_is_source(h)
  +	Header h
  +    CODE:
  +	RETVAL = headerIsEntry(h, RPMTAG_SOURCEPACKAGE);
  +    OUTPUT:
  +	RETVAL
  +
  +void
  +_header_sprintf(h, format)
  +	Header h
  +	char * format
  +    PREINIT:
  +	char * s;
  +    PPCODE:
  +	s =  headerSprintf(h, format, rpmTagTable, rpmHeaderFormats, NULL);
  +	PUSHs(sv_2mortal(newSVpv((char *)s, 0)));
  +	s = _free(s);
  +
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/perl/RPM_Ts.xs
  ============================================================================
  $ cvs diff -u -r0 -r1.1 RPM_Ts.xs
  --- /dev/null	2007-07-28 00:31:01 +0200
  +++ RPM_Ts.xs	2007-07-28 00:31:12 +0200
  @@ -0,0 +1,266 @@
  +#include "EXTERN.h"
  +#include "perl.h"
  +#include "XSUB.h"
  +
  +#undef Fflush
  +#undef Mkdir
  +#undef Stat
  +
  +#if #DYING
  +#include <stdio.h>
  +#include <string.h>
  +#include <utime.h>
  +#endif
  +#include "rpmlib.h"
  +#include <rpmio.h>
  +#include "rpmcli.h"
  +
  +#include "rpmts.h"
  +#include "rpmte.h"
  +
  +#include "header.h"
  +#include "rpmdb.h"
  +#include "misc.h"
  +
  +
  +/* Chip, this is somewhat stripped down from the default callback used by
  +   the rpmcli.  It has to be here to insure that we open the pkg again. 
  +   If we don't do this we get segfaults.  I also, kept the updating of some
  +   of the rpmcli static vars, but I may not have needed to do this.
  +
  +   Also, we probably want to give a nice interface such that we could allow
  +   users of RPM to do their own callback, but that will have to come later.
  +*/
  +void * _null_callback(
  +	const void * arg, 
  +	const rpmCallbackType what, 
  +	const unsigned long long amount, 
  +	const unsigned long long total, 
  +	fnpyKey key, 
  +	rpmCallbackData data)
  +{
  +	Header h = (Header) arg;
  +	char * s;
  +	int flags = (int) ((long)data);
  +	void * rc = NULL;
  +	const char * filename = (const char *)key;
  +	static FD_t fd = NULL;
  +	int xx;
  +
  +	/* Code stolen from rpminstall.c and modified */
  +	switch(what) {
  +		case RPMCALLBACK_INST_OPEN_FILE:
  +	 		if (filename == NULL || filename[0] == '\0')
  +			     return NULL;
  +			fd = Fopen(filename, "r.ufdio");
  +			/* FIX: still necessary? */
  +			if (fd == NULL || Ferror(fd)) {
  +				fprintf(stderr, "open of %s failed!\n", filename);
  +				if (fd != NULL) {
  +					xx = Fclose(fd);
  +					fd = NULL;
  +				}
  +			} else
  +				fd = fdLink(fd, "persist (showProgress)");
  +			return (void *)fd;
  +	 		break;
  +
  +	case RPMCALLBACK_INST_CLOSE_FILE:
  +		/* FIX: still necessary? */
  +		fd = fdFree(fd, "persist (showProgress)");
  +		if (fd != NULL) {
  +			xx = Fclose(fd);
  +			fd = NULL;
  +		}
  +		break;
  +
  +	case RPMCALLBACK_INST_START:
  +		rpmcliHashesCurrent = 0;
  +		if (h == NULL || !(flags & INSTALL_LABEL))
  +			break;
  +		break;
  +
  +	case RPMCALLBACK_TRANS_PROGRESS:
  +	case RPMCALLBACK_INST_PROGRESS:
  +		break;
  +
  +	case RPMCALLBACK_TRANS_START:
  +		rpmcliHashesCurrent = 0;
  +		rpmcliProgressTotal = 1;
  +		rpmcliProgressCurrent = 0;
  +		break;
  +
  +	case RPMCALLBACK_TRANS_STOP:
  +		rpmcliProgressTotal = rpmcliPackagesTotal;
  +		rpmcliProgressCurrent = 0;
  +		break;
  +
  +	case RPMCALLBACK_REPACKAGE_START:
  +		rpmcliHashesCurrent = 0;
  +		rpmcliProgressTotal = total;
  +		rpmcliProgressCurrent = 0;
  +		break;
  +
  +	case RPMCALLBACK_REPACKAGE_PROGRESS:
  +		break;
  +
  +	case RPMCALLBACK_REPACKAGE_STOP:
  +		rpmcliProgressTotal = total;
  +		rpmcliProgressCurrent = total;
  +		rpmcliProgressTotal = rpmcliPackagesTotal;
  +		rpmcliProgressCurrent = 0;
  +		break;
  +
  +	case RPMCALLBACK_UNINST_PROGRESS:
  +		break;
  +	case RPMCALLBACK_UNINST_START:
  +		break;
  +	case RPMCALLBACK_UNINST_STOP:
  +		break;
  +	case RPMCALLBACK_UNPACK_ERROR:
  +		break;
  +	case RPMCALLBACK_CPIO_ERROR:
  +		break;
  +	case RPMCALLBACK_UNKNOWN:
  +		break;
  +	default:
  +		break;
  +	}
  +	
  +	return rc;	
  +}
  +
  +MODULE = RPM_Ts		PACKAGE = RPM::Transaction
  +
  +void
  +DESTROY(t)
  +	rpmts t
  +    CODE:
  +	t = rpmtsFree(t);
  +
  +# XXX:  Add relocations some day. 
  +int
  +_add_install(t, h, fn, upgrade)
  +	rpmts  t
  +	Header h
  +	char * fn
  +	int    upgrade
  +    PREINIT:
  +	rpmRC rc = 0;
  +    CODE:
  +	rc = rpmtsAddInstallElement(t, h, (fnpyKey) fn, upgrade, NULL);
  +	RETVAL = (rc == RPMRC_OK) ? 1 : 0;
  +    OUTPUT:
  +	RETVAL	
  +
  +int
  +_add_delete(t, h, offset)
  +	rpmts        t
  +	Header       h
  +	unsigned int offset
  +    PREINIT:
  +	rpmRC rc = 0;
  +    CODE:
  +	rc = rpmtsAddEraseElement(t, h, offset);
  +	RETVAL = (rc == RPMRC_OK) ? 1 : 0;
  +    OUTPUT:
  +	RETVAL	
  +
  +int
  +_element_count(t)
  +	rpmts t
  +PREINIT:
  +	int ret;
  +CODE:
  +	ret    = rpmtsNElements(t);
  +	RETVAL = ret;
  +OUTPUT:
  +	RETVAL
  +
  +int
  +_close_db(t)
  +	rpmts t
  +PREINIT:
  +	int ret;
  +CODE:
  +	ret    = rpmtsCloseDB(t);
  +	RETVAL = (ret == 0) ? 1 : 0;
  +OUTPUT:
  +	RETVAL
  +
  +int
  +_check(t)
  +	rpmts t
  +PREINIT:
  +	int ret;
  +CODE:
  +	ret    = rpmtsCheck(t);
  +	RETVAL = (ret == 0) ? 1 : 0;
  +OUTPUT:
  +	RETVAL
  +
  +int
  +_order(t)
  +	rpmts t
  +PREINIT:
  +	int ret;
  +CODE:
  +	ret    = rpmtsOrder(t);
  +	/* XXX:  May want to do something different here.  It actually
  +	         returns the number of non-ordered elements...maybe we
  +	         want this?
  +	*/
  +	RETVAL = (ret == 0) ? 1 : 0;
  +OUTPUT:
  +	RETVAL
  +
  +void
  +_elements(t, type)
  +	rpmts t;
  +	rpmElementType type;
  +PREINIT:
  +	rpmtsi       i;
  +	rpmte        te;
  +	const char * NEVR;
  +PPCODE:
  +	i = rpmtsiInit(t);
  +	if(i == NULL) {
  +		printf("Did not get a thing!\n");
  +		return;	
  +	} else {
  +		while((te = rpmtsiNext(i, type)) != NULL) {
  +			NEVR = rpmteNEVR(te);
  +			XPUSHs(sv_2mortal(newSVpv(NEVR,	0)));
  +		}
  +		i = rpmtsiFree(i);
  +	}
  +
  +int
  +_run(t, ok_probs, prob_filter)
  +	rpmts t
  +	rpmprobFilterFlags prob_filter 
  +    PREINIT:
  +	int i;
  +	rpmProblem p;
  +	int ret;
  +    CODE:
  +	/* Make sure we could run this transactions */
  +	ret = rpmtsCheck(t);
  +	if (ret != 0) {
  +		RETVAL = 0;
  +		return;
  +	}
  +	ret = rpmtsOrder(t);
  +	if (ret != 0) {
  +		RETVAL = 0;
  +		return;
  +	}
  +
  +	/* XXX:  Should support callbacks eventually */
  +	(void) rpmtsSetNotifyCallback(t, _null_callback, (void *) ((long)0));
  +	ret    = rpmtsRun(t, NULL, prob_filter);
  +	RETVAL = (ret == 0) ? 1 : 0;
  +    OUTPUT:
  +	RETVAL
  +
  +
  @@ .
Received on Sat Jul 28 00:31:12 2007
Driven by Jeff Johnson and the RPM project team.
Hosted by OpenPKG and Ralf S. Engelschall.
Powered by FreeBSD and OpenPKG.