summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/hashserv/__init__.py
diff options
context:
space:
mode:
authorJoshua Watt <JPEWhacker@gmail.com>2023-11-03 08:26:25 -0600
committerRichard Purdie <richard.purdie@linuxfoundation.org>2023-11-09 17:33:02 +0000
commitbaa3e5391daf41b6dd6e914a112abb00d3517da1 (patch)
tree8280b21caf78db2783f586250776c4813f24cb87 /bitbake/lib/hashserv/__init__.py
parente90fccfefd7693d8cdfa731fa7e170c8bd4b1a1b (diff)
downloadpoky-baa3e5391daf41b6dd6e914a112abb00d3517da1.tar.gz
bitbake: hashserv: Abstract database
Abstracts the way the database backend is accessed by the hash equivalence server to make it possible to use other backends (Bitbake rev: 04b53deacf857488408bc82b9890b1e19874b5f1) Signed-off-by: Joshua Watt <JPEWhacker@gmail.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/hashserv/__init__.py')
-rw-r--r--bitbake/lib/hashserv/__init__.py90
1 files changed, 17 insertions, 73 deletions
diff --git a/bitbake/lib/hashserv/__init__.py b/bitbake/lib/hashserv/__init__.py
index 56b9c6bc82..90d8cff15f 100644
--- a/bitbake/lib/hashserv/__init__.py
+++ b/bitbake/lib/hashserv/__init__.py
@@ -6,7 +6,6 @@
6import asyncio 6import asyncio
7from contextlib import closing 7from contextlib import closing
8import re 8import re
9import sqlite3
10import itertools 9import itertools
11import json 10import json
12from urllib.parse import urlparse 11from urllib.parse import urlparse
@@ -19,92 +18,34 @@ ADDR_TYPE_UNIX = 0
19ADDR_TYPE_TCP = 1 18ADDR_TYPE_TCP = 1
20ADDR_TYPE_WS = 2 19ADDR_TYPE_WS = 2
21 20
22UNIHASH_TABLE_DEFINITION = (
23 ("method", "TEXT NOT NULL", "UNIQUE"),
24 ("taskhash", "TEXT NOT NULL", "UNIQUE"),
25 ("unihash", "TEXT NOT NULL", ""),
26)
27
28UNIHASH_TABLE_COLUMNS = tuple(name for name, _, _ in UNIHASH_TABLE_DEFINITION)
29
30OUTHASH_TABLE_DEFINITION = (
31 ("method", "TEXT NOT NULL", "UNIQUE"),
32 ("taskhash", "TEXT NOT NULL", "UNIQUE"),
33 ("outhash", "TEXT NOT NULL", "UNIQUE"),
34 ("created", "DATETIME", ""),
35
36 # Optional fields
37 ("owner", "TEXT", ""),
38 ("PN", "TEXT", ""),
39 ("PV", "TEXT", ""),
40 ("PR", "TEXT", ""),
41 ("task", "TEXT", ""),
42 ("outhash_siginfo", "TEXT", ""),
43)
44
45OUTHASH_TABLE_COLUMNS = tuple(name for name, _, _ in OUTHASH_TABLE_DEFINITION)
46
47def _make_table(cursor, name, definition):
48 cursor.execute('''
49 CREATE TABLE IF NOT EXISTS {name} (
50 id INTEGER PRIMARY KEY AUTOINCREMENT,
51 {fields}
52 UNIQUE({unique})
53 )
54 '''.format(
55 name=name,
56 fields=" ".join("%s %s," % (name, typ) for name, typ, _ in definition),
57 unique=", ".join(name for name, _, flags in definition if "UNIQUE" in flags)
58 ))
59
60
61def setup_database(database, sync=True):
62 db = sqlite3.connect(database)
63 db.row_factory = sqlite3.Row
64
65 with closing(db.cursor()) as cursor:
66 _make_table(cursor, "unihashes_v2", UNIHASH_TABLE_DEFINITION)
67 _make_table(cursor, "outhashes_v2", OUTHASH_TABLE_DEFINITION)
68
69 cursor.execute('PRAGMA journal_mode = WAL')
70 cursor.execute('PRAGMA synchronous = %s' % ('NORMAL' if sync else 'OFF'))
71
72 # Drop old indexes
73 cursor.execute('DROP INDEX IF EXISTS taskhash_lookup')
74 cursor.execute('DROP INDEX IF EXISTS outhash_lookup')
75 cursor.execute('DROP INDEX IF EXISTS taskhash_lookup_v2')
76 cursor.execute('DROP INDEX IF EXISTS outhash_lookup_v2')
77
78 # TODO: Upgrade from tasks_v2?
79 cursor.execute('DROP TABLE IF EXISTS tasks_v2')
80
81 # Create new indexes
82 cursor.execute('CREATE INDEX IF NOT EXISTS taskhash_lookup_v3 ON unihashes_v2 (method, taskhash)')
83 cursor.execute('CREATE INDEX IF NOT EXISTS outhash_lookup_v3 ON outhashes_v2 (method, outhash)')
84
85 return db
86
87 21
88def parse_address(addr): 22def parse_address(addr):
89 if addr.startswith(UNIX_PREFIX): 23 if addr.startswith(UNIX_PREFIX):
90 return (ADDR_TYPE_UNIX, (addr[len(UNIX_PREFIX):],)) 24 return (ADDR_TYPE_UNIX, (addr[len(UNIX_PREFIX) :],))
91 elif addr.startswith(WS_PREFIX) or addr.startswith(WSS_PREFIX): 25 elif addr.startswith(WS_PREFIX) or addr.startswith(WSS_PREFIX):
92 return (ADDR_TYPE_WS, (addr,)) 26 return (ADDR_TYPE_WS, (addr,))
93 else: 27 else:
94 m = re.match(r'\[(?P<host>[^\]]*)\]:(?P<port>\d+)$', addr) 28 m = re.match(r"\[(?P<host>[^\]]*)\]:(?P<port>\d+)$", addr)
95 if m is not None: 29 if m is not None:
96 host = m.group('host') 30 host = m.group("host")
97 port = m.group('port') 31 port = m.group("port")
98 else: 32 else:
99 host, port = addr.split(':') 33 host, port = addr.split(":")
100 34
101 return (ADDR_TYPE_TCP, (host, int(port))) 35 return (ADDR_TYPE_TCP, (host, int(port)))
102 36
103 37
104def create_server(addr, dbname, *, sync=True, upstream=None, read_only=False): 38def create_server(addr, dbname, *, sync=True, upstream=None, read_only=False):
39 def sqlite_engine():
40 from .sqlite import DatabaseEngine
41
42 return DatabaseEngine(dbname, sync)
43
105 from . import server 44 from . import server
106 db = setup_database(dbname, sync=sync) 45
107 s = server.Server(db, upstream=upstream, read_only=read_only) 46 db_engine = sqlite_engine()
47
48 s = server.Server(db_engine, upstream=upstream, read_only=read_only)
108 49
109 (typ, a) = parse_address(addr) 50 (typ, a) = parse_address(addr)
110 if typ == ADDR_TYPE_UNIX: 51 if typ == ADDR_TYPE_UNIX:
@@ -120,6 +61,7 @@ def create_server(addr, dbname, *, sync=True, upstream=None, read_only=False):
120 61
121def create_client(addr): 62def create_client(addr):
122 from . import client 63 from . import client
64
123 c = client.Client() 65 c = client.Client()
124 66
125 (typ, a) = parse_address(addr) 67 (typ, a) = parse_address(addr)
@@ -132,8 +74,10 @@ def create_client(addr):
132 74
133 return c 75 return c
134 76
77
135async def create_async_client(addr): 78async def create_async_client(addr):
136 from . import client 79 from . import client
80
137 c = client.AsyncClient() 81 c = client.AsyncClient()
138 82
139 (typ, a) = parse_address(addr) 83 (typ, a) = parse_address(addr)