diff --git a/google/cloud/odbc/bq_client_interface/datasets.cc b/google/cloud/odbc/bq_client_interface/datasets.cc index 834403ef66..cb90a97ae4 100644 --- a/google/cloud/odbc/bq_client_interface/datasets.cc +++ b/google/cloud/odbc/bq_client_interface/datasets.cc @@ -13,6 +13,7 @@ // limitations under the License. #include "google/cloud/odbc/bq_client_interface/datasets.h" +#include "google/cloud/odbc/internal/commons.h" #include "google/cloud/odbc/internal/status_record_or.h" #include "google/cloud/bigquery/v2/minimal/internal/dataset_client.h" #include "absl/log/log.h" @@ -25,6 +26,8 @@ using ::google::cloud::bigquery_v2_minimal_internal::DatasetClient; using ::google::cloud::bigquery_v2_minimal_internal::GetDatasetRequest; using ::google::cloud::bigquery_v2_minimal_internal::ListDatasetsRequest; using ::google::cloud::bigquery_v2_minimal_internal::ListFormatDataset; +using ::google::cloud::odbc_internal::LogLevel; +using ::google::cloud::odbc_internal::ShouldLog; using google::cloud::odbc_internal::StatusRecord; using google::cloud::odbc_internal::StatusRecordOr; @@ -37,15 +40,16 @@ StatusRecordOr GetDataset(DatasetClient& dataset_client, GetDatasetRequest request; request.set_project_id(project_id); request.set_dataset_id(dataset_id); - LOG(INFO) << "GetDataSet:: Request body: " << request.DebugString(""); + LOG_IF(INFO, ShouldLog(LogLevel::kLogInfo)) + << "GetDataSet:: Request body: " << request.DebugString(""); auto response = dataset_client.GetDataset(request, options); if (!response.ok()) { LOG(WARNING) << "GetDataSet:: Request failed: " << response.status(); return StatusRecordOr::ConvertFromStatusOr(response.status()); } - LOG(INFO) << "GetDataSet:: Response body: " - << GetJsonRegResp(*response); + LOG_IF(INFO, ShouldLog(LogLevel::kLogInfo)) + << "GetDataSet:: Response body: " << GetJsonRegResp(*response); return StatusRecordOr::ConvertFromStatusOr(*response); } #pragma clang attribute pop @@ -58,7 +62,8 @@ StatusRecordOr> ListAllDatasets( ListDatasetsRequest request; request.set_project_id(project_id); request.set_all_datasets(true); - LOG(INFO) << "ListAllDatasets:: Request body: " << request.DebugString(""); + LOG_IF(INFO, ShouldLog(LogLevel::kLogInfo)) + << "ListAllDatasets:: Request body: " << request.DebugString(""); StreamRange datasets_response = dataset_client.ListDatasets(request, options); @@ -68,8 +73,9 @@ StatusRecordOr> ListAllDatasets( LOG(ERROR) << "ListAllDatasets:: " << dataset.status().message(); return StatusRecord::ConvertFrom(dataset.status()); } - LOG(INFO) << "ListAllDatasets:: Response body: " - << GetJsonRegResp(*dataset); + LOG_IF(INFO, ShouldLog(LogLevel::kLogInfo)) + << "ListAllDatasets:: Response body: " + << GetJsonRegResp(*dataset); datasets.push_back(*dataset); } @@ -86,7 +92,8 @@ StatusRecordOr> FilterDatasets( request.set_project_id(project_id); request.set_all_datasets(dataset_filter.all); request.set_filter(dataset_filter.filter); - LOG(INFO) << "FilterDatasets:: Request body: " << request.DebugString(""); + LOG_IF(INFO, ShouldLog(LogLevel::kLogInfo)) + << "FilterDatasets:: Request body: " << request.DebugString(""); StreamRange datasets_response = dataset_client.ListDatasets(request, options); @@ -97,8 +104,9 @@ StatusRecordOr> FilterDatasets( LOG(ERROR) << "FilterDatasets:: " << dataset.status().message(); return StatusRecord::ConvertFrom(dataset.status()); } - LOG(INFO) << "FilterDatasets:: Response body: " - << GetJsonRegResp(*dataset); + LOG_IF(INFO, ShouldLog(LogLevel::kLogInfo)) + << "FilterDatasets:: Response body: " + << GetJsonRegResp(*dataset); datasets.push_back(*dataset); } diff --git a/google/cloud/odbc/bq_client_interface/jobs.cc b/google/cloud/odbc/bq_client_interface/jobs.cc index b54eeab4f8..151771b777 100644 --- a/google/cloud/odbc/bq_client_interface/jobs.cc +++ b/google/cloud/odbc/bq_client_interface/jobs.cc @@ -15,6 +15,7 @@ #include "google/cloud/odbc/bq_client_interface/jobs.h" #include "google/cloud/odbc/bq_client_interface/datasets.h" #include "google/cloud/odbc/bq_client_interface/utils.h" +#include "google/cloud/odbc/internal/commons.h" #include "google/cloud/odbc/internal/status_record_or.h" #include "google/cloud/bigquery/v2/minimal/internal/job_client.h" #include "google/cloud/bigquery/v2/minimal/internal/job_request.h" @@ -38,6 +39,8 @@ using ::google::cloud::bigquery_v2_minimal_internal::PostQueryResults; using ::google::cloud::bigquery_v2_minimal_internal::Projection; using ::google::cloud::bigquery_v2_minimal_internal::QueryRequest; using ::google::cloud::internal::ExponentialBackoffPolicy; +using ::google::cloud::odbc_internal::LogLevel; +using ::google::cloud::odbc_internal::ShouldLog; using google::cloud::odbc_internal::SQLStates; using google::cloud::odbc_internal::StatusRecord; using google::cloud::odbc_internal::StatusRecordOr; @@ -119,7 +122,8 @@ StatusRecordOr GetJob(JobClient& job_client, std::string const& project_id, get_job_request.set_project_id(project_id); get_job_request.set_job_id(job_id); get_job_request.set_location(location); - LOG(INFO) << "GetJob:: Request body: " << get_job_request.DebugString(""); + LOG_IF(INFO, ShouldLog(LogLevel::kLogInfo)) + << "GetJob:: Request body: " << get_job_request.DebugString(""); auto max_retries = options.get(); auto response = RetryLoop([&] { return job_client.GetJob(get_job_request, options); }, @@ -129,7 +133,8 @@ StatusRecordOr GetJob(JobClient& job_client, std::string const& project_id, LOG(WARNING) << "GetJob:: Request failed: " << response.status(); return StatusRecordOr::ConvertFromStatusOr(response.status()); } - LOG(INFO) << "GetJob:: Response body: " << GetJsonRegResp(*response); + LOG_IF(INFO, ShouldLog(LogLevel::kLogInfo)) + << "GetJob:: Response body: " << GetJsonRegResp(*response); return StatusRecordOr::ConvertFromStatusOr(*response); } #pragma clang attribute pop @@ -157,7 +162,8 @@ StatusRecordOr> ListAllJobs( request.set_all_users(false); request.set_max_results(kMaxChildJobsResults); request.set_projection(Projection::Full()); - LOG(INFO) << "ListAllJobs:: Request body: " << request.DebugString(""); + LOG_IF(INFO, ShouldLog(LogLevel::kLogInfo)) + << "ListAllJobs:: Request body: " << request.DebugString(""); StreamRange jobs_response = job_client.ListJobs(request, options); @@ -167,8 +173,9 @@ StatusRecordOr> ListAllJobs( LOG(ERROR) << "ListAllJobs:: " << job.status().message(); return StatusRecord::ConvertFrom(job.status()); } - LOG(INFO) << "ListAllJobs:: Response body: " - << GetJsonRegResp(*job); + LOG_IF(INFO, ShouldLog(LogLevel::kLogInfo)) + << "ListAllJobs:: Response body: " + << GetJsonRegResp(*job); jobs.push_back(*job); } @@ -186,7 +193,8 @@ StatusRecordOr> ListAllJobs( request.set_all_users(false); request.set_max_results(kMaxChildJobsResults); request.set_projection(Projection::Full()); - LOG(INFO) << "ListAllJobs:: Request body: " << request.DebugString(""); + LOG_IF(INFO, ShouldLog(LogLevel::kLogInfo)) + << "ListAllJobs:: Request body: " << request.DebugString(""); StreamRange jobs_response = job_client.ListJobs(request, options); @@ -197,8 +205,9 @@ StatusRecordOr> ListAllJobs( LOG(ERROR) << "ListAllJobs:: " << job.status().message(); return StatusRecord::ConvertFrom(job.status()); } - LOG(INFO) << "ListAllJobs:: Response body: " - << GetJsonRegResp(*job); + LOG_IF(INFO, ShouldLog(LogLevel::kLogInfo)) + << "ListAllJobs:: Response body: " + << GetJsonRegResp(*job); jobs.push_back(*job); } @@ -219,8 +228,8 @@ StatusRecordOr> FilterJobs( request.set_state_filter(job_filter.state_filter); request.set_parent_job_id(job_filter.parent_job_id); request.set_projection(job_filter.projection); - - LOG(INFO) << "FilterJobs:: Request body: " << request.DebugString(""); + LOG_IF(INFO, ShouldLog(LogLevel::kLogInfo)) + << "FilterJobs:: Request body: " << request.DebugString(""); StreamRange jobs_response = job_client.ListJobs(request, options); @@ -230,8 +239,9 @@ StatusRecordOr> FilterJobs( LOG(ERROR) << "FilterJobs:: " << job.status().message(); return StatusRecord::ConvertFrom(job.status()); } - LOG(INFO) << "FilterJobs:: Response body: " - << GetJsonRegResp(*job); + LOG_IF(INFO, ShouldLog(LogLevel::kLogInfo)) + << "FilterJobs:: Response body: " + << GetJsonRegResp(*job); jobs.push_back(*job); } @@ -248,8 +258,8 @@ StatusRecordOr InsertJob(JobClient& job_client, request.set_project_id(project_id); request.set_job(job); request.set_json_filter_keys(CreateKeysToFilterOut(job)); - - LOG(INFO) << "InsertJob:: Request body: " << request.DebugString(""); + LOG_IF(INFO, ShouldLog(LogLevel::kLogInfo)) + << "InsertJob:: Request body: " << request.DebugString(""); auto max_retries = options.get(); auto response = RetryLoop([&] { return job_client.InsertJob(request, options); }, @@ -259,7 +269,8 @@ StatusRecordOr InsertJob(JobClient& job_client, LOG(WARNING) << "InsertJob:: Request failed: " << response.status(); return StatusRecordOr::ConvertFromStatusOr(response.status()); } - LOG(INFO) << "InsertJob: Response body: " << GetJsonRegResp(*response); + LOG_IF(INFO, ShouldLog(LogLevel::kLogInfo)) + << "InsertJob: Response body: " << GetJsonRegResp(*response); return StatusRecordOr::ConvertFromStatusOr(*response); } #pragma clang attribute pop @@ -280,7 +291,8 @@ StatusRecordOr CancelJob(JobClient& job_client, if (!location.empty()) { request.set_location(location); } - LOG(INFO) << "CancelJob:: Request body: " << request.DebugString(""); + LOG_IF(INFO, ShouldLog(LogLevel::kLogInfo)) + << "CancelJob:: Request body: " << request.DebugString(""); auto max_retries = options.get(); auto response = RetryLoop([&] { return job_client.CancelJob(request, options); }, @@ -290,7 +302,8 @@ StatusRecordOr CancelJob(JobClient& job_client, LOG(WARNING) << "CancelJob:: Request failed: " << response.status(); return StatusRecordOr::ConvertFromStatusOr(response.status()); } - LOG(INFO) << "CancelJob:: Response body: " << GetJsonRegResp(*response); + LOG_IF(INFO, ShouldLog(LogLevel::kLogInfo)) + << "CancelJob:: Response body: " << GetJsonRegResp(*response); return StatusRecordOr::ConvertFromStatusOr(*response); } #pragma clang attribute pop @@ -305,8 +318,8 @@ StatusRecordOr Query(JobClient& job_client, post_query_request.set_project_id(project_id); post_query_request.set_query_request(query_request); post_query_request.set_json_filter_keys(CreateKeysToFilterOut(query_request)); - - LOG(INFO) << "Query:: Request body: " << post_query_request.DebugString(""); + LOG_IF(INFO, ShouldLog(LogLevel::kLogInfo)) + << "Query:: Request body: " << post_query_request.DebugString(""); auto max_retries = options.get(); auto response = RetryLoop([&] { return job_client.Query(post_query_request, options); }, @@ -317,8 +330,9 @@ StatusRecordOr Query(JobClient& job_client, return StatusRecordOr::ConvertFromStatusOr( response.status()); } - LOG(INFO) << "Query:: Response body: " - << GetJsonRegResp(*response); + LOG_IF(INFO, ShouldLog(LogLevel::kLogInfo)) + << "Query:: Response body: " + << GetJsonRegResp(*response); return StatusRecordOr::ConvertFromStatusOr(*response); } #pragma clang attribute pop @@ -364,8 +378,9 @@ StatusRecordOr GetAllQueryResults( << get_query_results_partial.status().message(); return StatusRecord::ConvertFrom(get_query_results_partial.status()); } - LOG(INFO) << "GetAllQueryResults::QueryResults:: Response body: " - << get_query_results_partial->DebugString(""); + LOG_IF(INFO, ShouldLog(LogLevel::kLogInfo)) + << "GetAllQueryResults::QueryResults:: Response body: " + << get_query_results_partial->DebugString(""); // If job_complete is false, there would be no rows and we should wait for // job completion if (!get_query_results_partial->job_complete && @@ -389,8 +404,9 @@ StatusRecordOr GetAllQueryResults( get_query_results_request.set_page_token( get_query_results_partial->page_token); } - LOG(INFO) << "GetAllQueryResults:: Request body: " - << get_query_results_request.DebugString(""); + LOG_IF(INFO, ShouldLog(LogLevel::kLogInfo)) + << "GetAllQueryResults:: Request body: " + << get_query_results_request.DebugString(""); return get_query_results; } #pragma clang attribute pop @@ -411,9 +427,9 @@ StatusRecordOr FilterQueryResults( chrono_ms(query_results_filter.query_timeout_ms)); get_query_results_request.set_max_results(query_results_filter.max_results); get_query_results_request.set_page_token(query_results_filter.page_token); - - LOG(INFO) << "FilterQueryResults:: Request body: " - << get_query_results_request.DebugString(""); + LOG_IF(INFO, ShouldLog(LogLevel::kLogInfo)) + << "FilterQueryResults:: Request body: " + << get_query_results_request.DebugString(""); auto max_retries = options.get(); auto response = RetryLoop( [&] { @@ -427,8 +443,9 @@ StatusRecordOr FilterQueryResults( return StatusRecordOr::ConvertFromStatusOr( response.status()); } - LOG(INFO) << "FilterQueryResults::QueryResults:: Response body: " - << response->DebugString(""); + LOG_IF(INFO, ShouldLog(LogLevel::kLogInfo)) + << "FilterQueryResults::QueryResults:: Response body: " + << response->DebugString(""); return StatusRecordOr::ConvertFromStatusOr(*response); } #pragma clang attribute pop diff --git a/google/cloud/odbc/bq_client_interface/projects.cc b/google/cloud/odbc/bq_client_interface/projects.cc index d21cdc2422..a542489dfa 100644 --- a/google/cloud/odbc/bq_client_interface/projects.cc +++ b/google/cloud/odbc/bq_client_interface/projects.cc @@ -14,6 +14,7 @@ #include "google/cloud/odbc/bq_client_interface/projects.h" #include "google/cloud/odbc/bq_client_interface/datasets.h" +#include "google/cloud/odbc/internal/commons.h" #include "google/cloud/odbc/internal/sql_state_constants.h" #include "google/cloud/odbc/internal/status_record_or.h" #include "google/cloud/resourcemanager/v3/projects.pb.h" @@ -27,6 +28,8 @@ using ::google::cloud::Options; using ::google::cloud::bigquery_v2_minimal_internal::ListProjectsRequest; using ::google::cloud::bigquery_v2_minimal_internal::Project; using ::google::cloud::bigquery_v2_minimal_internal::ProjectClient; +using ::google::cloud::odbc_internal::LogLevel; +using ::google::cloud::odbc_internal::ShouldLog; using google::cloud::odbc_internal::StatusRecord; using google::cloud::odbc_internal::StatusRecordOr; using ::google::cloud::resourcemanager_v3::ProjectsClient; @@ -70,8 +73,9 @@ StatusRecordOr ConvertFrom( } std::string s_numeric_id = rm_project.name().substr(index + 1); bq_project.numeric_id = std::stoll(s_numeric_id); - LOG(INFO) << "ConvertFrom::Project:: Request body: " - << GetJsonRegResp(bq_project); + LOG_IF(INFO, ShouldLog(LogLevel::kLogInfo)) + << "ConvertFrom::Project:: Request body: " + << GetJsonRegResp(bq_project); return bq_project; } diff --git a/google/cloud/odbc/bq_client_interface/tables.cc b/google/cloud/odbc/bq_client_interface/tables.cc index d51903cb0c..413b45d86b 100644 --- a/google/cloud/odbc/bq_client_interface/tables.cc +++ b/google/cloud/odbc/bq_client_interface/tables.cc @@ -15,6 +15,7 @@ #include "google/cloud/odbc/bq_client_interface/tables.h" #include "google/cloud/odbc/bq_client_interface/datasets.h" #include "google/cloud/odbc/bq_client_interface/utils.h" +#include "google/cloud/odbc/internal/commons.h" #include "google/cloud/odbc/internal/status_record_or.h" #include "google/cloud/bigquery/v2/minimal/internal/table_client.h" #include "absl/log/log.h" @@ -27,6 +28,8 @@ using ::google::cloud::bigquery_v2_minimal_internal::ListFormatTable; using ::google::cloud::bigquery_v2_minimal_internal::ListTablesRequest; using ::google::cloud::bigquery_v2_minimal_internal::Table; using ::google::cloud::bigquery_v2_minimal_internal::TableClient; +using ::google::cloud::odbc_internal::LogLevel; +using ::google::cloud::odbc_internal::ShouldLog; using google::cloud::odbc_internal::StatusRecord; using google::cloud::odbc_internal::StatusRecordOr; @@ -45,8 +48,8 @@ StatusRecordOr GetTable(TableClient& table_client, request.set_selected_fields(table_filter.selected_fields); request.set_view(table_filter.view); - LOG(INFO) << "GetTable:: Request body: " << request.DebugString(""); - + LOG_IF(INFO, ShouldLog(LogLevel::kLogInfo)) + << "GetTable:: Request body: " << request.DebugString(""); auto max_retries = options.get(); auto response = RetryLoop([&] { return table_client.GetTable(request, options); }, @@ -56,7 +59,8 @@ StatusRecordOr
GetTable(TableClient& table_client, LOG(WARNING) << "GetTable:: Request failed: " << response.status(); return StatusRecordOr
::ConvertFromStatusOr(response.status()); } - LOG(INFO) << "GetTable:: Response body: " << GetJsonRegResp
(*response); + LOG_IF(INFO, ShouldLog(LogLevel::kLogInfo)) + << "GetTable:: Response body: " << GetJsonRegResp
(*response); return StatusRecordOr
::ConvertFromStatusOr(*response); } #pragma clang attribute pop @@ -70,7 +74,8 @@ StatusRecordOr> ListAllTables( request.set_project_id(project_id); request.set_dataset_id(dataset_id); - LOG(INFO) << "ListAllTables:: Request body: " << request.DebugString(""); + LOG_IF(INFO, ShouldLog(LogLevel::kLogInfo)) + << "ListAllTables:: Request body: " << request.DebugString(""); StreamRange tables_response = table_client.ListTables(request, options); @@ -80,8 +85,9 @@ StatusRecordOr> ListAllTables( LOG(ERROR) << "ListAllTables:: " << table.status().message(); return StatusRecord::ConvertFrom(table.status()); } - LOG(INFO) << "ListAllTables:: Response body: " - << GetJsonRegResp(*table); + LOG_IF(INFO, ShouldLog(LogLevel::kLogInfo)) + << "ListAllTables:: Response body: " + << GetJsonRegResp(*table); tables.push_back(*table); } diff --git a/google/cloud/odbc/bq_driver/internal/trace_utils.cc b/google/cloud/odbc/bq_driver/internal/trace_utils.cc index 9d9ee8aded..d1e586a888 100644 --- a/google/cloud/odbc/bq_driver/internal/trace_utils.cc +++ b/google/cloud/odbc/bq_driver/internal/trace_utils.cc @@ -308,6 +308,15 @@ TraceOptions::CreateTraceOptionsFile( return options_file_; } +// bool ShouldLog(LogLevel level) { +// if (!kTraceOptsFile.Ok()) return false; +// auto const& trace_opts = *kTraceOptsFile.GetValue(); +// if (!trace_opts.logging_enabled) { +// return false; +// } +// return static_cast(level) <= static_cast(trace_opts.log_level); +// } + std::shared_ptr TraceOptions::GetTraceOption() { return options_file_; } diff --git a/google/cloud/odbc/bq_driver/internal/trace_utils.h b/google/cloud/odbc/bq_driver/internal/trace_utils.h index 6124b12495..df02da6658 100644 --- a/google/cloud/odbc/bq_driver/internal/trace_utils.h +++ b/google/cloud/odbc/bq_driver/internal/trace_utils.h @@ -171,6 +171,7 @@ void UpdateTraceOption(std::optional log_level, std::string GetLogFileWithIndex(std::string const& log_path); std::string GetFormattedMsg(absl::LogEntry const& entry); +// bool ShouldLog(LogLevel level); //////////////////////////////////////////////////////////////////// // Additional Helper methods for validating and formatting strings // based on parameter types. diff --git a/google/cloud/odbc/internal/CMakeLists.txt b/google/cloud/odbc/internal/CMakeLists.txt index 52dbfb8ebf..0331067149 100644 --- a/google/cloud/odbc/internal/CMakeLists.txt +++ b/google/cloud/odbc/internal/CMakeLists.txt @@ -20,8 +20,13 @@ endif () add_library( odbc_internal STATIC - diagnostic_records.h odbc_includes.h sql_state_constants.h - status_record_or.cc status_record_or.h version.h) + commons.h + diagnostic_records.h + odbc_includes.h + sql_state_constants.h + status_record_or.cc + status_record_or.h + version.h) target_include_directories(odbc_internal PRIVATE $ENV{ODBC_INCLUDE_PATH}) target_include_directories(odbc_internal PUBLIC ${CMAKE_SOURCE_DIR}) diff --git a/google/cloud/odbc/internal/commons.cc b/google/cloud/odbc/internal/commons.cc new file mode 100644 index 0000000000..6e939d1f7d --- /dev/null +++ b/google/cloud/odbc/internal/commons.cc @@ -0,0 +1,29 @@ +// Copyright 2026 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +#include "google/cloud/odbc/internal/commons.h" + +namespace google::cloud::odbc_internal { +using ::google::cloud::odbc_bq_driver_internal::kTraceOptsFile; + +bool ShouldLog(LogLevel level) { + if (!kTraceOptsFile.Ok()) return false; + auto const& trace_opts = *kTraceOptsFile.GetValue(); + if (!trace_opts.logging_enabled) { + return false; + } + return static_cast(level) <= static_cast(trace_opts.log_level); +} +} // namespace google::cloud::odbc_internal diff --git a/google/cloud/odbc/internal/commons.h b/google/cloud/odbc/internal/commons.h new file mode 100644 index 0000000000..3f09dfb23d --- /dev/null +++ b/google/cloud/odbc/internal/commons.h @@ -0,0 +1,16 @@ + + +#ifndef CPP_BIGQUERY_ODBC_GOOGLE_CLOUD_ODBC_INTERNAL_COMMONS_H +#define CPP_BIGQUERY_ODBC_GOOGLE_CLOUD_ODBC_INTERNAL_COMMONS_H + +#include "google/cloud/odbc/bq_driver/internal/trace_utils.h" + +namespace google::cloud::odbc_internal { +using ::google::cloud::odbc_bq_driver_internal::LogLevel; + + + +bool ShouldLog(LogLevel level); +} // namespace google::cloud::odbc_internal + +#endif // CPP_BIGQUERY_ODBC_GOOGLE_CLOUD_ODBC_INTERNAL_COMMONS_H diff --git a/google/cloud/odbc/internal/odbc_internal.bzl b/google/cloud/odbc/internal/odbc_internal.bzl index c25d446769..d646094ab7 100644 --- a/google/cloud/odbc/internal/odbc_internal.bzl +++ b/google/cloud/odbc/internal/odbc_internal.bzl @@ -18,6 +18,7 @@ odbc_internal_hdrs = [ "diagnostic_records.h", + "commons.h", "odbc_includes.h", "sql_state_constants.h", "status_record_or.h",