]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/txn.c
Merge remote-tracking branch 'origin/mdb.master'
[openldap] / libraries / libldap / txn.c
index c25460a8e764fdf9931bf8e9b6a3e249096cb114..56899269880c9e7dad69b0ea45e12fd55e251e15 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2006 The OpenLDAP Foundation.
+ * Copyright 2006-2014 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -74,7 +74,13 @@ ldap_txn_end(
        assert( txnid != NULL );
 
        txnber = ber_alloc_t( LBER_USE_DER );
-       ber_printf( txnber, "{io}", commit, txnid );
+
+       if( commit ) {
+               ber_printf( txnber, "{ON}", txnid );
+       } else {
+               ber_printf( txnber, "{bON}", commit, txnid );
+       }
+
        ber_flatten( txnber, &txnval );
 
        rc = ldap_extended_operation( ld, LDAP_EXOP_X_TXN_END,
@@ -93,30 +99,57 @@ ldap_txn_end_s(
        LDAPControl **cctrls,
        int *retidp )
 {
-       int rc, msgid;
+       int rc;
+       BerElement *txnber = NULL;
+       struct berval *txnval = NULL;
        struct berval *retdata = NULL;
-       LDAPMessage *res;
 
-       rc = ldap_txn_end( ld, commit, txnid, sctrls, cctrls, &msgid );
-       if( rc != LDAP_SUCCESS ) return rc;
+       if ( retidp != NULL ) *retidp = -1;
 
-       if ( ldap_result( ld, msgid, LDAP_MSG_ALL, (struct timeval *) NULL, &res )
-               == -1 )
-       {
-               return ld->ld_errno;
-       }
+       txnber = ber_alloc_t( LBER_USE_DER );
 
-       rc = ldap_parse_extended_result( ld, res, NULL, &retdata, 0 );
-       if( rc != LDAP_SUCCESS ) {
-               ldap_msgfree( res );
-               return rc;
+       if( commit ) {
+               ber_printf( txnber, "{ON}", txnid );
+       } else {
+               ber_printf( txnber, "{bON}", commit, txnid );
        }
 
-       /* don't bother parsing the retdata (yet) */
-       if( retidp != NULL ) {
-               *retidp = 0;
+       ber_flatten( txnber, &txnval );
+
+       rc = ldap_extended_operation_s( ld, LDAP_EXOP_X_TXN_END,
+               txnval, sctrls, cctrls, NULL, &retdata );
+
+       ber_free( txnber, 1 );
+
+       /* parse retdata */
+       if( retdata != NULL ) {
+               BerElement *ber;
+               ber_tag_t tag;
+               ber_int_t retid;
+
+               if( retidp == NULL ) goto done;
+
+               ber = ber_init( retdata );
+
+               if( ber == NULL ) {
+                       rc = ld->ld_errno = LDAP_NO_MEMORY;
+                       goto done;
+               }
+
+               tag = ber_scanf( ber, "i", &retid );
+               ber_free( ber, 1 );
+
+               if ( tag != LBER_INTEGER ) {
+                       rc = ld->ld_errno = LDAP_DECODING_ERROR;
+                       goto done;
+               }
+
+               *retidp = (int) retid;
+
+done:
+               ber_bvfree( retdata );
        }
 
-       return ldap_result2error( ld, res, 1 );
+       return rc;
 }
 #endif