Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add error trace arg #87

Merged
merged 1 commit into from
Jul 16, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGES.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@
Changes for crate
=================

Unreleased
==========

- expose the ``error_trace`` option to give a full traceback of server exceptions

2014/07/14 0.10.3
=================

Expand Down
6 changes: 6 additions & 0 deletions docs/client.txt
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,12 @@ If no ``servers`` are given, the default one ``http://127.0.0.1:4200`` is used::
>>> connection.client._active_servers
['http://127.0.0.1:4200']


If the option ``error_trace`` is set to ``True``, the client will print a whole traceback
if a server error occurs::

>>> connection = client.connect([crate_host], error_trace=True)

It's possible to define a default timeout value in seconds for all servers
using the optional parameter ``timeout``::

Expand Down
13 changes: 9 additions & 4 deletions src/crate/client/connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,15 @@

class Connection(object):
def __init__(self, servers=None, timeout=None, client=None,
verify_ssl_cert=False, ca_cert=None):
verify_ssl_cert=False, ca_cert=None, error_trace=False):
if client:
self.client = client
else:
self.client = Client(servers,
timeout=timeout,
verify_ssl_cert=verify_ssl_cert,
ca_cert=ca_cert)
ca_cert=ca_cert,
error_trace=error_trace)
self._closed = False

def cursor(self):
Expand Down Expand Up @@ -72,7 +73,7 @@ def __repr__(self):


def connect(servers=None, timeout=None, client=None,
verify_ssl_cert=False, ca_cert=None):
verify_ssl_cert=False, ca_cert=None, error_trace=False):
""" Create a :class:Connection object

:param servers:
Expand All @@ -90,9 +91,13 @@ def connect(servers=None, timeout=None, client=None,
:param ca_cert:
a path to a CA certificate to use when verifying the SSL server
certificate.
:param error_trace:
if set to ``True`` return a whole stacktrace of any server error if
one occurs

>>> connect(['host1:4200', 'host2:4200'])
<Connection <Client ['http://host1:4200', 'http://host2:4200']>>
"""
return Connection(servers=servers, timeout=timeout, client=client,
verify_ssl_cert=verify_ssl_cert, ca_cert=ca_cert)
verify_ssl_cert=verify_ssl_cert, ca_cert=ca_cert,
error_trace=error_trace)
23 changes: 15 additions & 8 deletions src/crate/client/http.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,7 @@
from time import time
import threading
import re
try:
from urllib.parse import urlparse
except ImportError: # Python 2
from urlparse import urlparse
from six.moves.urllib.parse import urlparse, urlencode
from crate.client.exceptions import (
ConnectionError,
DigestNotFoundException,
Expand Down Expand Up @@ -107,7 +104,7 @@ class Client(object):
Crate connection client using crate's HTTP API.
"""

sql_path = '_sql'
SQL_PATH = '_sql'
"""Crate URI path for issuing SQL statements."""

retry_interval = 30
Expand All @@ -117,7 +114,7 @@ class Client(object):
"""Default server to use if no servers are given on instantiation."""

def __init__(self, servers=None, timeout=None, ca_cert=None,
verify_ssl_cert=False):
verify_ssl_cert=False, **url_params):
if not servers:
servers = [self.default_server]
else:
Expand All @@ -142,6 +139,16 @@ def __init__(self, servers=None, timeout=None, ca_cert=None,
self._pool_kw = pool_kw
self._lock = threading.RLock()
self._local = threading.local()
self.path = self._get_sql_path(**url_params)

def _get_sql_path(self, **url_params):
"""
create the HTTP path to send SQL Requests to
"""
if url_params:
return "{0}?{1}".format(self.SQL_PATH, urlencode(url_params))
else:
return self.SQL_PATH

def _update_server_pool(self, servers, **kwargs):
for server in servers:
Expand Down Expand Up @@ -186,8 +193,8 @@ def sql(self, stmt, parameters=None):
if parameters:
data['args'] = parameters
logger.debug(
'Sending request to %s with payload: %s', self.sql_path, data)
content = self._json_request('POST', self.sql_path, data=data)
'Sending request to %s with payload: %s', self.path, data)
content = self._json_request('POST', self.path, data=data)
logger.debug("JSON response for stmt(%s): %s", stmt, content)

return content
Expand Down
15 changes: 15 additions & 0 deletions src/crate/client/test_http.py
Original file line number Diff line number Diff line change
Expand Up @@ -331,3 +331,18 @@ def test_client_keepalive(self):

another_result = self.client.sql("select again from fake")
self.assertEqual(result, another_result)


class ParamsTest(TestCase):

def test_params(self):
client = Client(['127.0.0.1:4200'], some="param eter", another=1)
from six.moves.urllib.parse import urlparse, parse_qs
parsed = urlparse(client.path)
params = parse_qs(parsed.query)
self.assertEquals(params["some"], ["param eter"])
self.assertEquals(params["another"], ["1"])

def test_no_params(self):
client = Client(['127.0.0.1:4200'])
self.assertEqual(client.path, "_sql")
3 changes: 2 additions & 1 deletion src/crate/client/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@

from . import http
from .test_cursor import CursorTest
from .test_http import HttpClientTest, ThreadSafeHttpClientTest, KeepAliveClientTest
from .test_http import HttpClientTest, ThreadSafeHttpClientTest, KeepAliveClientTest, ParamsTest
from .sqlalchemy.tests import test_suite as sqlalchemy_test_suite
from .sqlalchemy.types import ObjectArray
from .compat import cprint
Expand Down Expand Up @@ -252,6 +252,7 @@ def test_suite():
suite.addTest(unittest.makeSuite(HttpClientTest))
suite.addTest(unittest.makeSuite(KeepAliveClientTest))
suite.addTest(unittest.makeSuite(ThreadSafeHttpClientTest))
suite.addTest(unittest.makeSuite(ParamsTest))
suite.addTest(sqlalchemy_test_suite())
suite.addTest(doctest.DocTestSuite('crate.client.connection'))
suite.addTest(doctest.DocTestSuite('crate.client.http'))
Expand Down