kopia lustrzana https://github.com/simonw/datasette
				
				
				
			Show SQL query when reporting time limit error, closes #1819
							rodzic
							
								
									212137a90b
								
							
						
					
					
						commit
						5f9f567acb
					
				| 
						 | 
				
			
			@ -476,7 +476,10 @@ class WriteTask:
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
class QueryInterrupted(Exception):
 | 
			
		||||
    pass
 | 
			
		||||
    def __init__(self, e, sql, params):
 | 
			
		||||
        self.e = e
 | 
			
		||||
        self.sql = sql
 | 
			
		||||
        self.params = params
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class MultipleValues(Exception):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,10 +1,12 @@
 | 
			
		|||
import asyncio
 | 
			
		||||
import csv
 | 
			
		||||
import hashlib
 | 
			
		||||
import re
 | 
			
		||||
import sys
 | 
			
		||||
import textwrap
 | 
			
		||||
import time
 | 
			
		||||
import urllib
 | 
			
		||||
from markupsafe import escape
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import pint
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -24,11 +26,9 @@ from datasette.utils import (
 | 
			
		|||
    path_with_removed_args,
 | 
			
		||||
    path_with_format,
 | 
			
		||||
    sqlite3,
 | 
			
		||||
    HASH_LENGTH,
 | 
			
		||||
)
 | 
			
		||||
from datasette.utils.asgi import (
 | 
			
		||||
    AsgiStream,
 | 
			
		||||
    Forbidden,
 | 
			
		||||
    NotFound,
 | 
			
		||||
    Response,
 | 
			
		||||
    BadRequest,
 | 
			
		||||
| 
						 | 
				
			
			@ -371,13 +371,18 @@ class DataView(BaseView):
 | 
			
		|||
                ) = response_or_template_contexts
 | 
			
		||||
            else:
 | 
			
		||||
                data, extra_template_data, templates = response_or_template_contexts
 | 
			
		||||
        except QueryInterrupted:
 | 
			
		||||
        except QueryInterrupted as ex:
 | 
			
		||||
            raise DatasetteError(
 | 
			
		||||
                textwrap.dedent(
 | 
			
		||||
                    """
 | 
			
		||||
                SQL query took too long. The time limit is controlled by the
 | 
			
		||||
                <p>SQL query took too long. The time limit is controlled by the
 | 
			
		||||
                <a href="https://docs.datasette.io/en/stable/settings.html#sql-time-limit-ms">sql_time_limit_ms</a>
 | 
			
		||||
                configuration option.
 | 
			
		||||
            """,
 | 
			
		||||
                configuration option.</p>
 | 
			
		||||
                <pre>{}</pre>
 | 
			
		||||
            """.format(
 | 
			
		||||
                        escape(ex.sql)
 | 
			
		||||
                    )
 | 
			
		||||
                ).strip(),
 | 
			
		||||
                title="SQL Interrupted",
 | 
			
		||||
                status=400,
 | 
			
		||||
                message_is_html=True,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -656,7 +656,17 @@ def test_custom_sql(app_client):
 | 
			
		|||
def test_sql_time_limit(app_client_shorter_time_limit):
 | 
			
		||||
    response = app_client_shorter_time_limit.get("/fixtures.json?sql=select+sleep(0.5)")
 | 
			
		||||
    assert 400 == response.status
 | 
			
		||||
    assert "SQL Interrupted" == response.json["title"]
 | 
			
		||||
    assert response.json == {
 | 
			
		||||
        "ok": False,
 | 
			
		||||
        "error": (
 | 
			
		||||
            "<p>SQL query took too long. The time limit is controlled by the\n"
 | 
			
		||||
            '<a href="https://docs.datasette.io/en/stable/settings.html#sql-time-limit-ms">sql_time_limit_ms</a>\n'
 | 
			
		||||
            "configuration option.</p>\n"
 | 
			
		||||
            "<pre>select sleep(0.5)</pre>"
 | 
			
		||||
        ),
 | 
			
		||||
        "status": 400,
 | 
			
		||||
        "title": "SQL Interrupted",
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def test_custom_sql_time_limit(app_client):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -168,9 +168,13 @@ def test_disallowed_custom_sql_pragma(app_client):
 | 
			
		|||
def test_sql_time_limit(app_client_shorter_time_limit):
 | 
			
		||||
    response = app_client_shorter_time_limit.get("/fixtures?sql=select+sleep(0.5)")
 | 
			
		||||
    assert 400 == response.status
 | 
			
		||||
    expected_html_fragment = """
 | 
			
		||||
    expected_html_fragments = [
 | 
			
		||||
        """
 | 
			
		||||
        <a href="https://docs.datasette.io/en/stable/settings.html#sql-time-limit-ms">sql_time_limit_ms</a>
 | 
			
		||||
    """.strip()
 | 
			
		||||
    """.strip(),
 | 
			
		||||
        "<pre>select sleep(0.5)</pre>",
 | 
			
		||||
    ]
 | 
			
		||||
    for expected_html_fragment in expected_html_fragments:
 | 
			
		||||
        assert expected_html_fragment in response.text
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Ładowanie…
	
		Reference in New Issue