Skip to content

Commit

Permalink
Merge pull request #87 from crate/m/error_trace
Browse files Browse the repository at this point in the history
add error trace arg
  • Loading branch information
mfelsche committed Jul 16, 2014
2 parents 4c663fe + 5c1beba commit 30c903e
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 13 deletions.
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

0 comments on commit 30c903e

Please sign in to comment.