165 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			165 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /**
 | |
|  * Copyright (c) 2021 OceanBase
 | |
|  * OceanBase CE is licensed under Mulan PubL v2.
 | |
|  * You can use this software according to the terms and conditions of the Mulan PubL v2.
 | |
|  * You may obtain a copy of Mulan PubL v2 at:
 | |
|  *          http://license.coscl.org.cn/MulanPubL-2.0
 | |
|  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 | |
|  * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 | |
|  * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 | |
|  * See the Mulan PubL v2 for more details.
 | |
|  */
 | |
| 
 | |
| namespace oceanbase {
 | |
| namespace share {
 | |
| namespace schema {
 | |
| inline int MockObMultiVersionSchemaService::init()
 | |
| {
 | |
|   int ret = common::OB_SUCCESS;
 | |
|   common::ObKVGlobalCache::get_instance().init();
 | |
|   if (OB_FAIL(init_maps())) {
 | |
|     _OB_LOG(WARN, "fail to init maps, ret[%d]", ret);
 | |
|   } else if (OB_FAIL(schema_cache_.init())) {
 | |
|     _OB_LOG(WARN, "schema_cache_ init fail, ret[%d]", ret);
 | |
|   } else if (OB_FAIL(init_sys_tenant_user_schema())) {
 | |
|     _OB_LOG(WARN, "init sys tenant user schema fail, ret[%d]", ret);
 | |
|   } else {
 | |
|     // increment_basepoint_set_ = true;
 | |
|   }
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| inline int MockObMultiVersionSchemaService::get_schema_guard(ObSchemaGetterGuard& guard, int64_t snapshot_version)
 | |
| {
 | |
|   int ret = common::OB_SUCCESS;
 | |
|   guard.reset();
 | |
|   guard.schema_service_ = this;
 | |
| 
 | |
|   if (common::OB_INVALID_VERSION == snapshot_version) {
 | |
|     // int64_t latest_local_version = get_latest_local_version();
 | |
|     // if (ObSchemaService::is_core_temp_version(latest_local_version)) {
 | |
|     //  guard.snapshot_version_ = latest_local_version + 2;
 | |
|     //} else if (ObSchemaService::is_sys_temp_version(latest_local_version)) {
 | |
|     //  guard.snapshot_version_ = latest_local_version + 1;
 | |
|     //} else {
 | |
|     //  guard.snapshot_version_ = latest_local_version;
 | |
|     //}
 | |
|     guard.snapshot_version_ = INT64_MAX;
 | |
|   } else if (INT64_MAX == snapshot_version) {
 | |
|     guard.snapshot_version_ = snapshot_version;
 | |
|   } else {
 | |
|     guard.snapshot_version_ = snapshot_version;
 | |
|   }
 | |
|   // if (OB_FAIL(ret)) {
 | |
|   //} else if (OB_FAIL(guard.id_schema_map_.destroy())) {
 | |
|   //  _OB_LOG(WARN, "destroy failed, ret %d", ret);
 | |
|   //} else if (OB_FAIL(guard.id_schema_map_.create(ObSchemaGetterGuard::OB_SCHEMA_NAME_MAP_BUCKET_NUM_GUARD,
 | |
|   //    common::ObModIds::OB_SCHEMA_TENANT_NAME_SCHEMA_MAP))) {
 | |
|   //  _OB_LOG(WARN, "create id_schema_map failed,ret %d", ret);
 | |
|   //}
 | |
|   return ret;
 | |
| }
 | |
| inline int MockObMultiVersionSchemaService::add_table_schema(ObTableSchema& table_schema, int64_t schema_version)
 | |
| {
 | |
|   int ret = common::OB_SUCCESS;
 | |
|   schema::ObSchemaGetterGuard schema_guard;
 | |
|   const ObTenantSchema* tenant_schema = NULL;
 | |
|   const ObSysVariableSchema* sys_variable = NULL;
 | |
|   if (OB_FAIL(get_schema_guard(schema_guard, INT64_MAX))) {
 | |
|     _OB_LOG(WARN, "get schema guard fail, ret %d", ret);
 | |
|   } else if (OB_FAIL(schema_guard.get_tenant_info(common::OB_SYS_TENANT_ID, tenant_schema))) {
 | |
|     OB_LOG(WARN, "get tenant info failed", K(ret));
 | |
|   } else if (OB_ISNULL(tenant_schema)) {
 | |
|     ret = common::OB_TENANT_NOT_EXIST;
 | |
|     _OB_LOG(WARN, "tenant schema is null", K(ret));
 | |
|   } else if (OB_FAIL(schema_guard.get_sys_variable_schema(common::OB_SYS_TENANT_ID, sys_variable))) {
 | |
|     OB_LOG(WARN, "get tenant info failed", K(ret));
 | |
|   } else if (OB_ISNULL(sys_variable)) {
 | |
|     ret = common::OB_TENANT_NOT_EXIST;
 | |
|     _OB_LOG(WARN, "sys variable schema is null", K(ret));
 | |
|   } else {
 | |
|     common::ObNameCaseMode local_mode = sys_variable->get_name_case_mode();
 | |
|     if (local_mode <= common::OB_NAME_CASE_INVALID || local_mode >= common::OB_NAME_CASE_MAX) {
 | |
|       ret = common::OB_ERR_UNEXPECTED;
 | |
|       _OB_LOG(WARN, "invalid tenant mod, ret %d", ret);
 | |
|     } else {
 | |
|       common::ObArray<SchemaUpdateInfo> update_infos;
 | |
|       SchemaUpdateInfo schema_update_info;
 | |
|       schema_update_info.schema_type_ = TABLE_SCHEMA;
 | |
|       schema_update_info.update_type_ = SCHEMA_UPDATE_TYPE_ADD;
 | |
|       schema_update_info.tenant_id_ = table_schema.get_tenant_id();
 | |
|       schema_update_info.database_id_ = table_schema.get_database_id();
 | |
|       schema_update_info.table_id_ = table_schema.get_table_id();
 | |
|       schema_update_info.table_name_ = table_schema.get_table_name();
 | |
|       schema_update_info.name_case_mode_ = local_mode;
 | |
|       schema_update_info.schema_version_ = schema_version;
 | |
|       table_schema.set_schema_version(schema_version);
 | |
|       table_schema.set_name_case_mode(local_mode);
 | |
|       if (OB_FAIL(update_infos.push_back(schema_update_info))) {
 | |
|         _OB_LOG(WARN, "update_infos push back fail, ret %d", ret);
 | |
|       } else if (OB_FAIL(schema_cache_.put_schema(
 | |
|                      TABLE_SCHEMA, table_schema.get_table_id(), schema_version, table_schema))) {
 | |
|         _OB_LOG(WARN, "put schema fail, ret %d", ret);
 | |
|       } else if (OB_FAIL(update_name_maps(update_infos))) {
 | |
|         _OB_LOG(WARN, "update name maps fail, ret %d", ret);
 | |
|       } else if (OB_FAIL(get_schema_guard(schema_guard, INT64_MAX))) {
 | |
|         _OB_LOG(WARN, "get schema guard fail, ret %d", ret);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
|   return ret;
 | |
| }
 | |
| inline int MockObMultiVersionSchemaService::add_database_schema(
 | |
|     ObDatabaseSchema& database_schema, int64_t schema_version)
 | |
| {
 | |
|   int ret = common::OB_SUCCESS;
 | |
|   schema::ObSchemaGetterGuard schema_guard;
 | |
|   const ObTenantSchema* tenant_schema = NULL;
 | |
|   const ObSysVariableSchema* sys_variable = NULL;
 | |
|   if (OB_FAIL(get_schema_guard(schema_guard, INT64_MAX))) {
 | |
|     _OB_LOG(WARN, "get schema guard fail, ret %d", ret);
 | |
|   } else if (OB_FAIL(schema_guard.get_tenant_info(common::OB_SYS_TENANT_ID, tenant_schema))) {
 | |
|     OB_LOG(WARN, "get tenant info failed", K(database_schema), K(ret));
 | |
|   } else if (OB_ISNULL(tenant_schema)) {
 | |
|     ret = common::OB_TENANT_NOT_EXIST;
 | |
|     _OB_LOG(WARN, "tenant schema is null", K(ret));
 | |
|   } else if (OB_FAIL(schema_guard.get_sys_variable_schema(common::OB_SYS_TENANT_ID, sys_variable))) {
 | |
|     OB_LOG(WARN, "get tenant info failed", K(ret));
 | |
|   } else if (OB_ISNULL(sys_variable)) {
 | |
|     ret = common::OB_TENANT_NOT_EXIST;
 | |
|     _OB_LOG(WARN, "sys variable schema is null", K(ret));
 | |
|   } else {
 | |
|     common::ObNameCaseMode local_mode = sys_variable->get_name_case_mode();
 | |
|     if (local_mode <= common::OB_NAME_CASE_INVALID || local_mode >= common::OB_NAME_CASE_MAX) {
 | |
|       ret = common::OB_ERR_UNEXPECTED;
 | |
|       _OB_LOG(WARN, "invalid tenant mod, ret %d", ret);
 | |
|     } else {
 | |
|       common::ObArray<SchemaUpdateInfo> update_infos;
 | |
|       SchemaUpdateInfo schema_update_info;
 | |
|       schema_update_info.schema_type_ = DATABASE_SCHEMA;
 | |
|       schema_update_info.update_type_ = SCHEMA_UPDATE_TYPE_ADD;
 | |
|       schema_update_info.tenant_id_ = database_schema.get_tenant_id();
 | |
|       schema_update_info.database_id_ = database_schema.get_database_id();
 | |
|       schema_update_info.database_name_ = database_schema.get_database_name();
 | |
|       schema_update_info.name_case_mode_ = local_mode;
 | |
|       schema_update_info.schema_version_ = schema_version;
 | |
|       database_schema.set_schema_version(schema_version);
 | |
|       database_schema.set_name_case_mode(local_mode);
 | |
|       if (OB_FAIL(update_infos.push_back(schema_update_info))) {
 | |
|         _OB_LOG(WARN, "update_infos push back fail, ret %d", ret);
 | |
|       } else if (OB_FAIL(schema_cache_.put_schema(
 | |
|                      DATABASE_SCHEMA, database_schema.get_database_id(), schema_version, database_schema))) {
 | |
|         _OB_LOG(WARN, "put schema fail, ret %d", ret);
 | |
|       } else if (OB_FAIL(update_name_maps(update_infos))) {
 | |
|         _OB_LOG(WARN, "update name maps fail, ret %d", ret);
 | |
|       } else if (OB_FAIL(get_schema_guard(schema_guard, INT64_MAX))) {
 | |
|         _OB_LOG(WARN, "get schema guard fail, ret %d", ret);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
|   return ret;
 | |
| }
 | |
| }  // end namespace schema
 | |
| }  // end namespace share
 | |
| }  // end namespace oceanbase
 | 
