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

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1999, 2000
  5.  * Sleepycat Software.  All rights reserved.
  6.  *
  7.  * $Id: tcl_db.h,v 11.9 2000/12/12 17:43:56 bostic Exp $
  8.  */
  9. #define MSG_SIZE 100 /* Message size */
  10. enum INFOTYPE {
  11.     I_ENV, I_DB, I_DBC, I_TXN, I_MP, I_PG, I_LOCK, I_NDBM, I_MUTEX };
  12. #define MAX_ID 8 /* Maximum number of sub-id's we need */
  13. #define DBTCL_DBM 1
  14. #define DBTCL_NDBM 2
  15. typedef struct _mutex_entry {
  16. union {
  17. struct {
  18. MUTEX real_m;
  19. u_int32_t real_val;
  20. } r;
  21. /*
  22.  * This is here to make sure that each of the mutex structures
  23.  * are 16-byte aligned, which is required on HP architectures.
  24.  * The db_mutex_t structure might be >32 bytes itself, or the
  25.  * real_val might push it over the 32 byte boundary.  The best
  26.  * we can do is use a 48 byte boundary.
  27.  */
  28. char c[48];
  29. } u;
  30. } _MUTEX_ENTRY;
  31. #define m u.r.real_m
  32. #define val u.r.real_val
  33. typedef struct _mutex_data {
  34. DB_ENV *env;
  35. REGINFO  reginfo;
  36. _MUTEX_ENTRY *marray;
  37. size_t  size;
  38. u_int32_t  n_mutex;
  39. } _MUTEX_DATA;
  40. /*
  41.  * Why use a home grown package over the Tcl_Hash functions?
  42.  *
  43.  * We could have implemented the stuff below without maintaining our
  44.  * own list manipulation, efficiently hashing it with the available
  45.  * Tcl functions (Tcl_CreateHashEntry, Tcl_GetHashValue, etc).  I chose
  46.  * not to do so for these reasons:
  47.  *
  48.  * We still need the information below.  Using the hashing only removes
  49.  * us from needing the next/prev pointers.  We still need the structure
  50.  * itself because we need more than one value associated with a widget.
  51.  * We need to keep track of parent pointers for sub-widgets (like cursors)
  52.  * so we can correctly close.  We need to keep track of individual widget's
  53.  * id counters for any sub-widgets they may have.  We need to be able to
  54.  * associate the name/client data outside the scope of the widget.
  55.  *
  56.  * So, is it better to use the hashing rather than
  57.  * the linear list we have now?  I decided against it for the simple reason
  58.  * that to access the structure would require two calls.  The first is
  59.  * Tcl_FindHashEntry(table, key) and then, once we have the entry, we'd
  60.  * have to do Tcl_GetHashValue(entry) to get the pointer of the structure.
  61.  *
  62.  * I believe the number of simultaneous DB widgets in existence at one time
  63.  * is not going to be that large (more than several dozen) such that
  64.  * linearly searching the list is not going to impact performance in a
  65.  * noticable way.  Should performance be impacted due to the size of the
  66.  * info list, then perhaps it is time to revisit this decision.
  67.  */
  68. typedef struct dbtcl_info {
  69. LIST_ENTRY(dbtcl_info) entries;
  70. Tcl_Interp *i_interp;
  71. char *i_name;
  72. enum INFOTYPE i_type;
  73. union infop {
  74. DB_ENV *envp;
  75. void *anyp;
  76. DB *dbp;
  77. DBC *dbcp;
  78. DB_TXN *txnp;
  79. DB_MPOOLFILE *mp;
  80. DB_LOCK *lock;
  81. _MUTEX_DATA *mutex;
  82. #if 0
  83. DBM *ndbmp; /* Compatibility */
  84. #endif
  85. } un;
  86. union data {
  87. int anydata;
  88. db_pgno_t pgno;
  89. u_int32_t lockid;
  90. } und;
  91. union data2 {
  92. int anydata;
  93. size_t pagesz;
  94. } und2;
  95. DBT i_lockobj;
  96. FILE *i_err;
  97. char *i_errpfx;
  98. struct dbtcl_info *i_parent;
  99. int i_otherid[MAX_ID];
  100. } DBTCL_INFO;
  101. extern int __debug_on, __debug_print, __debug_stop, __debug_test;
  102. LIST_HEAD(infohead, dbtcl_info) __db_infohead;
  103. #define i_anyp un.anyp
  104. #define i_pagep un.anyp
  105. #define i_envp un.envp
  106. #define i_dbp un.dbp
  107. #define i_dbcp un.dbcp
  108. #define i_txnp un.txnp
  109. #define i_mp un.mp
  110. #define i_lock un.lock
  111. #define i_mutex un.mutex
  112. #if 0
  113. #define i_ndbm un.ndbmp
  114. #endif
  115. #define i_data und.anydata
  116. #define i_pgno und.pgno
  117. #define i_locker und.lockid
  118. #define i_data2 und2.anydata
  119. #define i_pgsz und2.pagesz
  120. #define i_envtxnid i_otherid[0]
  121. #define i_envmpid i_otherid[1]
  122. #define i_envlockid i_otherid[2]
  123. #define i_envmutexid i_otherid[3]
  124. #define i_mppgid  i_otherid[0]
  125. #define i_dbdbcid i_otherid[0]
  126. #define NAME_TO_ENV(name) (DB_ENV *)_NameToPtr((name))
  127. #define NAME_TO_DB(name) (DB *)_NameToPtr((name))
  128. #define NAME_TO_DBC(name) (DBC *)_NameToPtr((name))
  129. #define NAME_TO_TXN(name) (DB_TXN *)_NameToPtr((name))
  130. #define NAME_TO_MP(name) (DB_MPOOLFILE *)_NameToPtr((name))
  131. #define NAME_TO_LOCK(name) (DB_LOCK *)_NameToPtr((name))
  132. /*
  133.  * MAKE_STAT_LIST appends a {name value} pair to a result list
  134.  * that MUST be called 'res' that is a Tcl_Obj * in the local
  135.  * function.  This macro also assumes a label "error" to go to
  136.  * in the even of a Tcl error.  For stat functions this will
  137.  * typically go before the "free" function to free the stat structure
  138.  * returned by DB.
  139.  */
  140. #define MAKE_STAT_LIST(s,v)
  141. do {
  142. result = _SetListElemInt(interp, res, (s), (v));
  143. if (result != TCL_OK)
  144. goto error;
  145. } while (0)
  146. /*
  147.  * MAKE_STAT_STRLIST appends a {name string} pair to a result list
  148.  * that MUST be called 'res' that is a Tcl_Obj * in the local
  149.  * function.  This macro also assumes a label "error" to go to
  150.  * in the even of a Tcl error.  For stat functions this will
  151.  * typically go before the "free" function to free the stat structure
  152.  * returned by DB.
  153.  */
  154. #define MAKE_STAT_STRLIST(s,s1)
  155. do {
  156. result = _SetListElem(interp, res, (s), strlen(s),      
  157.     (s1), strlen(s1));
  158. if (result != TCL_OK)
  159. goto error;
  160. } while (0)
  161. /*
  162.  * FLAG_CHECK checks that the given flag is not set yet.
  163.  * If it is, it sets up an error message.
  164.  */
  165. #define FLAG_CHECK(flag)
  166. do {
  167. if ((flag) != 0) {
  168. Tcl_SetResult(interp,
  169.     " Only 1 policy can be specified.n",
  170.     TCL_STATIC);
  171. result = TCL_ERROR;
  172. break;
  173. }
  174. } while (0)
  175. /*
  176.  * FLAG_CHECK2 checks that the given flag is not set yet or is
  177.  * only set to the given allowed value.
  178.  * If it is, it sets up an error message.
  179.  */
  180. #define FLAG_CHECK2(flag,val)
  181. do {
  182. if ((flag) != 0 && (flag) != (val)) {
  183. Tcl_SetResult(interp,
  184.     " Only 1 policy can be specified.n",
  185.     TCL_STATIC);
  186. result = TCL_ERROR;
  187. break;
  188. }
  189. } while (0)
  190. /*
  191.  * IS_HELP checks whether the arg we bombed on is -?, which is a help option.
  192.  * If it is, we return TCL_OK (but leave the result set to whatever
  193.  * Tcl_GetIndexFromObj says, which lists all the valid options.  Otherwise
  194.  * return TCL_ERROR.
  195.  */
  196. #define IS_HELP(s)
  197.     (strcmp(Tcl_GetStringFromObj(s,NULL), "-?") == 0) ? TCL_OK : TCL_ERROR
  198. #include "tcl_ext.h"