3 import datasette.views.base
4 from datasette.database import Database
6 from .connectors import ConnectorList
8 connections = threading.local()
11 def patch_datasette():
13 Monkey patching for original Datasette
16 async def table_names(self):
18 return await self.original_table_names()
19 except sqlite3.DatabaseError:
20 return ConnectorList.table_names(self.path)
22 Database.original_table_names = Database.table_names
23 Database.table_names = table_names
26 async def hidden_table_names(self):
28 return await self.original_hidden_table_names()
29 except sqlite3.DatabaseError:
30 return ConnectorList.hidden_table_names(self.path)
32 Database.original_hidden_table_names = Database.hidden_table_names
33 Database.hidden_table_names = hidden_table_names
36 async def view_names(self):
38 return await self.original_view_names()
39 except sqlite3.DatabaseError:
40 return ConnectorList.view_names(self.path)
42 Database.original_view_names = Database.view_names
43 Database.view_names = view_names
46 async def table_columns(self, table):
48 return await self.original_table_columns(table)
49 except sqlite3.DatabaseError:
50 return ConnectorList.table_columns(self.path, table)
52 Database.original_table_columns = Database.table_columns
53 Database.table_columns = table_columns
56 async def primary_keys(self, table):
58 return await self.original_primary_keys(table)
59 except sqlite3.DatabaseError:
60 return ConnectorList.primary_keys(self.path, table)
62 Database.original_primary_keys = Database.primary_keys
63 Database.primary_keys = primary_keys
66 async def fts_table(self, table):
68 return await self.original_fts_table(table)
69 except sqlite3.DatabaseError:
70 return ConnectorList.fts_table(self.path, table)
72 Database.original_fts_table = Database.fts_table
73 Database.fts_table = fts_table
76 async def get_all_foreign_keys(self):
78 return await self.original_get_all_foreign_keys()
79 except sqlite3.DatabaseError:
80 return ConnectorList.get_all_foreign_keys(self.path)
82 Database.original_get_all_foreign_keys = Database.get_all_foreign_keys
83 Database.get_all_foreign_keys = get_all_foreign_keys
86 async def table_counts(self, *args, **kwargs):
87 counts = await self.original_table_counts(**kwargs)
88 # If all tables has None as counts, an error had ocurred
89 if len(list(filter(lambda table_count: table_count is not None, counts.values()))) == 0:
90 return ConnectorList.table_counts(self.path, *args, **kwargs)
92 Database.original_table_counts = Database.table_counts
93 Database.table_counts = table_counts