1/*****************************************************************************
2
3Copyright (c) 2010, 2014, Oracle and/or its affiliates. All Rights Reserved.
4
5This program is free software; you can redistribute it and/or modify it under
6the terms of the GNU General Public License as published by the Free Software
7Foundation; version 2 of the License.
8
9This program is distributed in the hope that it will be useful, but WITHOUT
10ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12
13You should have received a copy of the GNU General Public License along with
14this program; if not, write to the Free Software Foundation, Inc.,
1551 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA
16
17*****************************************************************************/
18
19/******************************************************************//**
20@file include/dict0priv.ic
21Data dictionary system private include file
22
23Created  Wed 13 Oct 2010 16:10:14 EST Sunny Bains
24***********************************************************************/
25
26#include "dict0dict.h"
27#include "dict0load.h"
28#include "dict0priv.h"
29
30/**********************************************************************//**
31Gets a table; loads it to the dictionary cache if necessary. A low-level
32function.
33@return table, NULL if not found */
34UNIV_INLINE
35dict_table_t*
36dict_table_get_low(
37/*===============*/
38	const char*	table_name)	/*!< in: table name */
39{
40	dict_table_t*	table;
41
42	ut_ad(table_name);
43	ut_ad(mutex_own(&dict_sys->mutex));
44
45	table = dict_table_check_if_in_cache_low(table_name);
46
47	if (table && table->corrupted) {
48		ib::error	error;
49		error << "Table " << table->name << "is corrupted";
50		if (srv_load_corrupted) {
51			error << ", but innodb_force_load_corrupted is set";
52		} else {
53			return(NULL);
54		}
55	}
56
57	if (table == NULL) {
58		table = dict_load_table(table_name, DICT_ERR_IGNORE_NONE);
59	}
60
61	ut_ad(!table || table->cached);
62
63	return(table);
64}
65
66/**********************************************************************//**
67Returns a table object based on table id.
68@return table, NULL if does not exist */
69UNIV_INLINE
70dict_table_t*
71dict_table_open_on_id_low(
72/*======================*/
73	table_id_t		table_id,	/*!< in: table id */
74	dict_err_ignore_t	ignore_err,	/*!< in: errors to ignore
75						when loading the table */
76	ibool			open_only_if_in_cache)
77{
78	dict_table_t*	table;
79	ulint		fold;
80
81	ut_ad(mutex_own(&dict_sys->mutex));
82
83	/* Look for the table name in the hash table */
84	fold = ut_fold_ull(table_id);
85
86	HASH_SEARCH(id_hash, dict_sys->table_id_hash, fold,
87		    dict_table_t*, table, ut_ad(table->cached),
88		    table->id == table_id);
89	if (table == NULL && !open_only_if_in_cache) {
90		table = dict_load_table_on_id(table_id, ignore_err);
91	}
92
93	ut_ad(!table || table->cached);
94
95	/* TODO: should get the type information from MySQL */
96
97	return(table);
98}
99
100/**********************************************************************//**
101Checks if a table is in the dictionary cache.
102@return table, NULL if not found */
103UNIV_INLINE
104dict_table_t*
105dict_table_check_if_in_cache_low(
106/*=============================*/
107	const char*	table_name)	/*!< in: table name */
108{
109	dict_table_t*	table;
110	ulint		table_fold;
111
112	DBUG_ENTER("dict_table_check_if_in_cache_low");
113	DBUG_PRINT("dict_table_check_if_in_cache_low",
114		   ("table: '%s'", table_name));
115
116	ut_ad(table_name);
117	ut_ad(mutex_own(&dict_sys->mutex));
118
119	/* Look for the table name in the hash table */
120	table_fold = ut_fold_string(table_name);
121
122	HASH_SEARCH(name_hash, dict_sys->table_hash, table_fold,
123		    dict_table_t*, table, ut_ad(table->cached),
124		    !strcmp(table->name.m_name, table_name));
125	DBUG_RETURN(table);
126}
127