-
Fixes access to sequences in the Java API in DB 4.5.20.
*** sequence/sequence.c.orig 27 Sep 2006 14:56:17 -0000 12.39
--- sequence/sequence.c 26 Oct 2006 07:36:05 -0000
***************
*** 228,233 ****
--- 228,236 ----
seq->seq_data.ulen = seq->seq_data.size = sizeof(seq->seq_record);
seq->seq_rp = &seq->seq_record;
+ if ((ret = __dbt_usercopy(dbenv, keyp)) != 0)
+ goto err;
+
memset(&seq->seq_key, 0, sizeof(DBT));
if ((ret = __os_malloc(dbenv, keyp->size, &seq->seq_key.data)) != 0)
goto err;
***************
*** 365,370 ****
--- 368,374 ----
ret = t_ret;
ENV_LEAVE(dbenv, ip);
+ __dbt_userfree(dbenv, keyp, NULL, NULL);
return (ret);
}
***************
*** 764,769 ****
--- 768,777 ----
DBT *key;
{
SEQ_ILLEGAL_BEFORE_OPEN(seq, "DB_SEQUENCE->get_key");
+
+ if (F_ISSET(key, DB_DBT_USERCOPY))
+ return (__db_retcopy(seq->seq_dbp->dbenv, key,
+ seq->seq_key.data, seq->seq_key.size, NULL, 0));
key->data = seq->seq_key.data;
key->size = key->ulen = seq->seq_key.size;
-
The patch fixes a problem introduced in 4.5.20 when we changed the way DBTs are copied in calls from the Java API into the core API.
*** rep/rep_method.c.orig Fri Oct 20 08:34:06 2006
--- rep/rep_method.c Fri Oct 27 12:09:04 2006
***************
*** 524,533 ****
* will allow the client to either perform recovery or
* simply join in.
*/
! if (announce)
(void)__rep_send_message(dbenv,
DB_EID_BROADCAST, REP_NEWCLIENT, NULL, dbt, 0, 0);
! else
(void)__rep_send_message(dbenv,
DB_EID_BROADCAST, REP_ALIVE_REQ, NULL, NULL, 0, 0);
}
--- 524,535 ----
* will allow the client to either perform recovery or
* simply join in.
*/
! if (announce) {
! if ((ret = __dbt_usercopy(dbenv, dbt)) != 0)
! goto err;
(void)__rep_send_message(dbenv,
DB_EID_BROADCAST, REP_NEWCLIENT, NULL, dbt, 0, 0);
! } else
(void)__rep_send_message(dbenv,
DB_EID_BROADCAST, REP_ALIVE_REQ, NULL, NULL, 0, 0);
}
***************
*** 551,556 ****
--- 553,559 ----
}
if (pending_event != DB_EVENT_NO_SUCH_EVENT)
DB_EVENT(dbenv, pending_event, NULL);
+ __dbt_userfree(dbenv, dbt, NULL, NULL);
return (ret);
}
*** rep/rep_record.c.orig Fri Oct 20 08:34:06 2006
--- rep/rep_record.c Mon Nov 13 10:46:29 2006
***************
*** 161,166 ****
--- 161,174 ----
return (EINVAL);
}
+ if ((ret = __dbt_usercopy(dbenv, control)) != 0 ||
+ (ret = __dbt_usercopy(dbenv, rec)) != 0) {
+ __dbt_userfree(dbenv, control, rec, NULL);
+ __db_errx(dbenv,
+ "DB_ENV->rep_process_message: error retrieving DBT contents");
+ return ret;
+ }
+
ret = 0;
db_rep = dbenv->rep_handle;
rep = db_rep->region;
***************
*** 619,624 ****
--- 627,633 ----
*ret_lsnp = rp->lsn;
ret = DB_REP_NOTPERM;
}
+ __dbt_userfree(dbenv, control, rec, NULL);
return (ret);
}