|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.1 (the "License"). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License.
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24:
25: /*
26: File: BTreesInternal.h
27:
28: Contains: IPI to File Manager B-tree
29:
30: Version: HFS Plus 1.0
31:
32: Copyright: � 1996-1998 by Apple Computer, Inc., all rights reserved.
33:
34: File Ownership:
35:
36: DRI: Don Brady
37:
38: Other Contact: Mark Day
39:
40: Technology: File Systems
41:
42: Writers:
43:
44: (msd) Mark Day
45: (DSH) Deric Horn
46: (djb) Don Brady
47:
48: Change History (most recent first):
49:
50: <RHAP> 6/22/98 djb Add ERR_BASE to btree error codes to make them negative (for Rhapsody only).
51:
52: <CS7> 7/28/97 msd Add enum for fsBTTimeOutErr.
53: <CS6> 7/25/97 DSH Added heuristicHint as parameter to BTSearchRecord.
54: <CS5> 7/24/97 djb Add blockReadFromDisk flag to BlockDescriptor. Callbacks now use
55: a file refNum instead of an FCB.
56: <CS4> 7/16/97 DSH FilesInternal.i renamed FileMgrInternal.i to avoid name
57: collision
58: <CS3> 6/2/97 DSH Added SetEndOfForkProc() prototype, so Attributes.c can call it
59: directly.
60: <CS2> 5/19/97 djb kMaxKeyLength is now 520.
61: <CS1> 4/28/97 djb first checked in
62:
63: <HFS6> 3/17/97 DSH Remove Key Comparison prototype, already in FilesInternal.h.
64: <HFS5> 2/19/97 djb Add SetBlockSizeProcPtr. Add blockSize field to BlockDescriptor.
65: Remove E_ type error enums.
66: <HFS4> 1/27/97 djb Include Types.h and FilesInternal.h.
67: <HFS3> 1/13/97 djb Added kBTreeCurrentRecord for BTIterateRecord.
68: <HFS2> 1/3/97 djb Added support for large keys.
69: <HFS1> 12/19/96 djb first checked in
70:
71: */
72:
73: #ifndef __BTREESINTERNAL__
74: #define __BTREESINTERNAL__
75:
76: #if TARGET_OS_MAC
77: #include <Types.h>
78: #else
79: #include "system/MacOSTypes.h"
80: #endif /* TARGET_OS_MAC */
81:
82: #include "FileMgrInternal.h"
83:
84: enum {
85: fsBTInvalidHeaderErr = btBadHdr,
86: fsBTBadRotateErr = dsBadRotate,
87: fsBTInvalidNodeErr = btBadNode,
88: fsBTRecordTooLargeErr = btNoFit,
89: fsBTRecordNotFoundErr = btNotFound,
90: fsBTDuplicateRecordErr = btExists,
91: fsBTFullErr = btNoSpaceAvail,
92:
93: fsBTInvalidFileErr = ERR_BASE + 0x0302, /* no BTreeCB has been allocated for fork*/
94: fsBTrFileAlreadyOpenErr = ERR_BASE + 0x0303,
95: fsBTInvalidIteratorErr = ERR_BASE + 0x0308,
96: fsBTEmptyErr = ERR_BASE + 0x030A,
97: fsBTNoMoreMapNodesErr = ERR_BASE + 0x030B,
98: fsBTBadNodeSize = ERR_BASE + 0x030C,
99: fsBTBadNodeType = ERR_BASE + 0x030D,
100: fsBTInvalidKeyLengthErr = ERR_BASE + 0x030E,
101: fsBTInvalidKeyDescriptor = ERR_BASE + 0x030F,
102: fsBTStartOfIterationErr = ERR_BASE + 0x0353,
103: fsBTEndOfIterationErr = ERR_BASE + 0x0354,
104: fsBTUnknownVersionErr = ERR_BASE + 0x0355,
105: fsBTTreeTooDeepErr = ERR_BASE + 0x0357,
106: fsBTInvalidKeyDescriptorErr = ERR_BASE + 0x0358,
107: fsBTInvalidKeyFieldErr = ERR_BASE + 0x035E,
108: fsBTInvalidKeyAttributeErr = ERR_BASE + 0x035F,
109: fsIteratorExitedScopeErr = ERR_BASE + 0x0A02, /* iterator exited the scope*/
110: fsIteratorScopeExceptionErr = ERR_BASE + 0x0A03, /* iterator is undefined due to error or movement of scope locality*/
111: fsUnknownIteratorMovementErr = ERR_BASE + 0x0A04, /* iterator movement is not defined*/
112: fsInvalidIterationMovmentErr = ERR_BASE + 0x0A05, /* iterator movement is invalid in current context*/
113: fsClientIDMismatchErr = ERR_BASE + 0x0A06, /* wrong client process ID*/
114: fsEndOfIterationErr = ERR_BASE + 0x0A07, /* there were no objects left to return on iteration*/
115: fsBTTimeOutErr = ERR_BASE + 0x0A08 /* BTree scan interrupted -- no time left for physical I/O */
116: };
117:
118: struct BlockDescriptor{
119: void *buffer;
120: void *blockHeader;
121: ByteCount blockSize;
122: Boolean blockReadFromDisk;
123: Byte reserved[3];
124: };
125: typedef struct BlockDescriptor BlockDescriptor;
126: typedef BlockDescriptor *BlockDescPtr;
127:
128:
129: struct FSBufferDescriptor {
130: LogicalAddress bufferAddress;
131: ByteCount itemSize;
132: ItemCount itemCount;
133: };
134: typedef struct FSBufferDescriptor FSBufferDescriptor;
135:
136: typedef FSBufferDescriptor *FSBufferDescriptorPtr;
137:
138:
139: /*
140: Fork Level Access Method Block get options
141: */
142: enum {
143: kGetBlock = 0x00000000,
144: kForceReadBlock = 0x00000002, //�� how does this relate to Read/Verify? Do we need this?
145: kGetEmptyBlock = 0x00000008
146: };
147: typedef OptionBits GetBlockOptions;
148:
149: /*
150: Fork Level Access Method Block release options
151: */
152: enum {
153: kReleaseBlock = 0x00000000,
154: kForceWriteBlock = 0x00000001,
155: kMarkBlockDirty = 0x00000002,
156: kTrashBlock = 0x00000004
157: };
158: typedef OptionBits ReleaseBlockOptions;
159:
160: typedef UInt32 FSSize;
161: typedef UInt32 ForkBlockNumber;
162:
163: /*============================================================================
164: Fork Level Buffered I/O Access Method
165: ============================================================================*/
166:
167: typedef OSStatus (* GetBlockProcPtr) (FileReference fileRefNum,
168: UInt32 blockNum,
169: GetBlockOptions options,
170: BlockDescriptor *block );
171:
172:
173: typedef OSStatus (* ReleaseBlockProcPtr) (FileReference fileRefNum,
174: BlockDescPtr blockPtr,
175: ReleaseBlockOptions options );
176:
177: typedef OSStatus (* SetEndOfForkProcPtr) (FileReference fileRefNum,
178: FSSize minEOF,
179: FSSize maxEOF );
180:
181: typedef OSStatus (* SetBlockSizeProcPtr) (FileReference fileRefNum,
182: ByteCount blockSize,
183: ItemCount minBlockCount );
184:
185: OSStatus SetEndOfForkProc ( FileReference fileRefNum, FSSize minEOF, FSSize maxEOF );
186:
187: /*
188: BTreeObjID is used to indicate an access path using the
189: BTree access method to a specific fork of a file. This value
190: is session relative and not persistent between invocations of
191: an application. It is in fact an object ID to which requests
192: for the given path should be sent.
193: */
194: typedef UInt32 BTreeObjID;
195:
196: /*
197: B*Tree Information Version
198: */
199:
200: enum BTreeInformationVersion{
201: kBTreeInfoVersion = 0
202: };
203:
204: /*
205: B*Tree Iteration Operation Constants
206: */
207:
208: enum BTreeIterationOperations{
209: kBTreeFirstRecord,
210: kBTreeNextRecord,
211: kBTreePrevRecord,
212: kBTreeLastRecord,
213: kBTreeCurrentRecord
214: };
215: typedef UInt16 BTreeIterationOperation;
216:
217: /*
218: B*Tree Key Descriptor Limits
219: */
220:
221: enum BTreeKeyLimits{
222: kMaxKeyDescriptorLength = 23,
223: kMaxKeyLength = 520
224: };
225:
226: /*
227: B*Tree Key Descriptor Field Types
228: */
229:
230: enum {
231: kBTreeSkip = 0,
232: kBTreeByte = 1,
233: kBTreeSignedByte = 2,
234: kBTreeWord = 4,
235: kBTreeSignedWord = 5,
236: kBTreeLong = 6,
237: kBTreeSignedLong = 7,
238: kBTreeString = 3, // Pascal string
239: kBTreeFixLenString = 8, // Pascal string w/ fixed length buffer
240: kBTreeReserved = 9, // reserved for Desktop Manager (?)
241: kBTreeUseKeyCmpProc = 10,
242: //�� not implemented yet...
243: kBTreeCString = 11,
244: kBTreeFixLenCString = 12,
245: kBTreeUniCodeString = 13,
246: kBTreeFixUniCodeString = 14
247: };
248: typedef UInt8 BTreeKeyType;
249:
250:
251: /*
252: B*Tree Key Descriptor String Field Attributes
253: */
254:
255: enum {
256: kBTreeCaseSens = 0x10, // case sensitive
257: kBTreeNotDiacSens = 0x20 // not diacritical sensitive
258: };
259: typedef UInt8 BTreeStringAttributes;
260:
261: /*
262: Btree types: 0 is HFS CAT/EXT file, 1~127 are AppleShare B*Tree files, 128~254 unused
263: hfsBtreeType EQU 0 ; control file
264: validBTType EQU $80 ; user btree type starts from 128
265: userBT1Type EQU $FF ; 255 is our Btree type. Used by BTInit and BTPatch
266: */
267:
268: enum BTreeTypes{
269: kHFSBTreeType = 0, // control file
270: kUserBTreeType = 128, // user btree type starts from 128
271: kReservedBTreeType = 255 //
272: };
273:
274: /*============================================================================
275: B*Tree Key Structures
276: ============================================================================*/
277:
278: #if PRAGMA_STRUCT_ALIGN
279: #pragma options align=mac68k
280: #elif PRAGMA_STRUCT_PACKPUSH
281: #pragma pack(push, 2)
282: #elif PRAGMA_STRUCT_PACK
283: #pragma pack(2)
284: #endif
285:
286: /*
287: BTreeKeyDescriptor is used to indicate how keys for a particular B*Tree
288: are to be compared.
289: */
290: typedef char BTreeKeyDescriptor[26];
291: typedef char *BTreeKeyDescriptorPtr;
292:
293: /*
294: BTreeInformation is used to describe the public information about a BTree
295: */
296: struct BTreeInformation{
297: UInt16 NodeSize;
298: UInt16 MaxKeyLength;
299: UInt16 Depth;
300: UInt16 Reserved;
301: ItemCount NumRecords;
302: ItemCount NumNodes;
303: ItemCount NumFreeNodes;
304: ByteCount ClumpSize;
305: BTreeKeyDescriptor KeyDescriptor;
306: };
307: typedef struct BTreeInformation BTreeInformation;
308: typedef BTreeInformation *BTreeInformationPtr;
309:
310: union BTreeKey{
311: UInt8 length8;
312: UInt16 length16;
313: UInt8 rawData [kMaxKeyLength+2];
314: };
315:
316: typedef union BTreeKey BTreeKey;
317: typedef BTreeKey *BTreeKeyPtr;
318:
319:
320: struct KeyDescriptor{
321: UInt8 length;
322: UInt8 fieldDesc [kMaxKeyDescriptorLength];
323: };
324: typedef struct KeyDescriptor KeyDescriptor;
325: typedef KeyDescriptor *KeyDescriptorPtr;
326:
327: struct NumberFieldDescriptor{
328: UInt8 fieldType;
329: UInt8 occurrence; // number of consecutive fields of this type
330: };
331: typedef struct NumberFieldDescriptor NumberFieldDescriptor;
332:
333: struct StringFieldDescriptor{
334: UInt8 fieldType; // kBTString
335: UInt8 occurrence; // number of consecutive fields of this type
336: UInt8 stringAttribute;
337: UInt8 filler;
338: };
339: typedef struct StringFieldDescriptor StringFieldDescriptor;
340:
341: struct FixedLengthStringFieldDescriptor{
342: UInt8 fieldType; // kBTFixLenString
343: UInt8 stringLength;
344: UInt8 occurrence;
345: UInt8 stringAttribute;
346: };
347: typedef struct FixedLengthStringFieldDescriptor FixedLengthStringFieldDescriptor;
348:
349: #if PRAGMA_STRUCT_ALIGN
350: #pragma options align=reset
351: #elif PRAGMA_STRUCT_PACKPUSH
352: #pragma pack(pop)
353: #elif PRAGMA_STRUCT_PACK
354: #pragma pack()
355: #endif
356:
357: /*
358: BTreeInfoRec Structure - for BTGetInformation
359: */
360: struct BTreeInfoRec{
361: UInt16 version;
362: UInt16 nodeSize;
363: UInt16 maxKeyLength;
364: UInt16 treeDepth;
365: ItemCount numRecords;
366: ItemCount numNodes;
367: ItemCount numFreeNodes;
368: KeyDescriptorPtr keyDescriptor;
369: ByteCount keyDescLength;
370: UInt32 reserved;
371: };
372: typedef struct BTreeInfoRec BTreeInfoRec;
373: typedef BTreeInfoRec *BTreeInfoPtr;
374:
375: /*
376: BTreeHint can never be exported to the outside. Use UInt32 BTreeHint[4],
377: UInt8 BTreeHint[16], etc.
378: */
379: struct BTreeHint{
380: ItemCount writeCount;
381: UInt32 nodeNum; // node the key was last seen in
382: UInt16 index; // index then key was last seen at
383: UInt16 reserved1;
384: UInt32 reserved2;
385: };
386: typedef struct BTreeHint BTreeHint;
387: typedef BTreeHint *BTreeHintPtr;
388:
389: /*
390: BTree Iterator
391: */
392: struct BTreeIterator{
393: BTreeHint hint;
394: UInt16 version;
395: UInt16 reserved;
396: BTreeKey key;
397: };
398: typedef struct BTreeIterator BTreeIterator;
399: typedef BTreeIterator *BTreeIteratorPtr;
400:
401:
402: /*============================================================================
403: B*Tree SPI
404: ============================================================================*/
405:
406: extern OSStatus InitBTreeModule (void);
407:
408:
409: extern OSStatus BTInitialize (FCB *filePtrPtr,
410: UInt16 maxKeyLength,
411: UInt16 nodeSize,
412: UInt8 btreeType,
413: KeyDescriptorPtr keyDescPtr );
414:
415: /*
416: Key Comparison Function ProcPtr Type - for BTOpenPath
417: */
418: //typedef SInt32 (* KeyCompareProcPtr)(BTreeKeyPtr a, BTreeKeyPtr b);
419:
420: extern OSStatus BTOpenPath (FCB *filePtr,
421: KeyCompareProcPtr keyCompareProc,
422: GetBlockProcPtr getBlockProc,
423: ReleaseBlockProcPtr releaseBlockProc,
424: SetEndOfForkProcPtr setEndOfForkProc,
425: SetBlockSizeProcPtr setBlockSizeProc );
426:
427: extern OSStatus BTClosePath (FCB *filePtr );
428:
429:
430: extern OSStatus BTSearchRecord (FCB *filePtr,
431: BTreeIterator *searchIterator,
432: UInt32 heuristicHint,
433: FSBufferDescriptor *btRecord,
434: UInt16 *recordLen,
435: BTreeIterator *resultIterator );
436:
437: extern OSStatus BTIterateRecord (FCB *filePtr,
438: BTreeIterationOperation operation,
439: BTreeIterator *iterator,
440: FSBufferDescriptor *btRecord,
441: UInt16 *recordLen );
442:
443: extern OSStatus BTInsertRecord (FCB *filePtr,
444: BTreeIterator *iterator,
445: FSBufferDescriptor *btrecord,
446: UInt16 recordLen );
447:
448: extern OSStatus BTReplaceRecord (FCB *filePtr,
449: BTreeIterator *iterator,
450: FSBufferDescriptor *btRecord,
451: UInt16 recordLen );
452:
453: extern OSStatus BTSetRecord (FCB *filePtr,
454: BTreeIterator *iterator,
455: FSBufferDescriptor *btRecord,
456: UInt16 recordLen );
457:
458: extern OSStatus BTDeleteRecord (FCB *filePtr,
459: BTreeIterator *iterator );
460:
461: extern OSStatus BTGetInformation (FCB *filePtr,
462: UInt16 version,
463: BTreeInfoRec *info );
464:
465: extern OSStatus BTFlushPath (FCB *filePtr );
466:
467: extern OSStatus BTInvalidateHint (BTreeIterator *iterator );
468:
469: #endif // __BTREESINTERNAL__
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.