#include "db_config.h"
#include "db_int.h"
#include "dbinc/db_page.h"
#include "dbinc/db_am.h"
#include "dbinc/log.h"
#include "dbinc/mp.h"
#include "dbinc/txn.h"
int
__rep_update_buf(buf, max, lenp,
first_lsn, first_vers, num_files)
u_int8_t *buf;
size_t max, *lenp;
DB_LSN * first_lsn;
u_int32_t first_vers;
u_int32_t num_files;
{
u_int32_t uinttmp;
u_int8_t *endbuf;
u_int8_t *bp;
int ret;
ret = 0;
bp = buf;
endbuf = bp + max;
if (bp + sizeof(*first_lsn) > endbuf)
return (ENOMEM);
if (first_lsn != NULL)
memcpy(bp, first_lsn, sizeof(*first_lsn));
else
memset(bp, 0, sizeof(*first_lsn));
bp += sizeof(*first_lsn);
uinttmp = (u_int32_t)first_vers;
if (bp + sizeof(uinttmp) > endbuf)
return (ENOMEM);
memcpy(bp, &uinttmp, sizeof(uinttmp));
bp += sizeof(uinttmp);
uinttmp = (u_int32_t)num_files;
if (bp + sizeof(uinttmp) > endbuf)
return (ENOMEM);
memcpy(bp, &uinttmp, sizeof(uinttmp));
bp += sizeof(uinttmp);
*lenp = (u_int32_t)(bp - buf);
return (ret);
}
int
__rep_update_read(dbenv, recbuf, nextp, argpp)
DB_ENV *dbenv;
void *recbuf;
void **nextp;
__rep_update_args **argpp;
{
__rep_update_args *argp;
u_int32_t uinttmp;
u_int8_t *bp;
int ret;
if ((ret = __os_malloc(dbenv,
sizeof(__rep_update_args), &argp)) != 0)
return (ret);
bp = recbuf;
memcpy(&argp->first_lsn, bp, sizeof(argp->first_lsn));
bp += sizeof(argp->first_lsn);
memcpy(&uinttmp, bp, sizeof(uinttmp));
argp->first_vers = (u_int32_t)uinttmp;
bp += sizeof(uinttmp);
memcpy(&uinttmp, bp, sizeof(uinttmp));
argp->num_files = (u_int32_t)uinttmp;
bp += sizeof(uinttmp);
*nextp = bp;
*argpp = argp;
return (0);
}
int
__rep_fileinfo_buf(buf, max, lenp,
pgsize, pgno, max_pgno, filenum, id, type,
flags, uid, info)
u_int8_t *buf;
size_t max, *lenp;
u_int32_t pgsize;
db_pgno_t pgno;
db_pgno_t max_pgno;
u_int32_t filenum;
int32_t id;
u_int32_t type;
u_int32_t flags;
const DBT *uid;
const DBT *info;
{
u_int32_t zero;
u_int32_t uinttmp;
u_int8_t *endbuf;
u_int8_t *bp;
int ret;
ret = 0;
bp = buf;
endbuf = bp + max;
uinttmp = (u_int32_t)pgsize;
if (bp + sizeof(uinttmp) > endbuf)
return (ENOMEM);
memcpy(bp, &uinttmp, sizeof(uinttmp));
bp += sizeof(uinttmp);
uinttmp = (u_int32_t)pgno;
if (bp + sizeof(uinttmp) > endbuf)
return (ENOMEM);
memcpy(bp, &uinttmp, sizeof(uinttmp));
bp += sizeof(uinttmp);
uinttmp = (u_int32_t)max_pgno;
if (bp + sizeof(uinttmp) > endbuf)
return (ENOMEM);
memcpy(bp, &uinttmp, sizeof(uinttmp));
bp += sizeof(uinttmp);
uinttmp = (u_int32_t)filenum;
if (bp + sizeof(uinttmp) > endbuf)
return (ENOMEM);
memcpy(bp, &uinttmp, sizeof(uinttmp));
bp += sizeof(uinttmp);
uinttmp = (u_int32_t)id;
if (bp + sizeof(uinttmp) > endbuf)
return (ENOMEM);
memcpy(bp, &uinttmp, sizeof(uinttmp));
bp += sizeof(uinttmp);
uinttmp = (u_int32_t)type;
if (bp + sizeof(uinttmp) > endbuf)
return (ENOMEM);
memcpy(bp, &uinttmp, sizeof(uinttmp));
bp += sizeof(uinttmp);
uinttmp = (u_int32_t)flags;
if (bp + sizeof(uinttmp) > endbuf)
return (ENOMEM);
memcpy(bp, &uinttmp, sizeof(uinttmp));
bp += sizeof(uinttmp);
if (uid == NULL) {
zero = 0;
if (bp + sizeof(u_int32_t) > endbuf)
return (ENOMEM);
memcpy(bp, &zero, sizeof(u_int32_t));
bp += sizeof(u_int32_t);
} else {
if (bp + sizeof(uid->size) > endbuf)
return (ENOMEM);
memcpy(bp, &uid->size, sizeof(uid->size));
bp += sizeof(uid->size);
if (bp + uid->size > endbuf)
return (ENOMEM);
memcpy(bp, uid->data, uid->size);
bp += uid->size;
}
if (info == NULL) {
zero = 0;
if (bp + sizeof(u_int32_t) > endbuf)
return (ENOMEM);
memcpy(bp, &zero, sizeof(u_int32_t));
bp += sizeof(u_int32_t);
} else {
if (bp + sizeof(info->size) > endbuf)
return (ENOMEM);
memcpy(bp, &info->size, sizeof(info->size));
bp += sizeof(info->size);
if (bp + info->size > endbuf)
return (ENOMEM);
memcpy(bp, info->data, info->size);
bp += info->size;
}
*lenp = (u_int32_t)(bp - buf);
return (ret);
}
int
__rep_fileinfo_read(dbenv, recbuf, nextp, argpp)
DB_ENV *dbenv;
void *recbuf;
void **nextp;
__rep_fileinfo_args **argpp;
{
__rep_fileinfo_args *argp;
u_int32_t uinttmp;
u_int8_t *bp;
int ret;
if ((ret = __os_malloc(dbenv,
sizeof(__rep_fileinfo_args), &argp)) != 0)
return (ret);
bp = recbuf;
memcpy(&uinttmp, bp, sizeof(uinttmp));
argp->pgsize = (u_int32_t)uinttmp;
bp += sizeof(uinttmp);
memcpy(&uinttmp, bp, sizeof(uinttmp));
argp->pgno = (db_pgno_t)uinttmp;
bp += sizeof(uinttmp);
memcpy(&uinttmp, bp, sizeof(uinttmp));
argp->max_pgno = (db_pgno_t)uinttmp;
bp += sizeof(uinttmp);
memcpy(&uinttmp, bp, sizeof(uinttmp));
argp->filenum = (u_int32_t)uinttmp;
bp += sizeof(uinttmp);
memcpy(&uinttmp, bp, sizeof(uinttmp));
argp->id = (int32_t)uinttmp;
bp += sizeof(uinttmp);
memcpy(&uinttmp, bp, sizeof(uinttmp));
argp->type = (u_int32_t)uinttmp;
bp += sizeof(uinttmp);
memcpy(&uinttmp, bp, sizeof(uinttmp));
argp->flags = (u_int32_t)uinttmp;
bp += sizeof(uinttmp);
memset(&argp->uid, 0, sizeof(argp->uid));
memcpy(&argp->uid.size, bp, sizeof(u_int32_t));
bp += sizeof(u_int32_t);
argp->uid.data = bp;
bp += argp->uid.size;
memset(&argp->info, 0, sizeof(argp->info));
memcpy(&argp->info.size, bp, sizeof(u_int32_t));
bp += sizeof(u_int32_t);
argp->info.data = bp;
bp += argp->info.size;
*nextp = bp;
*argpp = argp;
return (0);
}