home / github / issue_comments

Menu
  • Search all tables
  • GraphQL API

issue_comments: 1115262218

This data as json

html_url issue_url id node_id user created_at updated_at author_association body reactions issue performed_via_github_app
https://github.com/simonw/datasette/issues/1733#issuecomment-1115262218 https://api.github.com/repos/simonw/datasette/issues/1733 1115262218 IC_kwDOBm6k_c5CeY0K 9599 2022-05-02T19:11:51Z 2022-05-02T19:14:01Z OWNER

Here's the full diff I applied to Datasette to get it fully working in Pyodide:

https://github.com/simonw/datasette/compare/94a3171b01fde5c52697aeeff052e3ad4bab5391...8af32bc5b03c30b1f7a4a8cc4bd80eb7e2ee7b81

And as a visible diff:

```diff diff --git a/datasette/app.py b/datasette/app.py index d269372..6c0c5fc 100644 --- a/datasette/app.py +++ b/datasette/app.py @@ -15,7 +15,6 @@ import pkg_resources import re import secrets import sys -import threading import traceback import urllib.parse from concurrent import futures @@ -26,7 +25,6 @@ from itsdangerous import URLSafeSerializer from jinja2 import ChoiceLoader, Environment, FileSystemLoader, PrefixLoader from jinja2.environment import Template from jinja2.exceptions import TemplateNotFound -import uvicorn

from .views.base import DatasetteError, ureg from .views.database import DatabaseDownload, DatabaseView @@ -813,7 +811,6 @@ class Datasette: }, "datasette": datasette_version, "asgi": "3.0", - "uvicorn": uvicorn.version, "sqlite": { "version": sqlite_version, "fts_versions": fts_versions, @@ -854,23 +851,7 @@ class Datasette: ]

 def _threads(self):
  • threads = list(threading.enumerate())
  • d = {
  • "num_threads": len(threads),
  • "threads": [
  • {"name": t.name, "ident": t.ident, "daemon": t.daemon} for t in threads
  • ],
  • }
  • Only available in Python 3.7+

  • if hasattr(asyncio, "all_tasks"):
  • tasks = asyncio.all_tasks()
  • d.update(
  • {
  • "num_tasks": len(tasks),
  • "tasks": [_cleaner_task_str(t) for t in tasks],
  • }
  • )
  • return d
  • return {"num_threads": 0, "threads": []}

    def _actor(self, request): return {"actor": request.actor} diff --git a/datasette/database.py b/datasette/database.py index ba594a8..b50142d 100644 --- a/datasette/database.py +++ b/datasette/database.py @@ -4,7 +4,6 @@ from pathlib import Path import janus import queue import sys -import threading import uuid

from .tracer import trace @@ -21,8 +20,6 @@ from .utils import ( ) from .inspect import inspect_hash

-connections = threading.local()

AttachedDatabase = namedtuple("AttachedDatabase", ("seq", "name", "file"))

@@ -43,12 +40,12 @@ class Database: self.hash = None self.cached_size = None self._cached_table_counts = None - self._write_thread = None - self._write_queue = None if not self.is_mutable and not self.is_memory: p = Path(path) self.hash = inspect_hash(p) self.cached_size = p.stat().st_size + self._read_connection = None + self._write_connection = None

 @property
 def cached_table_counts(self):

@@ -134,60 +131,17 @@ class Database: return results

 async def execute_write_fn(self, fn, block=True):
  • task_id = uuid.uuid5(uuid.NAMESPACE_DNS, "datasette.io")
  • if self._write_queue is None:
  • self._write_queue = queue.Queue()
  • if self._write_thread is None:
  • self._write_thread = threading.Thread(
  • target=self._execute_writes, daemon=True
  • )
  • self._write_thread.start()
  • reply_queue = janus.Queue()
  • self._write_queue.put(WriteTask(fn, task_id, reply_queue))
  • if block:
  • result = await reply_queue.async_q.get()
  • if isinstance(result, Exception):
  • raise result
  • else:
  • return result
  • else:
  • return task_id

  • def _execute_writes(self):
  • Infinite looping thread that protects the single write connection

  • to this database

  • conn_exception = None
  • conn = None
  • try:
  • conn = self.connect(write=True)
  • self.ds._prepare_connection(conn, self.name)
  • except Exception as e:
  • conn_exception = e
  • while True:
  • task = self._write_queue.get()
  • if conn_exception is not None:
  • result = conn_exception
  • else:
  • try:
  • result = task.fn(conn)
  • except Exception as e:
  • sys.stderr.write("{}\n".format(e))
  • sys.stderr.flush()
  • result = e
  • task.reply_queue.sync_q.put(result)
  • We always treat it as if block=True now

  • if self._write_connection is None:
  • self._write_connection = self.connect(write=True)
  • self.ds._prepare_connection(self._write_connection, self.name)
  • return fn(self._write_connection)

    async def execute_fn(self, fn): - def in_thread(): - conn = getattr(connections, self.name, None) - if not conn: - conn = self.connect() - self.ds._prepare_connection(conn, self.name) - setattr(connections, self.name, conn) - return fn(conn) - - return await asyncio.get_event_loop().run_in_executor( - self.ds.executor, in_thread - ) + if self._read_connection is None: + self._read_connection = self.connect() + self.ds._prepare_connection(self._read_connection, self.name) + return fn(self._read_connection)

    async def execute( self, diff --git a/setup.py b/setup.py index 7f0562f..c41669c 100644 --- a/setup.py +++ b/setup.py @@ -44,20 +44,20 @@ setup( install_requires=[ "asgiref>=3.2.10,<3.6.0", "click>=7.1.1,<8.2.0", - "click-default-group~=1.2.2", + # "click-default-group~=1.2.2", "Jinja2>=2.10.3,<3.1.0", "hupper~=1.9", "httpx>=0.20", "pint~=0.9", "pluggy>=1.0,<1.1", - "uvicorn~=0.11", + # "uvicorn~=0.11", "aiofiles>=0.4,<0.9", "janus>=0.6.2,<1.1", "asgi-csrf>=0.9", "PyYAML>=5.3,<7.0", "mergedeep>=1.1.1,<1.4.0", "itsdangerous>=1.1,<3.0", - "python-baseconv==1.2.2", + # "python-baseconv==1.2.2", ], entry_points=""" [console_scripts] ```

{
    "total_count": 0,
    "+1": 0,
    "-1": 0,
    "laugh": 0,
    "hooray": 0,
    "confused": 0,
    "heart": 0,
    "rocket": 0,
    "eyes": 0
}
1223234932  
Powered by Datasette · Queries took 1.137ms · About: github-to-sqlite