hash.src
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:11k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1996, 1997, 1998, 1999, 2000
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. /*
  8.  * Copyright (c) 1995, 1996
  9.  * Margo Seltzer.  All rights reserved.
  10.  */
  11. /*
  12.  * Copyright (c) 1995, 1996
  13.  * The President and Fellows of Harvard University.  All rights reserved.
  14.  *
  15.  * This code is derived from software contributed to Berkeley by
  16.  * Margo Seltzer.
  17.  *
  18.  * Redistribution and use in source and binary forms, with or without
  19.  * modification, are permitted provided that the following conditions
  20.  * are met:
  21.  * 1. Redistributions of source code must retain the above copyright
  22.  *    notice, this list of conditions and the following disclaimer.
  23.  * 2. Redistributions in binary form must reproduce the above copyright
  24.  *    notice, this list of conditions and the following disclaimer in the
  25.  *    documentation and/or other materials provided with the distribution.
  26.  * 3. Neither the name of the University nor the names of its contributors
  27.  *    may be used to endorse or promote products derived from this software
  28.  *    without specific prior written permission.
  29.  *
  30.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  31.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  32.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  33.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  34.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  35.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  36.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  37.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  38.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  39.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  40.  * SUCH DAMAGE.
  41.  *
  42.  * $Id: hash.src,v 10.24 2000/12/12 17:41:48 bostic Exp $
  43.  */
  44. /*
  45.  * This is the source file used to create the logging functions for the
  46.  * hash package.  Each access method (or set of routines wishing to register
  47.  * record types with the transaction system) should have a file like this.
  48.  * Each type of log record and its parameters is defined.  The basic
  49.  * format of a record definition is:
  50.  *
  51.  * BEGIN <RECORD_TYPE>
  52.  * ARG|STRING|POINTER <variable name> <variable type> <printf format>
  53.  * ...
  54.  * END
  55.  * ARG the argument is a simple parameter of the type * specified.
  56.  * DBT the argument is a DBT (db.h) containing a length and pointer.
  57.  * PTR the argument is a pointer to the data type specified; the entire
  58.  *     type should be logged.
  59.  *
  60.  * There are a set of shell scripts of the form xxx.sh that generate c
  61.  * code and or h files to process these.  (This is probably better done
  62.  * in a single PERL script, but for now, this works.)
  63.  *
  64.  * The DB recovery system requires the following three fields appear in
  65.  * every record, and will assign them to the per-record-type structures
  66.  * as well as making them the first parameters to the appropriate logging
  67.  * call.
  68.  * rectype: record-type, identifies the structure and log/read call
  69.  * txnid: transaction id, a DBT in this implementation
  70.  * prev: the last LSN for this transaction
  71.  */
  72. /*
  73.  * Use the argument of PREFIX as the prefix for all record types,
  74.  * routines, id numbers, etc.
  75.  */
  76. PREFIX ham
  77. INCLUDE #include "db_config.h"
  78. INCLUDE
  79. INCLUDE #ifndef NO_SYSTEM_INCLUDES
  80. INCLUDE #include <sys/types.h>
  81. INCLUDE
  82. INCLUDE #include <ctype.h>
  83. INCLUDE #include <errno.h>
  84. INCLUDE #include <string.h>
  85. INCLUDE #endif
  86. INCLUDE
  87. INCLUDE #include "db_int.h"
  88. INCLUDE #include "db_page.h"
  89. INCLUDE #include "db_dispatch.h"
  90. INCLUDE #include "db_am.h"
  91. INCLUDE #include "hash.h"
  92. INCLUDE #include "txn.h"
  93. INCLUDE
  94. /*
  95.  * HASH-insdel: used for hash to insert/delete a pair of entries onto a master
  96.  * page. The pair might be regular key/data pairs or they might be the
  97.  * structures that refer to off page items, duplicates or offpage duplicates.
  98.  *  opcode - PUTPAIR/DELPAIR + big masks
  99.  *  fileid - identifies the file referenced
  100.  *  pgno - page within file
  101.  *  ndx - index on the page of the item being added (item index)
  102.  *  pagelsn - lsn on the page before the update
  103.  *  key - the key being inserted
  104.  *  data - the data being inserted
  105.  */
  106. BEGIN insdel 21
  107. ARG opcode u_int32_t lu
  108. ARG fileid int32_t ld
  109. ARG pgno db_pgno_t lu
  110. ARG ndx u_int32_t lu
  111. POINTER pagelsn DB_LSN * lu
  112. DBT key DBT s
  113. DBT data DBT s
  114. END
  115. /*
  116.  * Used to add and remove overflow pages.
  117.  * prev_pgno is the previous page that is going to get modified to
  118.  * point to this one.  If this is the first page in a chain
  119.  * then prev_pgno should be PGNO_INVALID.
  120.  * new_pgno is the page being allocated.
  121.  * next_pgno is the page that follows this one.  On allocation,
  122.  * this should be PGNO_INVALID.  For deletes, it may exist.
  123.  * pagelsn is the old lsn on the page.
  124.  */
  125. BEGIN newpage 22
  126. ARG opcode u_int32_t lu
  127. ARG fileid int32_t ld
  128. ARG prev_pgno db_pgno_t lu
  129. POINTER prevlsn DB_LSN * lu
  130. ARG new_pgno db_pgno_t lu
  131. POINTER pagelsn DB_LSN * lu
  132. ARG next_pgno db_pgno_t lu
  133. POINTER nextlsn DB_LSN * lu
  134. END
  135. /*
  136.  * DEPRECATED in 3.0.
  137.  * Superceded by metagroup which allocates a group of new pages.
  138.  *
  139.  * Splitting requires two types of log messages.  The first logs the
  140.  * meta-data of the split.
  141.  *
  142.  * For the meta-data split
  143.  * bucket: max_bucket in table before split
  144.  * ovflpoint: overflow point before split.
  145.  * spares: spares[ovflpoint] before split.
  146.  */
  147. DEPRECATED splitmeta 23
  148. ARG fileid int32_t ld
  149. ARG bucket u_int32_t lu
  150. ARG ovflpoint u_int32_t lu
  151. ARG spares u_int32_t lu
  152. POINTER metalsn DB_LSN * lu
  153. END
  154. /*
  155.  * Splitting requires two types of log messages.  The second logs the
  156.  * data on the original page.  To redo the split, we have to visit the
  157.  * new page (pages) and add the items back on the page if they are not
  158.  * yet there.
  159.  */
  160. BEGIN splitdata 24
  161. ARG fileid int32_t ld
  162. ARG opcode u_int32_t lu
  163. ARG pgno db_pgno_t lu
  164. DBT pageimage DBT s
  165. POINTER pagelsn DB_LSN * lu
  166. END
  167. /*
  168.  * HASH-replace: is used for hash to handle partial puts that only
  169.  * affect a single master page.
  170.  *  fileid - identifies the file referenced
  171.  *  pgno - page within file
  172.  *  ndx - index on the page of the item being modified (item index)
  173.  *  pagelsn - lsn on the page before the update
  174.  *  off - offset in the old item where the new item is going.
  175.  *  olditem - DBT that describes the part of the item being replaced.
  176.  *  newitem - DBT of the new item.
  177.  *  makedup - this was a replacement that made an item a duplicate.
  178.  */
  179. BEGIN replace 25
  180. ARG fileid int32_t ld
  181. ARG pgno db_pgno_t lu
  182. ARG ndx u_int32_t lu
  183. POINTER pagelsn DB_LSN * lu
  184. ARG off int32_t ld
  185. DBT olditem DBT s
  186. DBT newitem DBT s
  187. ARG makedup u_int32_t lu
  188. END
  189. /*
  190.  * DEPRECATED in 3.0.
  191.  * Hash now uses the btree allocation and deletion page routines.
  192.  *
  193.  * HASH-newpgno: is used to record getting/deleting a new page number.
  194.  * This doesn't require much data modification, just modifying the
  195.  * meta-data.
  196.  * pgno is the page being allocated/freed.
  197.  * free_pgno is the next_pgno on the free list.
  198.  * old_type was the type of a page being deallocated.
  199.  * old_pgno was the next page number before the deallocation.
  200.  */
  201. DEPRECATED newpgno 26
  202. ARG opcode u_int32_t lu
  203. ARG fileid int32_t ld
  204. ARG pgno db_pgno_t lu
  205. ARG free_pgno db_pgno_t lu
  206. ARG old_type u_int32_t lu
  207. ARG old_pgno db_pgno_t lu
  208. ARG new_type u_int32_t lu
  209. POINTER pagelsn DB_LSN * lu
  210. POINTER metalsn DB_LSN * lu
  211. END
  212. /*
  213.  * DEPRECATED in 3.0.
  214.  * Since we now pre-allocate the contiguous chunk of pages for a doubling,
  215.  * there is no big benefit to pre-allocating a few extra pages.  It used
  216.  * to be that the file was only physically as large as the current bucket,
  217.  * so if you were on a doubling of 16K, but were only on the first bucket
  218.  * of that 16K, the file was much shorter than it would be at the end of
  219.  * the doubling, so we didn't want to force overflow pages at the end of the
  220.  * 16K pages.  Since we now must allocate the 16K pages (because of sub
  221.  * databases), it's not a big deal to tack extra pages on at the end.
  222.  *
  223.  * ovfl: initialize a set of overflow pages.
  224.  */
  225. DEPRECATED ovfl 27
  226. ARG fileid int32_t ld
  227. ARG start_pgno db_pgno_t lu
  228. ARG npages u_int32_t lu
  229. ARG free_pgno db_pgno_t lu
  230. ARG ovflpoint u_int32_t lu
  231. POINTER metalsn DB_LSN * lu
  232. END
  233. /*
  234.  * Used when we empty the first page in a bucket and there are pages after
  235.  * it.  The page after it gets copied into the bucket page (since bucket
  236.  * pages have to be in fixed locations).
  237.  * pgno: the bucket page
  238.  * pagelsn: the old LSN on the bucket page
  239.  * next_pgno: the page number of the next page
  240.  * nnext_pgno: page after next_pgno (may need to change its prev)
  241.  * nnextlsn: the LSN of nnext_pgno.
  242.  */
  243. BEGIN copypage 28
  244. ARG fileid int32_t ld
  245. ARG pgno db_pgno_t lu
  246. POINTER pagelsn DB_LSN * lu
  247. ARG next_pgno db_pgno_t lu
  248. POINTER nextlsn DB_LSN * lu
  249. ARG nnext_pgno db_pgno_t lu
  250. POINTER nnextlsn DB_LSN * lu
  251. DBT page DBT s
  252. END
  253. /*
  254.  * This replaces the old splitmeta operation.  It behaves largely the same
  255.  * way, but it has enough information so that we can record a group allocation
  256.  * which we do now because of sub databases.  The number of pages allocated is
  257.  * always bucket + 1 pgno is the page number of the first newly allocated
  258.  * bucket.
  259.  * bucket: Old maximum bucket number.
  260.  * pgno: Page allocated to bucket + 1 (first newly allocated page)
  261.  * metalsn: Lsn of the meta-data page.
  262.  * pagelsn: Lsn of the maximum page allocated.
  263.  */
  264. BEGIN metagroup 29
  265. ARG fileid int32_t ld
  266. ARG bucket u_int32_t lu
  267. ARG pgno db_pgno_t lu
  268. POINTER metalsn DB_LSN * lu
  269. POINTER pagelsn DB_LSN * lu
  270. END
  271. /*
  272.  * groupalloc
  273.  *
  274.  * This is used in conjunction with MPOOL_NEW_GROUP when we are creating
  275.  * a new database to make sure that we recreate or reclaim free pages
  276.  * when we allocate a chunk of contiguous ones during database creation.
  277.  *
  278.  * pgno: meta-data page number
  279.  * metalsn: meta-data lsn
  280.  * start_pgno: starting page number
  281.  * num: number of allocated pages
  282.  */
  283. DEPRECATED groupalloc1 30
  284. ARG fileid int32_t ld
  285. ARG pgno db_pgno_t lu
  286. POINTER metalsn DB_LSN * lu
  287. POINTER mmetalsn DB_LSN * lu
  288. ARG start_pgno db_pgno_t lu
  289. ARG num u_int32_t lu
  290. END
  291. DEPRECATED groupalloc2 31
  292. ARG fileid int32_t ld
  293. POINTER meta_lsn DB_LSN * lu
  294. POINTER alloc_lsn DB_LSN * lu
  295. ARG start_pgno db_pgno_t lu
  296. ARG num u_int32_t lu
  297. ARG free db_pgno_t lu
  298. END
  299. BEGIN groupalloc 32
  300. ARG fileid int32_t ld
  301. POINTER meta_lsn DB_LSN * lu
  302. ARG start_pgno db_pgno_t lu
  303. ARG num u_int32_t lu
  304. ARG free db_pgno_t lu
  305. END
  306. /*
  307.  * Records for backing out cursor adjustment.
  308.  *   curadj - added or deleted a record or a dup
  309.  * within a record.
  310.  * pgno - page that was effected
  311.  * indx - indx of recrod effected.
  312.  * len - if a dup its length.
  313.  * dup_off - if a dup its offset
  314.  * add - 1 if add 0 if delete
  315.  * is_dup  - 1 if dup 0 otherwise.
  316.  * order - order assinged to this deleted record or dup.
  317.  *
  318.  *   chgpg - rmoved a page, move the records to a new page
  319.  * mode - CHGPG page was deleted or records move to new page.
  320.  * - SPLIT we split a bucket
  321.  * - DUP we convered to off page duplicates.
  322.  * old_pgno, new_pgno - old and new page numbers.
  323.  * old_index, new_index - old and new index numbers, NDX_INVALID if
  324.  * it effects all records on the page.
  325.  */
  326. BEGIN curadj 33
  327. ARG fileid int32_t ld
  328. ARG pgno db_pgno_t lu
  329. ARG indx u_int32_t lu
  330. ARG len u_int32_t lu
  331. ARG dup_off u_int32_t lu
  332. ARG add int ld
  333. ARG is_dup int ld
  334. ARG order u_int32_t lu
  335. END
  336. BEGIN chgpg 34
  337. ARG fileid int32_t ld
  338. ARG mode db_ham_mode ld
  339. ARG old_pgno db_pgno_t lu
  340. ARG new_pgno db_pgno_t lu
  341. ARG old_indx u_int32_t lu
  342. ARG new_indx u_int32_t lu
  343. END