xref: /minix3/external/bsd/nvi/dist/common/vi_auto.c (revision 84d9c625bfea59e274550651111ae9edfdc40fbd)
1*84d9c625SLionel Sambuc /* Do not edit: automatically built by gen_rec.awk. */
2*84d9c625SLionel Sambuc #include <sys/types.h>
3*84d9c625SLionel Sambuc #include <sys/queue.h>
4*84d9c625SLionel Sambuc #include <sys/stat.h>
5*84d9c625SLionel Sambuc #include <bitstring.h>
6*84d9c625SLionel Sambuc #include <errno.h>
7*84d9c625SLionel Sambuc #include <fcntl.h>
8*84d9c625SLionel Sambuc #include <limits.h>
9*84d9c625SLionel Sambuc #include <stdio.h>
10*84d9c625SLionel Sambuc #include <stdlib.h>
11*84d9c625SLionel Sambuc #include <string.h>
12*84d9c625SLionel Sambuc #include "common.h"
13*84d9c625SLionel Sambuc #include <db_int.h>
14*84d9c625SLionel Sambuc #include "db_page.h"
15*84d9c625SLionel Sambuc #include "db_am.h"
16*84d9c625SLionel Sambuc #include "rep.h"
17*84d9c625SLionel Sambuc #include "txn.h"
18*84d9c625SLionel Sambuc /*
19*84d9c625SLionel Sambuc  * PUBLIC: #ifdef USE_DB4_LOGGING
20*84d9c625SLionel Sambuc  */
21*84d9c625SLionel Sambuc /*
22*84d9c625SLionel Sambuc  * PUBLIC: int __vi_marker_log __P((DB_ENV *, DB_TXN *, DB_LSN *, u_int32_t,
23*84d9c625SLionel Sambuc  * PUBLIC:      u_int32_t));
24*84d9c625SLionel Sambuc  */
25*84d9c625SLionel Sambuc int
__vi_marker_log(dbenv,txnid,ret_lsnp,flags,opcode)26*84d9c625SLionel Sambuc __vi_marker_log(dbenv, txnid, ret_lsnp, flags,
27*84d9c625SLionel Sambuc 	opcode)
28*84d9c625SLionel Sambuc 	DB_ENV *dbenv;
29*84d9c625SLionel Sambuc 	DB_TXN *txnid;
30*84d9c625SLionel Sambuc 	DB_LSN *ret_lsnp;
31*84d9c625SLionel Sambuc 	u_int32_t flags;
32*84d9c625SLionel Sambuc 	u_int32_t opcode;
33*84d9c625SLionel Sambuc {
34*84d9c625SLionel Sambuc 	DBT logrec;
35*84d9c625SLionel Sambuc 	DB_LSN *lsnp, null_lsn;
36*84d9c625SLionel Sambuc 	u_int32_t uinttmp;
37*84d9c625SLionel Sambuc 	u_int32_t rectype, txn_num;
38*84d9c625SLionel Sambuc 	int ret;
39*84d9c625SLionel Sambuc 	u_int8_t *bp;
40*84d9c625SLionel Sambuc 
41*84d9c625SLionel Sambuc 	rectype = DB_vi_marker;
42*84d9c625SLionel Sambuc 	if (txnid != NULL &&
43*84d9c625SLionel Sambuc 	    TAILQ_FIRST(&txnid->kids) != NULL &&
44*84d9c625SLionel Sambuc 	    (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
45*84d9c625SLionel Sambuc 		return (ret);
46*84d9c625SLionel Sambuc 	txn_num = txnid == NULL ? 0 : txnid->txnid;
47*84d9c625SLionel Sambuc 	if (txnid == NULL) {
48*84d9c625SLionel Sambuc 		ZERO_LSN(null_lsn);
49*84d9c625SLionel Sambuc 		lsnp = &null_lsn;
50*84d9c625SLionel Sambuc 	} else
51*84d9c625SLionel Sambuc 		lsnp = &txnid->last_lsn;
52*84d9c625SLionel Sambuc 	logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
53*84d9c625SLionel Sambuc 	    + sizeof(u_int32_t);
54*84d9c625SLionel Sambuc 	if ((ret = __os_malloc(dbenv, logrec.size, &logrec.data)) != 0)
55*84d9c625SLionel Sambuc 		return (ret);
56*84d9c625SLionel Sambuc 
57*84d9c625SLionel Sambuc 	bp = logrec.data;
58*84d9c625SLionel Sambuc 
59*84d9c625SLionel Sambuc 	memcpy(bp, &rectype, sizeof(rectype));
60*84d9c625SLionel Sambuc 	bp += sizeof(rectype);
61*84d9c625SLionel Sambuc 
62*84d9c625SLionel Sambuc 	memcpy(bp, &txn_num, sizeof(txn_num));
63*84d9c625SLionel Sambuc 	bp += sizeof(txn_num);
64*84d9c625SLionel Sambuc 
65*84d9c625SLionel Sambuc 	memcpy(bp, lsnp, sizeof(DB_LSN));
66*84d9c625SLionel Sambuc 	bp += sizeof(DB_LSN);
67*84d9c625SLionel Sambuc 
68*84d9c625SLionel Sambuc 	uinttmp = (u_int32_t)opcode;
69*84d9c625SLionel Sambuc 	memcpy(bp, &uinttmp, sizeof(uinttmp));
70*84d9c625SLionel Sambuc 	bp += sizeof(uinttmp);
71*84d9c625SLionel Sambuc 
72*84d9c625SLionel Sambuc 	DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) == logrec.size);
73*84d9c625SLionel Sambuc 	ret = dbenv->log_put(dbenv, ret_lsnp, (DBT *)&logrec, flags);
74*84d9c625SLionel Sambuc 	if (txnid != NULL && ret == 0)
75*84d9c625SLionel Sambuc 		txnid->last_lsn = *ret_lsnp;
76*84d9c625SLionel Sambuc #ifdef LOG_DIAGNOSTIC
77*84d9c625SLionel Sambuc 	if (ret != 0)
78*84d9c625SLionel Sambuc 		(void)__vi_marker_print(dbenv,
79*84d9c625SLionel Sambuc 		    (DBT *)&logrec, ret_lsnp, NULL, NULL);
80*84d9c625SLionel Sambuc #endif
81*84d9c625SLionel Sambuc 	__os_free(dbenv, logrec.data, logrec.size);
82*84d9c625SLionel Sambuc 	return (ret);
83*84d9c625SLionel Sambuc }
84*84d9c625SLionel Sambuc 
85*84d9c625SLionel Sambuc /*
86*84d9c625SLionel Sambuc  * PUBLIC: int __vi_marker_getpgnos __P((DB_ENV *, DBT *, DB_LSN *, db_recops,
87*84d9c625SLionel Sambuc  * PUBLIC:      void *));
88*84d9c625SLionel Sambuc  */
89*84d9c625SLionel Sambuc int
__vi_marker_getpgnos(dbenv,rec,lsnp,notused1,summary)90*84d9c625SLionel Sambuc __vi_marker_getpgnos(dbenv, rec, lsnp, notused1, summary)
91*84d9c625SLionel Sambuc 	DB_ENV *dbenv;
92*84d9c625SLionel Sambuc 	DBT *rec;
93*84d9c625SLionel Sambuc 	DB_LSN *lsnp;
94*84d9c625SLionel Sambuc 	db_recops notused1;
95*84d9c625SLionel Sambuc 	void *summary;
96*84d9c625SLionel Sambuc {
97*84d9c625SLionel Sambuc 	TXN_RECS *t;
98*84d9c625SLionel Sambuc 	int ret;
99*84d9c625SLionel Sambuc 	COMPQUIET(rec, NULL);
100*84d9c625SLionel Sambuc 	COMPQUIET(notused1, DB_TXN_ABORT);
101*84d9c625SLionel Sambuc 
102*84d9c625SLionel Sambuc 	t = (TXN_RECS *)summary;
103*84d9c625SLionel Sambuc 
104*84d9c625SLionel Sambuc 	if ((ret = __rep_check_alloc(dbenv, t, 1)) != 0)
105*84d9c625SLionel Sambuc 		return (ret);
106*84d9c625SLionel Sambuc 
107*84d9c625SLionel Sambuc 	t->array[t->npages].flags = LSN_PAGE_NOLOCK;
108*84d9c625SLionel Sambuc 	t->array[t->npages].lsn = *lsnp;
109*84d9c625SLionel Sambuc 	t->array[t->npages].fid = DB_LOGFILEID_INVALID;
110*84d9c625SLionel Sambuc 	memset(&t->array[t->npages].pgdesc, 0,
111*84d9c625SLionel Sambuc 	    sizeof(t->array[t->npages].pgdesc));
112*84d9c625SLionel Sambuc 
113*84d9c625SLionel Sambuc 	t->npages++;
114*84d9c625SLionel Sambuc 
115*84d9c625SLionel Sambuc 	return (0);
116*84d9c625SLionel Sambuc }
117*84d9c625SLionel Sambuc 
118*84d9c625SLionel Sambuc /*
119*84d9c625SLionel Sambuc  * PUBLIC: int __vi_marker_print __P((DB_ENV *, DBT *, DB_LSN *, db_recops,
120*84d9c625SLionel Sambuc  * PUBLIC:      void *));
121*84d9c625SLionel Sambuc  */
122*84d9c625SLionel Sambuc int
__vi_marker_print(dbenv,dbtp,lsnp,notused2,notused3)123*84d9c625SLionel Sambuc __vi_marker_print(dbenv, dbtp, lsnp, notused2, notused3)
124*84d9c625SLionel Sambuc 	DB_ENV *dbenv;
125*84d9c625SLionel Sambuc 	DBT *dbtp;
126*84d9c625SLionel Sambuc 	DB_LSN *lsnp;
127*84d9c625SLionel Sambuc 	db_recops notused2;
128*84d9c625SLionel Sambuc 	void *notused3;
129*84d9c625SLionel Sambuc {
130*84d9c625SLionel Sambuc 	__vi_marker_args *argp;
131*84d9c625SLionel Sambuc 	int ret;
132*84d9c625SLionel Sambuc 
133*84d9c625SLionel Sambuc 	notused2 = DB_TXN_ABORT;
134*84d9c625SLionel Sambuc 	notused3 = NULL;
135*84d9c625SLionel Sambuc 
136*84d9c625SLionel Sambuc 	if ((ret = __vi_marker_read(dbenv, dbtp->data, &argp)) != 0)
137*84d9c625SLionel Sambuc 		return (ret);
138*84d9c625SLionel Sambuc 	(void)printf(
139*84d9c625SLionel Sambuc 	    "[%lu][%lu]vi_marker: rec: %lu txnid %lx prevlsn [%lu][%lu]\n",
140*84d9c625SLionel Sambuc 	    (u_long)lsnp->file,
141*84d9c625SLionel Sambuc 	    (u_long)lsnp->offset,
142*84d9c625SLionel Sambuc 	    (u_long)argp->type,
143*84d9c625SLionel Sambuc 	    (u_long)argp->txnid->txnid,
144*84d9c625SLionel Sambuc 	    (u_long)argp->prev_lsn.file,
145*84d9c625SLionel Sambuc 	    (u_long)argp->prev_lsn.offset);
146*84d9c625SLionel Sambuc 	(void)printf("\topcode: %lu\n", (u_long)argp->opcode);
147*84d9c625SLionel Sambuc 	(void)printf("\n");
148*84d9c625SLionel Sambuc 	__os_free(dbenv, argp, 0);
149*84d9c625SLionel Sambuc 	return (0);
150*84d9c625SLionel Sambuc }
151*84d9c625SLionel Sambuc 
152*84d9c625SLionel Sambuc /*
153*84d9c625SLionel Sambuc  * PUBLIC: int __vi_marker_read __P((DB_ENV *, void *, __vi_marker_args **));
154*84d9c625SLionel Sambuc  */
155*84d9c625SLionel Sambuc int
__vi_marker_read(dbenv,recbuf,argpp)156*84d9c625SLionel Sambuc __vi_marker_read(dbenv, recbuf, argpp)
157*84d9c625SLionel Sambuc 	DB_ENV *dbenv;
158*84d9c625SLionel Sambuc 	void *recbuf;
159*84d9c625SLionel Sambuc 	__vi_marker_args **argpp;
160*84d9c625SLionel Sambuc {
161*84d9c625SLionel Sambuc 	__vi_marker_args *argp;
162*84d9c625SLionel Sambuc 	int ret;
163*84d9c625SLionel Sambuc 	u_int32_t uinttmp;
164*84d9c625SLionel Sambuc 	u_int8_t *bp;
165*84d9c625SLionel Sambuc 
166*84d9c625SLionel Sambuc 	ret = __os_malloc(dbenv, sizeof(__vi_marker_args) +
167*84d9c625SLionel Sambuc 	    sizeof(DB_TXN), &argp);
168*84d9c625SLionel Sambuc 	if (ret != 0)
169*84d9c625SLionel Sambuc 		return (ret);
170*84d9c625SLionel Sambuc 	argp->txnid = (DB_TXN *)&argp[1];
171*84d9c625SLionel Sambuc 
172*84d9c625SLionel Sambuc 	bp = recbuf;
173*84d9c625SLionel Sambuc 	memcpy(&argp->type, bp, sizeof(argp->type));
174*84d9c625SLionel Sambuc 	bp += sizeof(argp->type);
175*84d9c625SLionel Sambuc 
176*84d9c625SLionel Sambuc 	memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
177*84d9c625SLionel Sambuc 	bp += sizeof(argp->txnid->txnid);
178*84d9c625SLionel Sambuc 
179*84d9c625SLionel Sambuc 	memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
180*84d9c625SLionel Sambuc 	bp += sizeof(DB_LSN);
181*84d9c625SLionel Sambuc 
182*84d9c625SLionel Sambuc 	memcpy(&uinttmp, bp, sizeof(uinttmp));
183*84d9c625SLionel Sambuc 	argp->opcode = (u_int32_t)uinttmp;
184*84d9c625SLionel Sambuc 	bp += sizeof(uinttmp);
185*84d9c625SLionel Sambuc 
186*84d9c625SLionel Sambuc 	*argpp = argp;
187*84d9c625SLionel Sambuc 	return (0);
188*84d9c625SLionel Sambuc }
189*84d9c625SLionel Sambuc 
190*84d9c625SLionel Sambuc /*
191*84d9c625SLionel Sambuc  * PUBLIC: int __vi_cursor_log __P((DB_ENV *, DB_TXN *, DB_LSN *, u_int32_t,
192*84d9c625SLionel Sambuc  * PUBLIC:      u_int32_t, db_recno_t, size_t));
193*84d9c625SLionel Sambuc  */
194*84d9c625SLionel Sambuc int
__vi_cursor_log(dbenv,txnid,ret_lsnp,flags,opcode,lno,cno)195*84d9c625SLionel Sambuc __vi_cursor_log(dbenv, txnid, ret_lsnp, flags,
196*84d9c625SLionel Sambuc 	opcode, lno, cno)
197*84d9c625SLionel Sambuc 	DB_ENV *dbenv;
198*84d9c625SLionel Sambuc 	DB_TXN *txnid;
199*84d9c625SLionel Sambuc 	DB_LSN *ret_lsnp;
200*84d9c625SLionel Sambuc 	u_int32_t flags;
201*84d9c625SLionel Sambuc 	u_int32_t opcode;
202*84d9c625SLionel Sambuc 	db_recno_t lno;
203*84d9c625SLionel Sambuc 	size_t cno;
204*84d9c625SLionel Sambuc {
205*84d9c625SLionel Sambuc 	DBT logrec;
206*84d9c625SLionel Sambuc 	DB_LSN *lsnp, null_lsn;
207*84d9c625SLionel Sambuc 	u_int32_t uinttmp;
208*84d9c625SLionel Sambuc 	u_int32_t rectype, txn_num;
209*84d9c625SLionel Sambuc 	int ret;
210*84d9c625SLionel Sambuc 	u_int8_t *bp;
211*84d9c625SLionel Sambuc 
212*84d9c625SLionel Sambuc 	rectype = DB_vi_cursor;
213*84d9c625SLionel Sambuc 	if (txnid != NULL &&
214*84d9c625SLionel Sambuc 	    TAILQ_FIRST(&txnid->kids) != NULL &&
215*84d9c625SLionel Sambuc 	    (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
216*84d9c625SLionel Sambuc 		return (ret);
217*84d9c625SLionel Sambuc 	txn_num = txnid == NULL ? 0 : txnid->txnid;
218*84d9c625SLionel Sambuc 	if (txnid == NULL) {
219*84d9c625SLionel Sambuc 		ZERO_LSN(null_lsn);
220*84d9c625SLionel Sambuc 		lsnp = &null_lsn;
221*84d9c625SLionel Sambuc 	} else
222*84d9c625SLionel Sambuc 		lsnp = &txnid->last_lsn;
223*84d9c625SLionel Sambuc 	logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
224*84d9c625SLionel Sambuc 	    + sizeof(u_int32_t)
225*84d9c625SLionel Sambuc 	    + sizeof(u_int32_t)
226*84d9c625SLionel Sambuc 	    + sizeof(u_int32_t);
227*84d9c625SLionel Sambuc 	if ((ret = __os_malloc(dbenv, logrec.size, &logrec.data)) != 0)
228*84d9c625SLionel Sambuc 		return (ret);
229*84d9c625SLionel Sambuc 
230*84d9c625SLionel Sambuc 	bp = logrec.data;
231*84d9c625SLionel Sambuc 
232*84d9c625SLionel Sambuc 	memcpy(bp, &rectype, sizeof(rectype));
233*84d9c625SLionel Sambuc 	bp += sizeof(rectype);
234*84d9c625SLionel Sambuc 
235*84d9c625SLionel Sambuc 	memcpy(bp, &txn_num, sizeof(txn_num));
236*84d9c625SLionel Sambuc 	bp += sizeof(txn_num);
237*84d9c625SLionel Sambuc 
238*84d9c625SLionel Sambuc 	memcpy(bp, lsnp, sizeof(DB_LSN));
239*84d9c625SLionel Sambuc 	bp += sizeof(DB_LSN);
240*84d9c625SLionel Sambuc 
241*84d9c625SLionel Sambuc 	uinttmp = (u_int32_t)opcode;
242*84d9c625SLionel Sambuc 	memcpy(bp, &uinttmp, sizeof(uinttmp));
243*84d9c625SLionel Sambuc 	bp += sizeof(uinttmp);
244*84d9c625SLionel Sambuc 
245*84d9c625SLionel Sambuc 	uinttmp = (u_int32_t)lno;
246*84d9c625SLionel Sambuc 	memcpy(bp, &uinttmp, sizeof(uinttmp));
247*84d9c625SLionel Sambuc 	bp += sizeof(uinttmp);
248*84d9c625SLionel Sambuc 
249*84d9c625SLionel Sambuc 	uinttmp = (u_int32_t)cno;
250*84d9c625SLionel Sambuc 	memcpy(bp, &uinttmp, sizeof(uinttmp));
251*84d9c625SLionel Sambuc 	bp += sizeof(uinttmp);
252*84d9c625SLionel Sambuc 
253*84d9c625SLionel Sambuc 	DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) == logrec.size);
254*84d9c625SLionel Sambuc 	ret = dbenv->log_put(dbenv, ret_lsnp, (DBT *)&logrec, flags);
255*84d9c625SLionel Sambuc 	if (txnid != NULL && ret == 0)
256*84d9c625SLionel Sambuc 		txnid->last_lsn = *ret_lsnp;
257*84d9c625SLionel Sambuc #ifdef LOG_DIAGNOSTIC
258*84d9c625SLionel Sambuc 	if (ret != 0)
259*84d9c625SLionel Sambuc 		(void)__vi_cursor_print(dbenv,
260*84d9c625SLionel Sambuc 		    (DBT *)&logrec, ret_lsnp, NULL, NULL);
261*84d9c625SLionel Sambuc #endif
262*84d9c625SLionel Sambuc 	__os_free(dbenv, logrec.data, logrec.size);
263*84d9c625SLionel Sambuc 	return (ret);
264*84d9c625SLionel Sambuc }
265*84d9c625SLionel Sambuc 
266*84d9c625SLionel Sambuc /*
267*84d9c625SLionel Sambuc  * PUBLIC: int __vi_cursor_getpgnos __P((DB_ENV *, DBT *, DB_LSN *, db_recops,
268*84d9c625SLionel Sambuc  * PUBLIC:      void *));
269*84d9c625SLionel Sambuc  */
270*84d9c625SLionel Sambuc int
__vi_cursor_getpgnos(dbenv,rec,lsnp,notused1,summary)271*84d9c625SLionel Sambuc __vi_cursor_getpgnos(dbenv, rec, lsnp, notused1, summary)
272*84d9c625SLionel Sambuc 	DB_ENV *dbenv;
273*84d9c625SLionel Sambuc 	DBT *rec;
274*84d9c625SLionel Sambuc 	DB_LSN *lsnp;
275*84d9c625SLionel Sambuc 	db_recops notused1;
276*84d9c625SLionel Sambuc 	void *summary;
277*84d9c625SLionel Sambuc {
278*84d9c625SLionel Sambuc 	TXN_RECS *t;
279*84d9c625SLionel Sambuc 	int ret;
280*84d9c625SLionel Sambuc 	COMPQUIET(rec, NULL);
281*84d9c625SLionel Sambuc 	COMPQUIET(notused1, DB_TXN_ABORT);
282*84d9c625SLionel Sambuc 
283*84d9c625SLionel Sambuc 	t = (TXN_RECS *)summary;
284*84d9c625SLionel Sambuc 
285*84d9c625SLionel Sambuc 	if ((ret = __rep_check_alloc(dbenv, t, 1)) != 0)
286*84d9c625SLionel Sambuc 		return (ret);
287*84d9c625SLionel Sambuc 
288*84d9c625SLionel Sambuc 	t->array[t->npages].flags = LSN_PAGE_NOLOCK;
289*84d9c625SLionel Sambuc 	t->array[t->npages].lsn = *lsnp;
290*84d9c625SLionel Sambuc 	t->array[t->npages].fid = DB_LOGFILEID_INVALID;
291*84d9c625SLionel Sambuc 	memset(&t->array[t->npages].pgdesc, 0,
292*84d9c625SLionel Sambuc 	    sizeof(t->array[t->npages].pgdesc));
293*84d9c625SLionel Sambuc 
294*84d9c625SLionel Sambuc 	t->npages++;
295*84d9c625SLionel Sambuc 
296*84d9c625SLionel Sambuc 	return (0);
297*84d9c625SLionel Sambuc }
298*84d9c625SLionel Sambuc 
299*84d9c625SLionel Sambuc /*
300*84d9c625SLionel Sambuc  * PUBLIC: int __vi_cursor_print __P((DB_ENV *, DBT *, DB_LSN *, db_recops,
301*84d9c625SLionel Sambuc  * PUBLIC:      void *));
302*84d9c625SLionel Sambuc  */
303*84d9c625SLionel Sambuc int
__vi_cursor_print(dbenv,dbtp,lsnp,notused2,notused3)304*84d9c625SLionel Sambuc __vi_cursor_print(dbenv, dbtp, lsnp, notused2, notused3)
305*84d9c625SLionel Sambuc 	DB_ENV *dbenv;
306*84d9c625SLionel Sambuc 	DBT *dbtp;
307*84d9c625SLionel Sambuc 	DB_LSN *lsnp;
308*84d9c625SLionel Sambuc 	db_recops notused2;
309*84d9c625SLionel Sambuc 	void *notused3;
310*84d9c625SLionel Sambuc {
311*84d9c625SLionel Sambuc 	__vi_cursor_args *argp;
312*84d9c625SLionel Sambuc 	int ret;
313*84d9c625SLionel Sambuc 
314*84d9c625SLionel Sambuc 	notused2 = DB_TXN_ABORT;
315*84d9c625SLionel Sambuc 	notused3 = NULL;
316*84d9c625SLionel Sambuc 
317*84d9c625SLionel Sambuc 	if ((ret = __vi_cursor_read(dbenv, dbtp->data, &argp)) != 0)
318*84d9c625SLionel Sambuc 		return (ret);
319*84d9c625SLionel Sambuc 	(void)printf(
320*84d9c625SLionel Sambuc 	    "[%lu][%lu]vi_cursor: rec: %lu txnid %lx prevlsn [%lu][%lu]\n",
321*84d9c625SLionel Sambuc 	    (u_long)lsnp->file,
322*84d9c625SLionel Sambuc 	    (u_long)lsnp->offset,
323*84d9c625SLionel Sambuc 	    (u_long)argp->type,
324*84d9c625SLionel Sambuc 	    (u_long)argp->txnid->txnid,
325*84d9c625SLionel Sambuc 	    (u_long)argp->prev_lsn.file,
326*84d9c625SLionel Sambuc 	    (u_long)argp->prev_lsn.offset);
327*84d9c625SLionel Sambuc 	(void)printf("\topcode: %lu\n", (u_long)argp->opcode);
328*84d9c625SLionel Sambuc 	(void)printf("\tlno: %lu\n", (u_long)argp->lno);
329*84d9c625SLionel Sambuc 	(void)printf("\tcno: %d\n", argp->cno);
330*84d9c625SLionel Sambuc 	(void)printf("\n");
331*84d9c625SLionel Sambuc 	__os_free(dbenv, argp, 0);
332*84d9c625SLionel Sambuc 	return (0);
333*84d9c625SLionel Sambuc }
334*84d9c625SLionel Sambuc 
335*84d9c625SLionel Sambuc /*
336*84d9c625SLionel Sambuc  * PUBLIC: int __vi_cursor_read __P((DB_ENV *, void *, __vi_cursor_args **));
337*84d9c625SLionel Sambuc  */
338*84d9c625SLionel Sambuc int
__vi_cursor_read(dbenv,recbuf,argpp)339*84d9c625SLionel Sambuc __vi_cursor_read(dbenv, recbuf, argpp)
340*84d9c625SLionel Sambuc 	DB_ENV *dbenv;
341*84d9c625SLionel Sambuc 	void *recbuf;
342*84d9c625SLionel Sambuc 	__vi_cursor_args **argpp;
343*84d9c625SLionel Sambuc {
344*84d9c625SLionel Sambuc 	__vi_cursor_args *argp;
345*84d9c625SLionel Sambuc 	int ret;
346*84d9c625SLionel Sambuc 	u_int32_t uinttmp;
347*84d9c625SLionel Sambuc 	u_int8_t *bp;
348*84d9c625SLionel Sambuc 
349*84d9c625SLionel Sambuc 	ret = __os_malloc(dbenv, sizeof(__vi_cursor_args) +
350*84d9c625SLionel Sambuc 	    sizeof(DB_TXN), &argp);
351*84d9c625SLionel Sambuc 	if (ret != 0)
352*84d9c625SLionel Sambuc 		return (ret);
353*84d9c625SLionel Sambuc 	argp->txnid = (DB_TXN *)&argp[1];
354*84d9c625SLionel Sambuc 
355*84d9c625SLionel Sambuc 	bp = recbuf;
356*84d9c625SLionel Sambuc 	memcpy(&argp->type, bp, sizeof(argp->type));
357*84d9c625SLionel Sambuc 	bp += sizeof(argp->type);
358*84d9c625SLionel Sambuc 
359*84d9c625SLionel Sambuc 	memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
360*84d9c625SLionel Sambuc 	bp += sizeof(argp->txnid->txnid);
361*84d9c625SLionel Sambuc 
362*84d9c625SLionel Sambuc 	memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
363*84d9c625SLionel Sambuc 	bp += sizeof(DB_LSN);
364*84d9c625SLionel Sambuc 
365*84d9c625SLionel Sambuc 	memcpy(&uinttmp, bp, sizeof(uinttmp));
366*84d9c625SLionel Sambuc 	argp->opcode = (u_int32_t)uinttmp;
367*84d9c625SLionel Sambuc 	bp += sizeof(uinttmp);
368*84d9c625SLionel Sambuc 
369*84d9c625SLionel Sambuc 	memcpy(&uinttmp, bp, sizeof(uinttmp));
370*84d9c625SLionel Sambuc 	argp->lno = (db_recno_t)uinttmp;
371*84d9c625SLionel Sambuc 	bp += sizeof(uinttmp);
372*84d9c625SLionel Sambuc 
373*84d9c625SLionel Sambuc 	memcpy(&uinttmp, bp, sizeof(uinttmp));
374*84d9c625SLionel Sambuc 	argp->cno = (size_t)uinttmp;
375*84d9c625SLionel Sambuc 	bp += sizeof(uinttmp);
376*84d9c625SLionel Sambuc 
377*84d9c625SLionel Sambuc 	*argpp = argp;
378*84d9c625SLionel Sambuc 	return (0);
379*84d9c625SLionel Sambuc }
380*84d9c625SLionel Sambuc 
381*84d9c625SLionel Sambuc /*
382*84d9c625SLionel Sambuc  * PUBLIC: int __vi_mark_log __P((DB_ENV *, DB_TXN *, DB_LSN *, u_int32_t,
383*84d9c625SLionel Sambuc  * PUBLIC:      LMARK *));
384*84d9c625SLionel Sambuc  */
385*84d9c625SLionel Sambuc int
__vi_mark_log(dbenv,txnid,ret_lsnp,flags,lmp)386*84d9c625SLionel Sambuc __vi_mark_log(dbenv, txnid, ret_lsnp, flags,
387*84d9c625SLionel Sambuc 	lmp)
388*84d9c625SLionel Sambuc 	DB_ENV *dbenv;
389*84d9c625SLionel Sambuc 	DB_TXN *txnid;
390*84d9c625SLionel Sambuc 	DB_LSN *ret_lsnp;
391*84d9c625SLionel Sambuc 	u_int32_t flags;
392*84d9c625SLionel Sambuc 	LMARK * lmp;
393*84d9c625SLionel Sambuc {
394*84d9c625SLionel Sambuc 	DBT logrec;
395*84d9c625SLionel Sambuc 	DB_LSN *lsnp, null_lsn;
396*84d9c625SLionel Sambuc 	u_int32_t rectype, txn_num;
397*84d9c625SLionel Sambuc 	int ret;
398*84d9c625SLionel Sambuc 	u_int8_t *bp;
399*84d9c625SLionel Sambuc 
400*84d9c625SLionel Sambuc 	rectype = DB_vi_mark;
401*84d9c625SLionel Sambuc 	if (txnid != NULL &&
402*84d9c625SLionel Sambuc 	    TAILQ_FIRST(&txnid->kids) != NULL &&
403*84d9c625SLionel Sambuc 	    (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
404*84d9c625SLionel Sambuc 		return (ret);
405*84d9c625SLionel Sambuc 	txn_num = txnid == NULL ? 0 : txnid->txnid;
406*84d9c625SLionel Sambuc 	if (txnid == NULL) {
407*84d9c625SLionel Sambuc 		ZERO_LSN(null_lsn);
408*84d9c625SLionel Sambuc 		lsnp = &null_lsn;
409*84d9c625SLionel Sambuc 	} else
410*84d9c625SLionel Sambuc 		lsnp = &txnid->last_lsn;
411*84d9c625SLionel Sambuc 	logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
412*84d9c625SLionel Sambuc 	    + sizeof(*lmp);
413*84d9c625SLionel Sambuc 	if ((ret = __os_malloc(dbenv, logrec.size, &logrec.data)) != 0)
414*84d9c625SLionel Sambuc 		return (ret);
415*84d9c625SLionel Sambuc 
416*84d9c625SLionel Sambuc 	bp = logrec.data;
417*84d9c625SLionel Sambuc 
418*84d9c625SLionel Sambuc 	memcpy(bp, &rectype, sizeof(rectype));
419*84d9c625SLionel Sambuc 	bp += sizeof(rectype);
420*84d9c625SLionel Sambuc 
421*84d9c625SLionel Sambuc 	memcpy(bp, &txn_num, sizeof(txn_num));
422*84d9c625SLionel Sambuc 	bp += sizeof(txn_num);
423*84d9c625SLionel Sambuc 
424*84d9c625SLionel Sambuc 	memcpy(bp, lsnp, sizeof(DB_LSN));
425*84d9c625SLionel Sambuc 	bp += sizeof(DB_LSN);
426*84d9c625SLionel Sambuc 
427*84d9c625SLionel Sambuc 	if (lmp != NULL)
428*84d9c625SLionel Sambuc 		memcpy(bp, lmp, sizeof(*lmp));
429*84d9c625SLionel Sambuc 	else
430*84d9c625SLionel Sambuc 		memset(bp, 0, sizeof(*lmp));
431*84d9c625SLionel Sambuc 	bp += sizeof(*lmp);
432*84d9c625SLionel Sambuc 
433*84d9c625SLionel Sambuc 	DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) == logrec.size);
434*84d9c625SLionel Sambuc 	ret = dbenv->log_put(dbenv, ret_lsnp, (DBT *)&logrec, flags);
435*84d9c625SLionel Sambuc 	if (txnid != NULL && ret == 0)
436*84d9c625SLionel Sambuc 		txnid->last_lsn = *ret_lsnp;
437*84d9c625SLionel Sambuc #ifdef LOG_DIAGNOSTIC
438*84d9c625SLionel Sambuc 	if (ret != 0)
439*84d9c625SLionel Sambuc 		(void)__vi_mark_print(dbenv,
440*84d9c625SLionel Sambuc 		    (DBT *)&logrec, ret_lsnp, NULL, NULL);
441*84d9c625SLionel Sambuc #endif
442*84d9c625SLionel Sambuc 	__os_free(dbenv, logrec.data, logrec.size);
443*84d9c625SLionel Sambuc 	return (ret);
444*84d9c625SLionel Sambuc }
445*84d9c625SLionel Sambuc 
446*84d9c625SLionel Sambuc /*
447*84d9c625SLionel Sambuc  * PUBLIC: int __vi_mark_getpgnos __P((DB_ENV *, DBT *, DB_LSN *, db_recops,
448*84d9c625SLionel Sambuc  * PUBLIC:      void *));
449*84d9c625SLionel Sambuc  */
450*84d9c625SLionel Sambuc int
__vi_mark_getpgnos(dbenv,rec,lsnp,notused1,summary)451*84d9c625SLionel Sambuc __vi_mark_getpgnos(dbenv, rec, lsnp, notused1, summary)
452*84d9c625SLionel Sambuc 	DB_ENV *dbenv;
453*84d9c625SLionel Sambuc 	DBT *rec;
454*84d9c625SLionel Sambuc 	DB_LSN *lsnp;
455*84d9c625SLionel Sambuc 	db_recops notused1;
456*84d9c625SLionel Sambuc 	void *summary;
457*84d9c625SLionel Sambuc {
458*84d9c625SLionel Sambuc 	TXN_RECS *t;
459*84d9c625SLionel Sambuc 	int ret;
460*84d9c625SLionel Sambuc 	COMPQUIET(rec, NULL);
461*84d9c625SLionel Sambuc 	COMPQUIET(notused1, DB_TXN_ABORT);
462*84d9c625SLionel Sambuc 
463*84d9c625SLionel Sambuc 	t = (TXN_RECS *)summary;
464*84d9c625SLionel Sambuc 
465*84d9c625SLionel Sambuc 	if ((ret = __rep_check_alloc(dbenv, t, 1)) != 0)
466*84d9c625SLionel Sambuc 		return (ret);
467*84d9c625SLionel Sambuc 
468*84d9c625SLionel Sambuc 	t->array[t->npages].flags = LSN_PAGE_NOLOCK;
469*84d9c625SLionel Sambuc 	t->array[t->npages].lsn = *lsnp;
470*84d9c625SLionel Sambuc 	t->array[t->npages].fid = DB_LOGFILEID_INVALID;
471*84d9c625SLionel Sambuc 	memset(&t->array[t->npages].pgdesc, 0,
472*84d9c625SLionel Sambuc 	    sizeof(t->array[t->npages].pgdesc));
473*84d9c625SLionel Sambuc 
474*84d9c625SLionel Sambuc 	t->npages++;
475*84d9c625SLionel Sambuc 
476*84d9c625SLionel Sambuc 	return (0);
477*84d9c625SLionel Sambuc }
478*84d9c625SLionel Sambuc 
479*84d9c625SLionel Sambuc /*
480*84d9c625SLionel Sambuc  * PUBLIC: int __vi_mark_print __P((DB_ENV *, DBT *, DB_LSN *, db_recops,
481*84d9c625SLionel Sambuc  * PUBLIC:      void *));
482*84d9c625SLionel Sambuc  */
483*84d9c625SLionel Sambuc int
__vi_mark_print(dbenv,dbtp,lsnp,notused2,notused3)484*84d9c625SLionel Sambuc __vi_mark_print(dbenv, dbtp, lsnp, notused2, notused3)
485*84d9c625SLionel Sambuc 	DB_ENV *dbenv;
486*84d9c625SLionel Sambuc 	DBT *dbtp;
487*84d9c625SLionel Sambuc 	DB_LSN *lsnp;
488*84d9c625SLionel Sambuc 	db_recops notused2;
489*84d9c625SLionel Sambuc 	void *notused3;
490*84d9c625SLionel Sambuc {
491*84d9c625SLionel Sambuc 	__vi_mark_args *argp;
492*84d9c625SLionel Sambuc 	int ret;
493*84d9c625SLionel Sambuc 
494*84d9c625SLionel Sambuc 	notused2 = DB_TXN_ABORT;
495*84d9c625SLionel Sambuc 	notused3 = NULL;
496*84d9c625SLionel Sambuc 
497*84d9c625SLionel Sambuc 	if ((ret = __vi_mark_read(dbenv, dbtp->data, &argp)) != 0)
498*84d9c625SLionel Sambuc 		return (ret);
499*84d9c625SLionel Sambuc 	(void)printf(
500*84d9c625SLionel Sambuc 	    "[%lu][%lu]vi_mark: rec: %lu txnid %lx prevlsn [%lu][%lu]\n",
501*84d9c625SLionel Sambuc 	    (u_long)lsnp->file,
502*84d9c625SLionel Sambuc 	    (u_long)lsnp->offset,
503*84d9c625SLionel Sambuc 	    (u_long)argp->type,
504*84d9c625SLionel Sambuc 	    (u_long)argp->txnid->txnid,
505*84d9c625SLionel Sambuc 	    (u_long)argp->prev_lsn.file,
506*84d9c625SLionel Sambuc 	    (u_long)argp->prev_lsn.offset);
507*84d9c625SLionel Sambuc 	(void)printf("\tlmp: %%\n", argp->lmp);
508*84d9c625SLionel Sambuc 	(void)printf("\n");
509*84d9c625SLionel Sambuc 	__os_free(dbenv, argp, 0);
510*84d9c625SLionel Sambuc 	return (0);
511*84d9c625SLionel Sambuc }
512*84d9c625SLionel Sambuc 
513*84d9c625SLionel Sambuc /*
514*84d9c625SLionel Sambuc  * PUBLIC: int __vi_mark_read __P((DB_ENV *, void *, __vi_mark_args **));
515*84d9c625SLionel Sambuc  */
516*84d9c625SLionel Sambuc int
__vi_mark_read(dbenv,recbuf,argpp)517*84d9c625SLionel Sambuc __vi_mark_read(dbenv, recbuf, argpp)
518*84d9c625SLionel Sambuc 	DB_ENV *dbenv;
519*84d9c625SLionel Sambuc 	void *recbuf;
520*84d9c625SLionel Sambuc 	__vi_mark_args **argpp;
521*84d9c625SLionel Sambuc {
522*84d9c625SLionel Sambuc 	__vi_mark_args *argp;
523*84d9c625SLionel Sambuc 	int ret;
524*84d9c625SLionel Sambuc 	u_int8_t *bp;
525*84d9c625SLionel Sambuc 
526*84d9c625SLionel Sambuc 	ret = __os_malloc(dbenv, sizeof(__vi_mark_args) +
527*84d9c625SLionel Sambuc 	    sizeof(DB_TXN), &argp);
528*84d9c625SLionel Sambuc 	if (ret != 0)
529*84d9c625SLionel Sambuc 		return (ret);
530*84d9c625SLionel Sambuc 	argp->txnid = (DB_TXN *)&argp[1];
531*84d9c625SLionel Sambuc 
532*84d9c625SLionel Sambuc 	bp = recbuf;
533*84d9c625SLionel Sambuc 	memcpy(&argp->type, bp, sizeof(argp->type));
534*84d9c625SLionel Sambuc 	bp += sizeof(argp->type);
535*84d9c625SLionel Sambuc 
536*84d9c625SLionel Sambuc 	memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
537*84d9c625SLionel Sambuc 	bp += sizeof(argp->txnid->txnid);
538*84d9c625SLionel Sambuc 
539*84d9c625SLionel Sambuc 	memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
540*84d9c625SLionel Sambuc 	bp += sizeof(DB_LSN);
541*84d9c625SLionel Sambuc 
542*84d9c625SLionel Sambuc 	memcpy(&argp->lmp, bp,  sizeof(argp->lmp));
543*84d9c625SLionel Sambuc 	bp += sizeof(argp->lmp);
544*84d9c625SLionel Sambuc 
545*84d9c625SLionel Sambuc 	*argpp = argp;
546*84d9c625SLionel Sambuc 	return (0);
547*84d9c625SLionel Sambuc }
548*84d9c625SLionel Sambuc 
549*84d9c625SLionel Sambuc /*
550*84d9c625SLionel Sambuc  * PUBLIC: int __vi_change_log __P((DB_ENV *, DB_TXN *, DB_LSN *, u_int32_t,
551*84d9c625SLionel Sambuc  * PUBLIC:      u_int32_t, db_recno_t));
552*84d9c625SLionel Sambuc  */
553*84d9c625SLionel Sambuc int
__vi_change_log(dbenv,txnid,ret_lsnp,flags,opcode,lno)554*84d9c625SLionel Sambuc __vi_change_log(dbenv, txnid, ret_lsnp, flags,
555*84d9c625SLionel Sambuc 	opcode, lno)
556*84d9c625SLionel Sambuc 	DB_ENV *dbenv;
557*84d9c625SLionel Sambuc 	DB_TXN *txnid;
558*84d9c625SLionel Sambuc 	DB_LSN *ret_lsnp;
559*84d9c625SLionel Sambuc 	u_int32_t flags;
560*84d9c625SLionel Sambuc 	u_int32_t opcode;
561*84d9c625SLionel Sambuc 	db_recno_t lno;
562*84d9c625SLionel Sambuc {
563*84d9c625SLionel Sambuc 	DBT logrec;
564*84d9c625SLionel Sambuc 	DB_LSN *lsnp, null_lsn;
565*84d9c625SLionel Sambuc 	u_int32_t uinttmp;
566*84d9c625SLionel Sambuc 	u_int32_t rectype, txn_num;
567*84d9c625SLionel Sambuc 	int ret;
568*84d9c625SLionel Sambuc 	u_int8_t *bp;
569*84d9c625SLionel Sambuc 
570*84d9c625SLionel Sambuc 	rectype = DB_vi_change;
571*84d9c625SLionel Sambuc 	if (txnid != NULL &&
572*84d9c625SLionel Sambuc 	    TAILQ_FIRST(&txnid->kids) != NULL &&
573*84d9c625SLionel Sambuc 	    (ret = __txn_activekids(dbenv, rectype, txnid)) != 0)
574*84d9c625SLionel Sambuc 		return (ret);
575*84d9c625SLionel Sambuc 	txn_num = txnid == NULL ? 0 : txnid->txnid;
576*84d9c625SLionel Sambuc 	if (txnid == NULL) {
577*84d9c625SLionel Sambuc 		ZERO_LSN(null_lsn);
578*84d9c625SLionel Sambuc 		lsnp = &null_lsn;
579*84d9c625SLionel Sambuc 	} else
580*84d9c625SLionel Sambuc 		lsnp = &txnid->last_lsn;
581*84d9c625SLionel Sambuc 	logrec.size = sizeof(rectype) + sizeof(txn_num) + sizeof(DB_LSN)
582*84d9c625SLionel Sambuc 	    + sizeof(u_int32_t)
583*84d9c625SLionel Sambuc 	    + sizeof(u_int32_t);
584*84d9c625SLionel Sambuc 	if ((ret = __os_malloc(dbenv, logrec.size, &logrec.data)) != 0)
585*84d9c625SLionel Sambuc 		return (ret);
586*84d9c625SLionel Sambuc 
587*84d9c625SLionel Sambuc 	bp = logrec.data;
588*84d9c625SLionel Sambuc 
589*84d9c625SLionel Sambuc 	memcpy(bp, &rectype, sizeof(rectype));
590*84d9c625SLionel Sambuc 	bp += sizeof(rectype);
591*84d9c625SLionel Sambuc 
592*84d9c625SLionel Sambuc 	memcpy(bp, &txn_num, sizeof(txn_num));
593*84d9c625SLionel Sambuc 	bp += sizeof(txn_num);
594*84d9c625SLionel Sambuc 
595*84d9c625SLionel Sambuc 	memcpy(bp, lsnp, sizeof(DB_LSN));
596*84d9c625SLionel Sambuc 	bp += sizeof(DB_LSN);
597*84d9c625SLionel Sambuc 
598*84d9c625SLionel Sambuc 	uinttmp = (u_int32_t)opcode;
599*84d9c625SLionel Sambuc 	memcpy(bp, &uinttmp, sizeof(uinttmp));
600*84d9c625SLionel Sambuc 	bp += sizeof(uinttmp);
601*84d9c625SLionel Sambuc 
602*84d9c625SLionel Sambuc 	uinttmp = (u_int32_t)lno;
603*84d9c625SLionel Sambuc 	memcpy(bp, &uinttmp, sizeof(uinttmp));
604*84d9c625SLionel Sambuc 	bp += sizeof(uinttmp);
605*84d9c625SLionel Sambuc 
606*84d9c625SLionel Sambuc 	DB_ASSERT((u_int32_t)(bp - (u_int8_t *)logrec.data) == logrec.size);
607*84d9c625SLionel Sambuc 	ret = dbenv->log_put(dbenv, ret_lsnp, (DBT *)&logrec, flags);
608*84d9c625SLionel Sambuc 	if (txnid != NULL && ret == 0)
609*84d9c625SLionel Sambuc 		txnid->last_lsn = *ret_lsnp;
610*84d9c625SLionel Sambuc #ifdef LOG_DIAGNOSTIC
611*84d9c625SLionel Sambuc 	if (ret != 0)
612*84d9c625SLionel Sambuc 		(void)__vi_change_print(dbenv,
613*84d9c625SLionel Sambuc 		    (DBT *)&logrec, ret_lsnp, NULL, NULL);
614*84d9c625SLionel Sambuc #endif
615*84d9c625SLionel Sambuc 	__os_free(dbenv, logrec.data, logrec.size);
616*84d9c625SLionel Sambuc 	return (ret);
617*84d9c625SLionel Sambuc }
618*84d9c625SLionel Sambuc 
619*84d9c625SLionel Sambuc /*
620*84d9c625SLionel Sambuc  * PUBLIC: int __vi_change_getpgnos __P((DB_ENV *, DBT *, DB_LSN *, db_recops,
621*84d9c625SLionel Sambuc  * PUBLIC:      void *));
622*84d9c625SLionel Sambuc  */
623*84d9c625SLionel Sambuc int
__vi_change_getpgnos(dbenv,rec,lsnp,notused1,summary)624*84d9c625SLionel Sambuc __vi_change_getpgnos(dbenv, rec, lsnp, notused1, summary)
625*84d9c625SLionel Sambuc 	DB_ENV *dbenv;
626*84d9c625SLionel Sambuc 	DBT *rec;
627*84d9c625SLionel Sambuc 	DB_LSN *lsnp;
628*84d9c625SLionel Sambuc 	db_recops notused1;
629*84d9c625SLionel Sambuc 	void *summary;
630*84d9c625SLionel Sambuc {
631*84d9c625SLionel Sambuc 	TXN_RECS *t;
632*84d9c625SLionel Sambuc 	int ret;
633*84d9c625SLionel Sambuc 	COMPQUIET(rec, NULL);
634*84d9c625SLionel Sambuc 	COMPQUIET(notused1, DB_TXN_ABORT);
635*84d9c625SLionel Sambuc 
636*84d9c625SLionel Sambuc 	t = (TXN_RECS *)summary;
637*84d9c625SLionel Sambuc 
638*84d9c625SLionel Sambuc 	if ((ret = __rep_check_alloc(dbenv, t, 1)) != 0)
639*84d9c625SLionel Sambuc 		return (ret);
640*84d9c625SLionel Sambuc 
641*84d9c625SLionel Sambuc 	t->array[t->npages].flags = LSN_PAGE_NOLOCK;
642*84d9c625SLionel Sambuc 	t->array[t->npages].lsn = *lsnp;
643*84d9c625SLionel Sambuc 	t->array[t->npages].fid = DB_LOGFILEID_INVALID;
644*84d9c625SLionel Sambuc 	memset(&t->array[t->npages].pgdesc, 0,
645*84d9c625SLionel Sambuc 	    sizeof(t->array[t->npages].pgdesc));
646*84d9c625SLionel Sambuc 
647*84d9c625SLionel Sambuc 	t->npages++;
648*84d9c625SLionel Sambuc 
649*84d9c625SLionel Sambuc 	return (0);
650*84d9c625SLionel Sambuc }
651*84d9c625SLionel Sambuc 
652*84d9c625SLionel Sambuc /*
653*84d9c625SLionel Sambuc  * PUBLIC: int __vi_change_print __P((DB_ENV *, DBT *, DB_LSN *, db_recops,
654*84d9c625SLionel Sambuc  * PUBLIC:      void *));
655*84d9c625SLionel Sambuc  */
656*84d9c625SLionel Sambuc int
__vi_change_print(dbenv,dbtp,lsnp,notused2,notused3)657*84d9c625SLionel Sambuc __vi_change_print(dbenv, dbtp, lsnp, notused2, notused3)
658*84d9c625SLionel Sambuc 	DB_ENV *dbenv;
659*84d9c625SLionel Sambuc 	DBT *dbtp;
660*84d9c625SLionel Sambuc 	DB_LSN *lsnp;
661*84d9c625SLionel Sambuc 	db_recops notused2;
662*84d9c625SLionel Sambuc 	void *notused3;
663*84d9c625SLionel Sambuc {
664*84d9c625SLionel Sambuc 	__vi_change_args *argp;
665*84d9c625SLionel Sambuc 	int ret;
666*84d9c625SLionel Sambuc 
667*84d9c625SLionel Sambuc 	notused2 = DB_TXN_ABORT;
668*84d9c625SLionel Sambuc 	notused3 = NULL;
669*84d9c625SLionel Sambuc 
670*84d9c625SLionel Sambuc 	if ((ret = __vi_change_read(dbenv, dbtp->data, &argp)) != 0)
671*84d9c625SLionel Sambuc 		return (ret);
672*84d9c625SLionel Sambuc 	(void)printf(
673*84d9c625SLionel Sambuc 	    "[%lu][%lu]vi_change: rec: %lu txnid %lx prevlsn [%lu][%lu]\n",
674*84d9c625SLionel Sambuc 	    (u_long)lsnp->file,
675*84d9c625SLionel Sambuc 	    (u_long)lsnp->offset,
676*84d9c625SLionel Sambuc 	    (u_long)argp->type,
677*84d9c625SLionel Sambuc 	    (u_long)argp->txnid->txnid,
678*84d9c625SLionel Sambuc 	    (u_long)argp->prev_lsn.file,
679*84d9c625SLionel Sambuc 	    (u_long)argp->prev_lsn.offset);
680*84d9c625SLionel Sambuc 	(void)printf("\topcode: %lu\n", (u_long)argp->opcode);
681*84d9c625SLionel Sambuc 	(void)printf("\tlno: %lu\n", (u_long)argp->lno);
682*84d9c625SLionel Sambuc 	(void)printf("\n");
683*84d9c625SLionel Sambuc 	__os_free(dbenv, argp, 0);
684*84d9c625SLionel Sambuc 	return (0);
685*84d9c625SLionel Sambuc }
686*84d9c625SLionel Sambuc 
687*84d9c625SLionel Sambuc /*
688*84d9c625SLionel Sambuc  * PUBLIC: int __vi_change_read __P((DB_ENV *, void *, __vi_change_args **));
689*84d9c625SLionel Sambuc  */
690*84d9c625SLionel Sambuc int
__vi_change_read(dbenv,recbuf,argpp)691*84d9c625SLionel Sambuc __vi_change_read(dbenv, recbuf, argpp)
692*84d9c625SLionel Sambuc 	DB_ENV *dbenv;
693*84d9c625SLionel Sambuc 	void *recbuf;
694*84d9c625SLionel Sambuc 	__vi_change_args **argpp;
695*84d9c625SLionel Sambuc {
696*84d9c625SLionel Sambuc 	__vi_change_args *argp;
697*84d9c625SLionel Sambuc 	int ret;
698*84d9c625SLionel Sambuc 	u_int32_t uinttmp;
699*84d9c625SLionel Sambuc 	u_int8_t *bp;
700*84d9c625SLionel Sambuc 
701*84d9c625SLionel Sambuc 	ret = __os_malloc(dbenv, sizeof(__vi_change_args) +
702*84d9c625SLionel Sambuc 	    sizeof(DB_TXN), &argp);
703*84d9c625SLionel Sambuc 	if (ret != 0)
704*84d9c625SLionel Sambuc 		return (ret);
705*84d9c625SLionel Sambuc 	argp->txnid = (DB_TXN *)&argp[1];
706*84d9c625SLionel Sambuc 
707*84d9c625SLionel Sambuc 	bp = recbuf;
708*84d9c625SLionel Sambuc 	memcpy(&argp->type, bp, sizeof(argp->type));
709*84d9c625SLionel Sambuc 	bp += sizeof(argp->type);
710*84d9c625SLionel Sambuc 
711*84d9c625SLionel Sambuc 	memcpy(&argp->txnid->txnid,  bp, sizeof(argp->txnid->txnid));
712*84d9c625SLionel Sambuc 	bp += sizeof(argp->txnid->txnid);
713*84d9c625SLionel Sambuc 
714*84d9c625SLionel Sambuc 	memcpy(&argp->prev_lsn, bp, sizeof(DB_LSN));
715*84d9c625SLionel Sambuc 	bp += sizeof(DB_LSN);
716*84d9c625SLionel Sambuc 
717*84d9c625SLionel Sambuc 	memcpy(&uinttmp, bp, sizeof(uinttmp));
718*84d9c625SLionel Sambuc 	argp->opcode = (u_int32_t)uinttmp;
719*84d9c625SLionel Sambuc 	bp += sizeof(uinttmp);
720*84d9c625SLionel Sambuc 
721*84d9c625SLionel Sambuc 	memcpy(&uinttmp, bp, sizeof(uinttmp));
722*84d9c625SLionel Sambuc 	argp->lno = (db_recno_t)uinttmp;
723*84d9c625SLionel Sambuc 	bp += sizeof(uinttmp);
724*84d9c625SLionel Sambuc 
725*84d9c625SLionel Sambuc 	*argpp = argp;
726*84d9c625SLionel Sambuc 	return (0);
727*84d9c625SLionel Sambuc }
728*84d9c625SLionel Sambuc 
729*84d9c625SLionel Sambuc /*
730*84d9c625SLionel Sambuc  * PUBLIC: int __vi_init_print __P((DB_ENV *, int (***)(DB_ENV *, DBT *,
731*84d9c625SLionel Sambuc  * PUBLIC:      DB_LSN *, db_recops, void *), size_t *));
732*84d9c625SLionel Sambuc  */
733*84d9c625SLionel Sambuc int
__vi_init_print(dbenv,dtabp,dtabsizep)734*84d9c625SLionel Sambuc __vi_init_print(dbenv, dtabp, dtabsizep)
735*84d9c625SLionel Sambuc 	DB_ENV *dbenv;
736*84d9c625SLionel Sambuc 	int (***dtabp)__P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
737*84d9c625SLionel Sambuc 	size_t *dtabsizep;
738*84d9c625SLionel Sambuc {
739*84d9c625SLionel Sambuc 	int ret;
740*84d9c625SLionel Sambuc 
741*84d9c625SLionel Sambuc 	if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
742*84d9c625SLionel Sambuc 	    __vi_marker_print, DB_vi_marker)) != 0)
743*84d9c625SLionel Sambuc 		return (ret);
744*84d9c625SLionel Sambuc 	if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
745*84d9c625SLionel Sambuc 	    __vi_cursor_print, DB_vi_cursor)) != 0)
746*84d9c625SLionel Sambuc 		return (ret);
747*84d9c625SLionel Sambuc 	if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
748*84d9c625SLionel Sambuc 	    __vi_mark_print, DB_vi_mark)) != 0)
749*84d9c625SLionel Sambuc 		return (ret);
750*84d9c625SLionel Sambuc 	if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
751*84d9c625SLionel Sambuc 	    __vi_change_print, DB_vi_change)) != 0)
752*84d9c625SLionel Sambuc 		return (ret);
753*84d9c625SLionel Sambuc 	return (0);
754*84d9c625SLionel Sambuc }
755*84d9c625SLionel Sambuc 
756*84d9c625SLionel Sambuc /*
757*84d9c625SLionel Sambuc  * PUBLIC: int __vi_init_getpgnos __P((DB_ENV *, int (***)(DB_ENV *, DBT *,
758*84d9c625SLionel Sambuc  * PUBLIC:      DB_LSN *, db_recops, void *), size_t *));
759*84d9c625SLionel Sambuc  */
760*84d9c625SLionel Sambuc int
__vi_init_getpgnos(dbenv,dtabp,dtabsizep)761*84d9c625SLionel Sambuc __vi_init_getpgnos(dbenv, dtabp, dtabsizep)
762*84d9c625SLionel Sambuc 	DB_ENV *dbenv;
763*84d9c625SLionel Sambuc 	int (***dtabp)__P((DB_ENV *, DBT *, DB_LSN *, db_recops, void *));
764*84d9c625SLionel Sambuc 	size_t *dtabsizep;
765*84d9c625SLionel Sambuc {
766*84d9c625SLionel Sambuc 	int ret;
767*84d9c625SLionel Sambuc 
768*84d9c625SLionel Sambuc 	if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
769*84d9c625SLionel Sambuc 	    __vi_marker_getpgnos, DB_vi_marker)) != 0)
770*84d9c625SLionel Sambuc 		return (ret);
771*84d9c625SLionel Sambuc 	if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
772*84d9c625SLionel Sambuc 	    __vi_cursor_getpgnos, DB_vi_cursor)) != 0)
773*84d9c625SLionel Sambuc 		return (ret);
774*84d9c625SLionel Sambuc 	if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
775*84d9c625SLionel Sambuc 	    __vi_mark_getpgnos, DB_vi_mark)) != 0)
776*84d9c625SLionel Sambuc 		return (ret);
777*84d9c625SLionel Sambuc 	if ((ret = __db_add_recovery(dbenv, dtabp, dtabsizep,
778*84d9c625SLionel Sambuc 	    __vi_change_getpgnos, DB_vi_change)) != 0)
779*84d9c625SLionel Sambuc 		return (ret);
780*84d9c625SLionel Sambuc 	return (0);
781*84d9c625SLionel Sambuc }
782*84d9c625SLionel Sambuc 
783*84d9c625SLionel Sambuc /*
784*84d9c625SLionel Sambuc  * PUBLIC: int __vi_init_recover __P((DB_ENV *));
785*84d9c625SLionel Sambuc  */
786*84d9c625SLionel Sambuc int
__vi_init_recover(dbenv)787*84d9c625SLionel Sambuc __vi_init_recover(dbenv)
788*84d9c625SLionel Sambuc 	DB_ENV *dbenv;
789*84d9c625SLionel Sambuc {
790*84d9c625SLionel Sambuc 	int ret;
791*84d9c625SLionel Sambuc 
792*84d9c625SLionel Sambuc 	if ((ret = __db_add_recovery(dbenv, &dbenv->dtab, &dbenv->dtab_size,
793*84d9c625SLionel Sambuc 	    __vi_marker_recover, DB_vi_marker)) != 0)
794*84d9c625SLionel Sambuc 		return (ret);
795*84d9c625SLionel Sambuc 	if ((ret = __db_add_recovery(dbenv, &dbenv->dtab, &dbenv->dtab_size,
796*84d9c625SLionel Sambuc 	    __vi_cursor_recover, DB_vi_cursor)) != 0)
797*84d9c625SLionel Sambuc 		return (ret);
798*84d9c625SLionel Sambuc 	if ((ret = __db_add_recovery(dbenv, &dbenv->dtab, &dbenv->dtab_size,
799*84d9c625SLionel Sambuc 	    __vi_mark_recover, DB_vi_mark)) != 0)
800*84d9c625SLionel Sambuc 		return (ret);
801*84d9c625SLionel Sambuc 	if ((ret = __db_add_recovery(dbenv, &dbenv->dtab, &dbenv->dtab_size,
802*84d9c625SLionel Sambuc 	    __vi_change_recover, DB_vi_change)) != 0)
803*84d9c625SLionel Sambuc 		return (ret);
804*84d9c625SLionel Sambuc 	return (0);
805*84d9c625SLionel Sambuc }
806*84d9c625SLionel Sambuc /*
807*84d9c625SLionel Sambuc  * PUBLIC: #endif
808*84d9c625SLionel Sambuc  */
809