8
8
*
9
9
*
10
10
* IDENTIFICATION
11
- * $Header: /cvsroot/pgsql/src/backend/storage/page/bufpage.c,v 1.45 2002/06/20 20:29:35 momjian Exp $
11
+ * $Header: /cvsroot/pgsql/src/backend/storage/page/bufpage.c,v 1.46 2002/07/02 05:48:44 momjian Exp $
12
12
*
13
13
*-------------------------------------------------------------------------
14
14
*/
@@ -37,13 +37,12 @@ PageInit(Page page, Size pageSize, Size specialSize)
37
37
specialSize = MAXALIGN (specialSize );
38
38
39
39
Assert (pageSize == BLCKSZ );
40
- Assert (pageSize >
41
- specialSize + sizeof (PageHeaderData )- sizeof (ItemIdData ));
40
+ Assert (pageSize > specialSize + SizeOfPageHeaderData );
42
41
43
42
/* Make sure all fields of page are zero, as well as unused space */
44
43
MemSet (p ,0 ,pageSize );
45
44
46
- p -> pd_lower = sizeof ( PageHeaderData ) - sizeof ( ItemIdData ) ;
45
+ p -> pd_lower = SizeOfPageHeaderData ;
47
46
p -> pd_upper = pageSize - specialSize ;
48
47
p -> pd_special = pageSize - specialSize ;
49
48
PageSetPageSize (page ,pageSize );
@@ -88,7 +87,7 @@ PageAddItem(Page page,
88
87
/*
89
88
* Be wary about corrupted page pointers
90
89
*/
91
- if (phdr -> pd_lower < ( sizeof ( PageHeaderData ) - sizeof ( ItemIdData )) ||
90
+ if (phdr -> pd_lower < SizeOfPageHeaderData ||
92
91
phdr -> pd_lower > phdr -> pd_upper ||
93
92
phdr -> pd_upper > phdr -> pd_special ||
94
93
phdr -> pd_special > BLCKSZ )
@@ -112,7 +111,7 @@ PageAddItem(Page page,
112
111
}
113
112
if (offsetNumber < limit )
114
113
{
115
- itemId = & phdr -> pd_linp [ offsetNumber - 1 ] ;
114
+ itemId = PageGetItemId ( phdr , offsetNumber ) ;
116
115
if (((* itemId ).lp_flags & LP_USED )||
117
116
((* itemId ).lp_len != 0 ))
118
117
{
@@ -136,7 +135,7 @@ PageAddItem(Page page,
136
135
/* look for "recyclable" (unused & deallocated) ItemId */
137
136
for (offsetNumber = 1 ;offsetNumber < limit ;offsetNumber ++ )
138
137
{
139
- itemId = & phdr -> pd_linp [ offsetNumber - 1 ] ;
138
+ itemId = PageGetItemId ( phdr , offsetNumber ) ;
140
139
if ((((* itemId ).lp_flags & LP_USED )== 0 )&&
141
140
((* itemId ).lp_len == 0 ))
142
141
break ;
@@ -150,7 +149,7 @@ PageAddItem(Page page,
150
149
* alignedSize > pd_upper.
151
150
*/
152
151
if (offsetNumber > limit )
153
- lower = (char * )( & phdr -> pd_linp [ offsetNumber ] )- (char * )page ;
152
+ lower = (char * )PageGetItemId ( phdr , offsetNumber + 1 )- (char * )page ;
154
153
else if (offsetNumber == limit || needshuffle )
155
154
lower = phdr -> pd_lower + sizeof (ItemIdData );
156
155
else
@@ -175,13 +174,13 @@ PageAddItem(Page page,
175
174
ItemId fromitemId ,
176
175
toitemId ;
177
176
178
- fromitemId = & phdr -> pd_linp [ i - 1 ] ;
179
- toitemId = & phdr -> pd_linp [ i ] ;
177
+ fromitemId = PageGetItemId ( phdr , i ) ;
178
+ toitemId = PageGetItemId ( phdr , i + 1 ) ;
180
179
* toitemId = * fromitemId ;
181
180
}
182
181
}
183
182
184
- itemId = & phdr -> pd_linp [ offsetNumber - 1 ] ;
183
+ itemId = PageGetItemId ( phdr , offsetNumber ) ;
185
184
(* itemId ).lp_off = upper ;
186
185
(* itemId ).lp_len = size ;
187
186
(* itemId ).lp_flags = flags ;
@@ -214,12 +213,12 @@ PageGetTempPage(Page page, Size specialSize)
214
213
memcpy (temp ,page ,pageSize );
215
214
216
215
/* clear out the middle */
217
- size = ( pageSize - sizeof ( PageHeaderData )) + sizeof ( ItemIdData ) ;
216
+ size = pageSize - SizeOfPageHeaderData ;
218
217
size -= MAXALIGN (specialSize );
219
- MemSet (( char * ) & ( thdr -> pd_linp [ 0 ] ),0 ,size );
218
+ MemSet (PageGetContents ( thdr ),0 ,size );
220
219
221
220
/* set high, low water marks */
222
- thdr -> pd_lower = sizeof ( PageHeaderData ) - sizeof ( ItemIdData ) ;
221
+ thdr -> pd_lower = SizeOfPageHeaderData ;
223
222
thdr -> pd_upper = pageSize - MAXALIGN (specialSize );
224
223
225
224
return temp ;
@@ -291,7 +290,7 @@ PageRepairFragmentation(Page page, OffsetNumber *unused)
291
290
* pointers, lengths, etc could cause us to clobber adjacent disk
292
291
* buffers, spreading the data loss further. So, check everything.
293
292
*/
294
- if (pd_lower < ( sizeof ( PageHeaderData ) - sizeof ( ItemIdData )) ||
293
+ if (pd_lower < SizeOfPageHeaderData ||
295
294
pd_lower > pd_upper ||
296
295
pd_upper > pd_special ||
297
296
pd_special > BLCKSZ ||
@@ -303,7 +302,7 @@ PageRepairFragmentation(Page page, OffsetNumber *unused)
303
302
nused = 0 ;
304
303
for (i = 0 ;i < nline ;i ++ )
305
304
{
306
- lp = (( PageHeader ) page ) -> pd_linp + i ;
305
+ lp = PageGetItemId ( page , i + 1 ) ;
307
306
if ((* lp ).lp_flags & LP_DELETE )/* marked for deletion */
308
307
(* lp ).lp_flags &= ~(LP_USED |LP_DELETE );
309
308
if ((* lp ).lp_flags & LP_USED )
@@ -317,7 +316,7 @@ PageRepairFragmentation(Page page, OffsetNumber *unused)
317
316
/* Page is completely empty, so just reset it quickly */
318
317
for (i = 0 ;i < nline ;i ++ )
319
318
{
320
- lp = (( PageHeader ) page ) -> pd_linp + i ;
319
+ lp = PageGetItemId ( page , i + 1 ) ;
321
320
(* lp ).lp_len = 0 ;/* indicate unused & deallocated */
322
321
}
323
322
((PageHeader )page )-> pd_upper = pd_special ;
@@ -331,7 +330,7 @@ PageRepairFragmentation(Page page, OffsetNumber *unused)
331
330
totallen = 0 ;
332
331
for (i = 0 ;i < nline ;i ++ )
333
332
{
334
- lp = (( PageHeader ) page ) -> pd_linp + i ;
333
+ lp = PageGetItemId ( page , i + 1 ) ;
335
334
if ((* lp ).lp_flags & LP_USED )
336
335
{
337
336
itemidptr -> offsetindex = i ;
@@ -363,7 +362,7 @@ PageRepairFragmentation(Page page, OffsetNumber *unused)
363
362
364
363
for (i = 0 ,itemidptr = itemidbase ;i < nused ;i ++ ,itemidptr ++ )
365
364
{
366
- lp = (( PageHeader ) page ) -> pd_linp + itemidptr -> offsetindex ;
365
+ lp = PageGetItemId ( page , itemidptr -> offsetindex + 1 ) ;
367
366
upper -= itemidptr -> alignedlen ;
368
367
memmove ((char * )page + upper ,
369
368
(char * )page + itemidptr -> itemoff ,
@@ -426,7 +425,7 @@ PageIndexTupleDelete(Page page, OffsetNumber offnum)
426
425
/*
427
426
* As with PageRepairFragmentation, paranoia seems justified.
428
427
*/
429
- if (phdr -> pd_lower < ( sizeof ( PageHeaderData ) - sizeof ( ItemIdData )) ||
428
+ if (phdr -> pd_lower < SizeOfPageHeaderData ||
430
429
phdr -> pd_lower > phdr -> pd_upper ||
431
430
phdr -> pd_upper > phdr -> pd_special ||
432
431
phdr -> pd_special > BLCKSZ )
@@ -452,6 +451,8 @@ PageIndexTupleDelete(Page page, OffsetNumber offnum)
452
451
/*
453
452
* First, we want to get rid of the pd_linp entry for the index tuple.
454
453
* We copy all subsequent linp's back one slot in the array.
454
+ * We don't use PageGetItemId, because we are manipulating the _array_,
455
+ * not individual linp's.
455
456
*/
456
457
nbytes = phdr -> pd_lower -
457
458
((char * )& phdr -> pd_linp [offidx + 1 ]- (char * )phdr );
@@ -490,8 +491,8 @@ PageIndexTupleDelete(Page page, OffsetNumber offnum)
490
491
nline -- ;/* there's one less than when we started */
491
492
for (i = nline ;-- i >=0 ; )
492
493
{
493
- if (phdr -> pd_linp [ i ]. lp_off <=offset )
494
- phdr -> pd_linp [ i ]. lp_off += size ;
494
+ if (PageGetItemId ( phdr , i + 1 ) -> lp_off <=offset )
495
+ PageGetItemId ( phdr , i + 1 ) -> lp_off += size ;
495
496
}
496
497
}
497
498
}