1
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% extends "base.html" %}
2
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% block title %}Query Runner — {{ project.name }} — Fossilrepo{% endblock %}
3
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
4
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% block content %}
5
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<h1 class="text-2xl font-bold text-gray-100 mb-2">{{ project.name }}</h1>
6
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% include "fossil/_project_nav.html" %}
7
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
8
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="mb-4">
9
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<a href="{% url 'fossil:explorer' slug=project.slug %}" class="text-sm text-brand-light hover:text-brand">← Back to Explorer</a>
10
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
11
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
12
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="flex items-center justify-between mb-4">
13
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div>
14
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<h2 class="text-xl font-bold text-gray-100">SQL Query Runner</h2>
15
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<p class="text-sm text-gray-500 mt-1">
16
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Execute read-only SELECT queries against the Fossil SQLite database. Results capped at 500 rows.
17
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</p>
18
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
19
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
20
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
21
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="grid grid-cols-1 lg:grid-cols-4 gap-6">
22
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<!-- Query input + results (3/4 width) -->
23
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="lg:col-span-3">
24
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<form method="get" action="{% url 'fossil:explorer_query' slug=project.slug %}">
25
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="rounded-lg bg-gray-800 border border-gray-700 overflow-hidden mb-4">
26
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="px-4 py-2 border-b border-gray-700">
27
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<label for="sql-input" class="text-xs font-medium text-gray-400 uppercase">SQL Query</label>
28
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
29
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<textarea
30
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
id="sql-input"
31
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
name="sql"
32
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
rows="5"
33
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
class="w-full bg-gray-900 text-gray-100 font-mono text-sm p-4 border-0 focus:ring-0 resize-y"
34
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
placeholder="SELECT * FROM blob LIMIT 10"
35
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
spellcheck="false">{{ sql }}</textarea>
36
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="px-4 py-2 border-t border-gray-700 flex items-center justify-between">
37
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<span class="text-xs text-gray-600">Only SELECT queries are allowed. No INSERT, UPDATE, DELETE, DROP, etc.</span>
38
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<button type="submit" class="inline-flex items-center px-4 py-1.5 text-sm font-medium rounded-md bg-brand text-white hover:bg-brand-hover">
39
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Run
40
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</button>
41
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
42
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
43
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</form>
44
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
45
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% if error %}
46
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="rounded-lg bg-red-900/30 border border-red-700 p-4 mb-4">
47
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<p class="text-sm text-red-300 font-mono">{{ error }}</p>
48
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
49
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% endif %}
50
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
51
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% if columns %}
52
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="rounded-lg bg-gray-800 border border-gray-700 overflow-x-auto">
53
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<table class="min-w-full divide-y divide-gray-700">
54
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<thead>
55
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<tr>
56
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% for col in columns %}
57
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<th class="px-4 py-3 text-left text-xs font-medium text-gray-400 uppercase tracking-wider whitespace-nowrap">{{ col }}</th>
58
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% endfor %}
59
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</tr>
60
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</thead>
61
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<tbody class="divide-y divide-gray-700 font-mono text-xs">
62
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% for row in results %}
63
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<tr class="hover:bg-gray-700/50">
64
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% for cell in row %}
65
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<td class="px-4 py-2 text-gray-300 whitespace-nowrap max-w-xs truncate">{{ cell|default:"NULL" }}</td>
66
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% endfor %}
67
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</tr>
68
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% endfor %}
69
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</tbody>
70
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</table>
71
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
72
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="mt-2 text-xs text-gray-500">
73
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{{ results|length }} row{{ results|length|pluralize }} returned{% if results|length >= 500 %} (limited to 500){% endif %}
74
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
75
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% elif sql and not error %}
76
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="rounded-lg bg-gray-800 border border-gray-700 p-8 text-center">
77
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<p class="text-sm text-gray-500">No results.</p>
78
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
79
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% endif %}
80
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
81
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
82
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<!-- Table list sidebar (1/4 width) -->
83
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="lg:col-span-1">
84
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="rounded-lg bg-gray-800 border border-gray-700 p-3 sticky top-6">
85
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<h3 class="text-xs font-medium text-gray-400 uppercase mb-2">Available Tables</h3>
86
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% if table_names %}
87
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<div class="space-y-0.5 max-h-96 overflow-y-auto">
88
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% for name in table_names %}
89
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<button
90
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
type="button"
91
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
onclick="document.getElementById('sql-input').value = 'SELECT * FROM {{ name }} LIMIT 25'; document.getElementById('sql-input').focus();"
92
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
class="block w-full text-left px-2 py-1 text-xs font-mono text-gray-400 hover:text-gray-200 hover:bg-gray-700 rounded">
93
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{{ name }}
94
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</button>
95
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% endfor %}
96
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
97
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% else %}
98
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
<p class="text-xs text-gray-600">Run a query to see tables, or go to the <a href="{% url 'fossil:explorer' slug=project.slug %}" class="text-brand-light hover:text-brand">Explorer</a>.</p>
99
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% endif %}
100
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
101
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
102
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
</div>
103
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
{% endblock %}
104
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!