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

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. Data dictionary memory object creation
  3. (c) 1996 Innobase Oy
  4. Created 1/8/1996 Heikki Tuuri
  5. *******************************************************/
  6. #ifndef dict0mem_h
  7. #define dict0mem_h
  8. #include "univ.i"
  9. #include "dict0types.h"
  10. #include "data0type.h"
  11. #include "data0data.h"
  12. #include "mem0mem.h"
  13. #include "rem0types.h"
  14. #include "btr0types.h"
  15. #include "ut0mem.h"
  16. #include "ut0lst.h"
  17. #include "ut0rnd.h"
  18. #include "ut0byte.h"
  19. #include "sync0rw.h"
  20. #include "lock0types.h"
  21. #include "hash0hash.h"
  22. #include "que0types.h"
  23. /* Type flags of an index: OR'ing of the flags is allowed to define a
  24. combination of types */
  25. #define DICT_CLUSTERED 1 /* clustered index */
  26. #define DICT_UNIQUE 2 /* unique index */
  27. #define DICT_UNIVERSAL  4 /* index which can contain records from any
  28. other index */
  29. #define DICT_IBUF  8 /* insert buffer tree */
  30. /* Flags for ordering an index field: OR'ing of the flags allowed */
  31. #define DICT_DESCEND 1 /* in descending order (default ascending) */
  32. /* Types for a table object */
  33. #define DICT_TABLE_ORDINARY 1
  34. #define DICT_TABLE_CLUSTER_MEMBER 2
  35. #define DICT_TABLE_CLUSTER 3 /* this means that the table is
  36.   really a cluster definition */
  37. /**************************************************************************
  38. Creates a table memory object. */
  39. dict_table_t*
  40. dict_mem_table_create(
  41. /*==================*/
  42. /* out, own: table object */
  43. char* name, /* in: table name */
  44. ulint space, /* in: space where the clustered index of
  45. the table is placed; this parameter is
  46. ignored if the table is made a member of
  47. a cluster */
  48. ulint n_cols); /* in: number of columns */
  49. /**************************************************************************
  50. Creates a cluster memory object. */
  51. dict_cluster_t*
  52. dict_mem_cluster_create(
  53. /*====================*/
  54. /* out, own: cluster object (where the type
  55. dict_cluster_t == dict_table_t) */
  56. char* name, /* in: cluster name */
  57. ulint space, /* in: space where the clustered indexes
  58. of the member tables are placed */
  59. ulint n_cols, /* in: number of columns */
  60. ulint mix_len); /* in: length of the common key prefix in the
  61. cluster */
  62. /**************************************************************************
  63. Declares a non-published table as a member in a cluster. */
  64. void
  65. dict_mem_table_make_cluster_member(
  66. /*===============================*/
  67. dict_table_t* table, /* in: non-published table */
  68. char* cluster_name); /* in: cluster name */
  69. /**************************************************************************
  70. Adds a column definition to a table. */
  71. void
  72. dict_mem_table_add_col(
  73. /*===================*/
  74. dict_table_t* table, /* in: table */
  75. char* name, /* in: column name */
  76. ulint mtype, /* in: main datatype */
  77. ulint prtype, /* in: precise type */
  78. ulint len, /* in: length */
  79. ulint prec); /* in: precision */
  80. /**************************************************************************
  81. Creates an index memory object. */
  82. dict_index_t*
  83. dict_mem_index_create(
  84. /*==================*/
  85. /* out, own: index object */
  86. char* table_name, /* in: table name */
  87. char* index_name, /* in: index name */
  88. ulint space, /* in: space where the index tree is placed,
  89. ignored if the index is of the clustered
  90. type */
  91. ulint type, /* in: DICT_UNIQUE, DICT_CLUSTERED, ... ORed */
  92. ulint n_fields); /* in: number of fields */
  93. /**************************************************************************
  94. Adds a field definition to an index. NOTE: does not take a copy
  95. of the column name if the field is a column. The memory occupied
  96. by the column name may be released only after publishing the index. */
  97. void
  98. dict_mem_index_add_field(
  99. /*=====================*/
  100. dict_index_t* index, /* in: index */
  101. char* name, /* in: column name */
  102. ulint order); /* in: order criterion; 0 means an ascending
  103. order */
  104. /**************************************************************************
  105. Frees an index memory object. */
  106. void
  107. dict_mem_index_free(
  108. /*================*/
  109. dict_index_t* index); /* in: index */
  110. /**************************************************************************
  111. Creates a procedure memory object. */
  112. dict_proc_t*
  113. dict_mem_procedure_create(
  114. /*======================*/
  115. /* out, own: procedure object */
  116. char* name, /* in: procedure name */
  117. char* sql_string, /* in: procedure definition as an SQL
  118. string */
  119. que_fork_t* graph); /* in: parsed procedure graph */
  120. /* Data structure for a column in a table */
  121. struct dict_col_struct{
  122. hash_node_t hash; /* hash chain node */
  123. ulint ind; /* table column position (they are numbered
  124. starting from 0) */
  125. ulint clust_pos;/* position of the column in the
  126. clustered index */
  127. ulint ord_part;/* count of how many times this column
  128. appears in an ordering fields of an index */
  129. char* name; /* name */
  130. dtype_t type; /* data type */
  131. dict_table_t* table; /* back pointer to table of this column */
  132. ulint aux; /* this is used as an auxiliary variable 
  133. in some of the functions below */
  134. };
  135. /* Data structure for a field in an index */
  136. struct dict_field_struct{
  137. dict_col_t* col; /* pointer to the table column */
  138. char* name; /* name of the column */
  139. ulint order; /* flags for ordering this field:
  140. DICT_DESCEND, ... */
  141. };
  142. /* Data structure for an index tree */
  143. struct dict_tree_struct{
  144. ulint type; /* tree type */
  145. dulint id; /* id of the index stored in the tree, in the
  146. case of a mixed index, the id of the clustered
  147. index of the cluster table */
  148. ulint space; /* space of index tree */
  149. ulint page; /* index tree root page number */
  150. byte pad[64];/* Padding to prevent other memory hotspots on
  151. the same memory cache line */
  152. rw_lock_t lock; /* read-write lock protecting the upper levels
  153. of the index tree */
  154. ulint mem_fix;/* count of how many times this tree
  155. struct has been memoryfixed (by mini-
  156. transactions wanting to access the index
  157. tree) */
  158. UT_LIST_BASE_NODE_T(dict_index_t)
  159. tree_indexes; /* list of indexes stored in the
  160. index tree: if the tree is not of the
  161. mixed type there is only one index in
  162. the list; if the tree is of the mixed
  163. type, the first index in the list is the
  164. index of the cluster which owns the tree */
  165. ulint magic_n;/* magic number */
  166. };
  167. #define DICT_TREE_MAGIC_N 7545676
  168. /* Data structure for an index */
  169. struct dict_index_struct{
  170. dulint id; /* id of the index */
  171. mem_heap_t* heap; /* memory heap */
  172. ulint type; /* index type */
  173. char* name; /* index name */
  174. char* table_name; /* table name */
  175. dict_table_t* table; /* back pointer to table */
  176. ulint space; /* space where the index tree is placed */
  177. ulint page_no;/* page number of the index tree root */
  178. ulint trx_id_offset;/* position of the the trx id column
  179. in a clustered index record, if the fields
  180. before it are known to be of a fixed size,
  181. 0 otherwise */
  182. ulint n_user_defined_cols;
  183. /* number of columns the user defined to
  184. be in the index: in the internal
  185. representation we add more columns */
  186. ulint n_uniq; /* number of fields from the beginning
  187. which are enough to determine an index
  188. entry uniquely */
  189. ulint n_def; /* number of fields defined so far */
  190. ulint n_fields;/* number of fields in the index */
  191. dict_field_t* fields; /* array of field descriptions */
  192. UT_LIST_NODE_T(dict_index_t)
  193. indexes;/* list of indexes of the table */
  194. dict_tree_t* tree; /* index tree struct */
  195. UT_LIST_NODE_T(dict_index_t)
  196. tree_indexes; /* list of indexes of the same index
  197. tree */
  198. ibool cached; /* TRUE if the index object is in the
  199. dictionary cache */
  200. btr_search_t* search_info; /* info used in optimistic searches */
  201. /*----------------------*/
  202. ulint stat_n_diff_key_vals;
  203. /* approximate number of different key values
  204. for this index; we periodically calculate
  205. new estimates */
  206. ulint stat_index_size;
  207. /* approximate index size in database pages */
  208. ulint magic_n;/* magic number */
  209. };
  210. #define DICT_INDEX_MAGIC_N 76789786
  211. /* Data structure for a database table */
  212. struct dict_table_struct{
  213. dulint id; /* id of the table or cluster */
  214. ulint type; /* DICT_TABLE_ORDINARY, ... */
  215. mem_heap_t* heap; /* memory heap */
  216. char* name; /* table name */
  217. ulint space; /* space where the clustered index of the
  218. table is placed */
  219. hash_node_t name_hash; /* hash chain node */
  220. hash_node_t id_hash; /* hash chain node */
  221. ulint n_def; /* number of columns defined so far */
  222. ulint n_cols; /* number of columns */
  223. dict_col_t* cols; /* array of column descriptions */
  224. UT_LIST_BASE_NODE_T(dict_index_t)
  225. indexes; /* list of indexes of the table */
  226. UT_LIST_NODE_T(dict_table_t)
  227. table_LRU; /* node of the LRU list of tables */
  228. ulint mem_fix;/* count of how many times the table 
  229. and its indexes has been fixed in memory;
  230. currently NOT used */
  231. ibool cached; /* TRUE if the table object has been added
  232. to the dictionary cache */
  233. UT_LIST_BASE_NODE_T(lock_t)
  234. locks; /* list of locks on the table */
  235. /*----------------------*/
  236. dulint mix_id; /* if the table is a member in a cluster,
  237. this is its mix id */
  238. ulint mix_len;/* if the table is a cluster or a member
  239. this is the common key prefix lenght */
  240. ulint mix_id_len;/* mix id length in a compressed form */
  241. byte mix_id_buf[12];
  242. /* mix id of a mixed table written in
  243. a compressed form */
  244. char* cluster_name; /* if the table is a member in a
  245. cluster, this is the name of the cluster */
  246. /*----------------------*/
  247. ibool does_not_fit_in_memory;
  248. /* this field is used to specify in simulations
  249. tables which are so big that disk should be
  250. accessed: disk access is simulated by
  251. putting the thread to sleep for a while;
  252. NOTE that this flag is not stored to the data
  253. dictionary on disk, and the database will
  254. forget about value TRUE if it has to reload
  255. the table definition from disk */
  256. /*----------------------*/
  257. ulint stat_n_rows;
  258. /* approximate number of rows in the table;
  259. we periodically calculate new estimates */
  260. ulint stat_clustered_index_size;
  261. /* approximate clustered index size in
  262. database pages */
  263. ulint stat_sum_of_other_index_sizes;
  264. /* other indexes in database pages */
  265. ulint stat_last_estimate_counter;
  266. /* when the estimates were last time
  267. calculated; a value (ulint)-1 denotes that
  268. they have not yet been calculated for this
  269. table (or the counter has wrapped over) */
  270. ulint stat_modif_counter;
  271. /* when a row is inserted, updated, or deleted,
  272. we add the row length to this number; we
  273. calculate new estimates for the stat_...
  274. values for the table and the indexes at an
  275. interval of DICT_STAT_CALCULATE_INTERVAL,
  276. but for small tables more often, also
  277. when the estimate operation is called
  278. for MySQL SHOW TABLE STATUS; this counter
  279. is not protected by any latch, because this
  280. is only used for heuristics */
  281. ulint magic_n;/* magic number */
  282. };
  283. #define DICT_TABLE_MAGIC_N 76333786
  284. /* Statistics are calculated at least with this interval; see the struct
  285. above */
  286. #define DICT_STAT_CALCULATE_INTERVAL (UNIV_PAGE_SIZE * 8)
  287. /* Data structure for a stored procedure */
  288. struct dict_proc_struct{
  289. mem_heap_t* heap; /* memory heap */
  290. char* name; /* procedure name */
  291. char* sql_string;
  292. /* procedure definition as an SQL string:
  293. we can produce more parsed instances of the
  294. procedure by parsing this string */
  295. hash_node_t name_hash;
  296. /* hash chain node */
  297. UT_LIST_BASE_NODE_T(que_fork_t) graphs;
  298. /* list of parsed instances of the procedure:
  299. there may be many of them, and they are
  300. recycled */
  301. ulint mem_fix;/* count of how many times this struct 
  302. has been fixed in memory */
  303. };
  304. #ifndef UNIV_NONINL
  305. #include "dict0mem.ic"
  306. #endif
  307. #endif