tcl_db.h
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:8k
源码类别:

MySQL数据库

开发平台:

Visual C++

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