diff options
author | Parth Chandra <parthc@apache.org> | 2017-06-07 11:09:10 -0700 |
---|---|---|
committer | Parth Chandra <parthc@apache.org> | 2017-10-11 19:27:47 -0700 |
commit | ac3f0ce2683906db908d861e3f93700d8ac0f6d6 (patch) | |
tree | a4cdb95451c761021fb0b9b8a8384d485376fcb6 /contrib/native/client/src/include | |
parent | a62f96d944c7bb63d2bfdaec10ff571153b071c9 (diff) |
DRILL-5431: SSL Support (C++) - Refactoring of C++ client.
Move classes out of drillclient to their own files
Fix build on MacOS to suppress warnings from boost code
Refactoring of user properties to use a map
Diffstat (limited to 'contrib/native/client/src/include')
5 files changed, 308 insertions, 139 deletions
diff --git a/contrib/native/client/src/include/drill/drillClient.hpp b/contrib/native/client/src/include/drill/drillClient.hpp index f09d7f5ec..ceaf50d43 100644 --- a/contrib/native/client/src/include/drill/drillClient.hpp +++ b/contrib/native/client/src/include/drill/drillClient.hpp @@ -35,9 +35,12 @@ namespace exec{ namespace Drill{ //struct UserServerEndPoint; +class DrillClientConfig; +class DrillClientError; class DrillClientImplBase; class DrillClientImpl; class DrillClientQueryResult; +class DrillUserProperties; class FieldMetadata; class PreparedStatement; class RecordBatch; @@ -49,23 +52,6 @@ enum QueryType{ PHYSICAL = 3 }; -class DECLSPEC_DRILL_CLIENT DrillClientError{ - public: - static const uint32_t CONN_ERROR_START = 100; - static const uint32_t QRY_ERROR_START = 200; - - DrillClientError(uint32_t s, uint32_t e, char* m){status=s; errnum=e; msg=m;}; - DrillClientError(uint32_t s, uint32_t e, std::string m){status=s; errnum=e; msg=m;}; - - static DrillClientError* getErrorObject(const exec::shared::DrillPBError& e); - - // To get the error number we add a error range start number to - // the status code returned (either status_t or connectionStatus_t) - uint32_t status; // could be either status_t or connectionStatus_t - uint32_t errnum; - std::string msg; -}; - // Only one instance of this class exists. A static member of DrillClientImpl; class DECLSPEC_DRILL_CLIENT DrillClientInitializer{ public: @@ -73,127 +59,6 @@ class DECLSPEC_DRILL_CLIENT DrillClientInitializer{ ~DrillClientInitializer(); }; -// Only one instance of this class exists. A static member of DrillClientImpl; -class DECLSPEC_DRILL_CLIENT DrillClientConfig{ - public: - DrillClientConfig(); - ~DrillClientConfig(); - static void initLogging(const char* path); - static void setLogLevel(logLevel_t l); - static void setSaslPluginPath(const char* path); - static const char* getSaslPluginPath(); - static void setBufferLimit(uint64_t l); - static uint64_t getBufferLimit(); - static void setSocketTimeout(int32_t l); - static void setHandshakeTimeout(int32_t l); - static void setQueryTimeout(int32_t l); - static void setHeartbeatFrequency(int32_t l); - static int32_t getSocketTimeout(); - static int32_t getHandshakeTimeout(); - static int32_t getQueryTimeout(); - static int32_t getHeartbeatFrequency(); - static logLevel_t getLogLevel(); - - /** - * Return the client name sent to the server when connecting - * - * @return the current client name - */ - static const std::string& getClientName(); - - /** - * Set the client name to be sent to the server when connecting. - * - * Only new connections will use the new value. Existing connections - * will be left unchanged. - * - * @param name the name to be send to the server - */ - static void setClientName(const std::string& name); - - /** - * Return the application name sent to the server when connecting - * - * @return the current application name - */ - static const std::string& getApplicationName(); - - /** - * Set the application name to be sent to the server when connecting. - * - * Only new connections will use the new value. Existing connections - * will be left unchanged. - * - * @param name the name to be send to the server - */ - static void setApplicationName(const std::string& name); - - - - private: - // The logging level - static logLevel_t s_logLevel; - // The total amount of memory to be allocated by an instance of DrillClient. - // For future use. Currently, not enforced. - static uint64_t s_bufferLimit; - - static const char* s_saslPluginPath; - - /** - * DrillClient configures timeout (in seconds) in a fine granularity. - * Disabled by setting the value to zero. - * - * s_socketTimout: (default 0) - * set SO_RCVTIMEO and SO_SNDTIMEO socket options and place a - * timeout on socket receives and sends. It is disabled by default. - * - * s_handshakeTimeout: (default 5) - * place a timeout on validating handshake. When an endpoint (host:port) - * is reachable but drillbit hangs or running another service. It will - * avoid the client hanging. - * - * s_queryTimeout: (default 180) - * place a timeout on waiting result of querying. - * - * s_heartbeatFrequency: (default 30) - * Seconds of idle activity after which a heartbeat is sent to the drillbit - */ - static int32_t s_socketTimeout; - static int32_t s_handshakeTimeout; - static int32_t s_queryTimeout; - static int32_t s_heartbeatFrequency; - static boost::mutex s_mutex; - - // The client name (default to DRILL_CONNECTOR_NAME) - static std::string s_clientName; - // The application name (default to <empty>) - static std::string s_applicationName; -}; - - -class DECLSPEC_DRILL_CLIENT DrillUserProperties{ - public: - static const std::map<std::string, uint32_t> USER_PROPERTIES; - - DrillUserProperties(){}; - - void setProperty( const std::string& propName, const std::string& propValue){ - std::pair< std::string, std::string> in = make_pair(propName, propValue); - m_properties.push_back(in); - } - - size_t size() const { return m_properties.size(); } - - const std::string& keyAt(size_t i) const { return m_properties.at(i).first; } - - const std::string& valueAt(size_t i) const { return m_properties.at(i).second; } - - bool validate(std::string& err); - - private: - std::vector< std::pair< std::string, std::string> > m_properties; -}; - /* * Handle to the Query submitted for execution. * */ @@ -1248,7 +1113,7 @@ class DECLSPEC_DRILL_CLIENT DrillClient{ */ DEPRECATED connectionStatus_t connect(const char* connectStr, const char* defaultSchema=NULL); - /* + /* * Connect the client to a Drillbit using connection string and a set of user properties. * The connection string format can be found in comments of * [DRILL-780](https://issues.apache.org/jira/browse/DRILL-780) diff --git a/contrib/native/client/src/include/drill/drillConfig.hpp b/contrib/native/client/src/include/drill/drillConfig.hpp new file mode 100644 index 000000000..669267d86 --- /dev/null +++ b/contrib/native/client/src/include/drill/drillConfig.hpp @@ -0,0 +1,153 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 + * + * http://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. + */ + + +#ifndef DRILL_CONFIG_H +#define DRILL_CONFIG_H + +#include "drill/common.hpp" +#include <boost/thread.hpp> + + + +#if defined _WIN32 || defined __CYGWIN__ + #ifdef DRILL_CLIENT_EXPORTS + #define DECLSPEC_DRILL_CLIENT __declspec(dllexport) + #else + #ifdef USE_STATIC_LIBDRILL + #define DECLSPEC_DRILL_CLIENT + #else + #define DECLSPEC_DRILL_CLIENT __declspec(dllimport) + #endif + #endif +#else + #if __GNUC__ >= 4 + #define DECLSPEC_DRILL_CLIENT __attribute__ ((visibility ("default"))) + #else + #define DECLSPEC_DRILL_CLIENT + #endif +#endif + +namespace exec{ + namespace shared{ + class DrillPBError; + }; +}; + +namespace Drill{ + +// Only one instance of this class exists. A static member of DrillClientImpl; + +class DECLSPEC_DRILL_CLIENT DrillClientConfig{ + public: + DrillClientConfig(); + ~DrillClientConfig(); + static void initLogging(const char* path); + static void setLogLevel(logLevel_t l); + static void setSaslPluginPath(const char* path); + static const char* getSaslPluginPath(); + static void setBufferLimit(uint64_t l); + static uint64_t getBufferLimit(); + static void setSocketTimeout(int32_t l); + static void setHandshakeTimeout(int32_t l); + static void setQueryTimeout(int32_t l); + static void setHeartbeatFrequency(int32_t l); + static int32_t getSocketTimeout(); + static int32_t getHandshakeTimeout(); + static int32_t getQueryTimeout(); + static int32_t getHeartbeatFrequency(); + static logLevel_t getLogLevel(); + /** + * Return the client name sent to the server when connecting + * + * @return the current client name + */ + static const std::string& getClientName(); + + /** + * Set the client name to be sent to the server when connecting. + * + * Only new connections will use the new value. Existing connections + * will be left unchanged. + * + * @param name the name to be send to the server + */ + static void setClientName(const std::string& name); + + /** + * Return the application name sent to the server when connecting + * + * @return the current application name + */ + static const std::string& getApplicationName(); + + /** + * Set the application name to be sent to the server when connecting. + * + * Only new connections will use the new value. Existing connections + * will be left unchanged. + * + * @param name the name to be send to the server + */ + static void setApplicationName(const std::string& name); + + + private: + // The logging level + static logLevel_t s_logLevel; + // The total amount of memory to be allocated by an instance of DrillClient. + // For future use. Currently, not enforced. + static uint64_t s_bufferLimit; + + static const char* s_saslPluginPath; + + /** + * DrillClient configures timeout (in seconds) in a fine granularity. + * Disabled by setting the value to zero. + * + * s_socketTimout: (default 0) + * set SO_RCVTIMEO and SO_SNDTIMEO socket options and place a + * timeout on socket receives and sends. It is disabled by default. + * + * s_handshakeTimeout: (default 5) + * place a timeout on validating handshake. When an endpoint (host:port) + * is reachable but drillbit hangs or running another service. It will + * avoid the client hanging. + * + * s_queryTimeout: (default 180) + * place a timeout on waiting result of querying. + * + * s_heartbeatFrequency: (default 30) + * Seconds of idle activity after which a heartbeat is sent to the drillbit + */ + static int32_t s_socketTimeout; + static int32_t s_handshakeTimeout; + static int32_t s_queryTimeout; + static int32_t s_heartbeatFrequency; + static boost::mutex s_mutex; + // The client name (default to DRILL_CONNECTOR_NAME) + static std::string s_clientName; + // The application name (default to <empty>) + static std::string s_applicationName; +}; + + + +} // namespace Drill + +#endif diff --git a/contrib/native/client/src/include/drill/drillError.hpp b/contrib/native/client/src/include/drill/drillError.hpp new file mode 100644 index 000000000..072df1c31 --- /dev/null +++ b/contrib/native/client/src/include/drill/drillError.hpp @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 + * + * http://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. + */ + + +#ifndef DRILL_ERROR_H +#define DRILL_ERROR_H + +#include "drill/common.hpp" + +#if defined _WIN32 || defined __CYGWIN__ + #ifdef DRILL_CLIENT_EXPORTS + #define DECLSPEC_DRILL_CLIENT __declspec(dllexport) + #else + #ifdef USE_STATIC_LIBDRILL + #define DECLSPEC_DRILL_CLIENT + #else + #define DECLSPEC_DRILL_CLIENT __declspec(dllimport) + #endif + #endif +#else + #if __GNUC__ >= 4 + #define DECLSPEC_DRILL_CLIENT __attribute__ ((visibility ("default"))) + #else + #define DECLSPEC_DRILL_CLIENT + #endif +#endif + +namespace exec{ + namespace shared{ + class DrillPBError; + }; +}; + +namespace Drill{ + +class DECLSPEC_DRILL_CLIENT DrillClientError{ + public: + static const uint32_t CONN_ERROR_START = 100; + static const uint32_t QRY_ERROR_START = 200; + + DrillClientError(uint32_t s, uint32_t e, char* m){status=s; errnum=e; msg=m;}; + DrillClientError(uint32_t s, uint32_t e, std::string m){status=s; errnum=e; msg=m;}; + //copy ctor + DrillClientError(const DrillClientError& err){status=err.status; errnum=err.errnum; msg=err.msg;}; + + static DrillClientError* getErrorObject(const exec::shared::DrillPBError& e); + + // To get the error number we add a error range start number to + // the status code returned (either status_t or connectionStatus_t) + uint32_t status; // could be either status_t or connectionStatus_t + uint32_t errnum; + std::string msg; +}; + +} // namespace Drill + +#endif diff --git a/contrib/native/client/src/include/drill/drillc.hpp b/contrib/native/client/src/include/drill/drillc.hpp index c8593f599..21a18e7d8 100644 --- a/contrib/native/client/src/include/drill/drillc.hpp +++ b/contrib/native/client/src/include/drill/drillc.hpp @@ -20,10 +20,13 @@ #define DRILL_CLIENT_ALL_H #include "drill/common.hpp" +#include "drill/drillConfig.hpp" +#include "drill/drillError.hpp" #include "drill/drillClient.hpp" #include "drill/fieldmeta.hpp" #include "drill/preparedStatement.hpp" #include "drill/recordBatch.hpp" +#include "drill/userProperties.hpp" #include "drill/protobuf/Types.pb.h" #endif diff --git a/contrib/native/client/src/include/drill/userProperties.hpp b/contrib/native/client/src/include/drill/userProperties.hpp new file mode 100644 index 000000000..3490dce7a --- /dev/null +++ b/contrib/native/client/src/include/drill/userProperties.hpp @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 + * + * http://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. + */ +#ifndef USER_PROPERTIES_H +#define USER_PROPERTIES_H + +#include <map> +#include "drill/common.hpp" + +namespace Drill{ + +class DECLSPEC_DRILL_CLIENT DrillUserProperties{ + public: + static const std::map<std::string, uint32_t> USER_PROPERTIES; + + DrillUserProperties(){}; + + void setProperty( const std::string& propName, const std::string& propValue){ + std::pair< std::string, std::string> in = make_pair(propName, propValue); + m_properties.insert(in); + } + + size_t size() const { return m_properties.size(); } + + //const std::string& keyAt(size_t i) const { return m_properties.at(i).first; } + + //const std::string& valueAt(size_t i) const { return m_properties.at(i).second; } + + const bool isPropSet(const std::string& key) const{ + bool isSet=true; + auto f= m_properties.find(key); + if(f==m_properties.end()){ + isSet=false; + } + return isSet; + } + const std::string& getProp(const std::string& key, std::string& value) const{ + auto f= m_properties.find(key); + if(f!=m_properties.end()){ + value=f->second; + } + return value; + } + + bool validate(std::string& err); + + std::map<std::string,std::string>::const_iterator begin() const{ + return m_properties.begin(); + } + + std::map<std::string,std::string>::const_iterator end() const{ + return m_properties.end(); + } + + private: + std::map< std::string, std::string > m_properties; +}; + + +} // namespace Drill +#endif // USER_PROPERTIES_H + |