diff options
author | Joshua Watt <JPEWhacker@gmail.com> | 2023-11-03 08:26:25 -0600 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2023-11-09 17:33:02 +0000 |
commit | baa3e5391daf41b6dd6e914a112abb00d3517da1 (patch) | |
tree | 8280b21caf78db2783f586250776c4813f24cb87 /bitbake/lib/hashserv/__init__.py | |
parent | e90fccfefd7693d8cdfa731fa7e170c8bd4b1a1b (diff) | |
download | poky-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__.py | 90 |
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 @@ | |||
6 | import asyncio | 6 | import asyncio |
7 | from contextlib import closing | 7 | from contextlib import closing |
8 | import re | 8 | import re |
9 | import sqlite3 | ||
10 | import itertools | 9 | import itertools |
11 | import json | 10 | import json |
12 | from urllib.parse import urlparse | 11 | from urllib.parse import urlparse |
@@ -19,92 +18,34 @@ ADDR_TYPE_UNIX = 0 | |||
19 | ADDR_TYPE_TCP = 1 | 18 | ADDR_TYPE_TCP = 1 |
20 | ADDR_TYPE_WS = 2 | 19 | ADDR_TYPE_WS = 2 |
21 | 20 | ||
22 | UNIHASH_TABLE_DEFINITION = ( | ||
23 | ("method", "TEXT NOT NULL", "UNIQUE"), | ||
24 | ("taskhash", "TEXT NOT NULL", "UNIQUE"), | ||
25 | ("unihash", "TEXT NOT NULL", ""), | ||
26 | ) | ||
27 | |||
28 | UNIHASH_TABLE_COLUMNS = tuple(name for name, _, _ in UNIHASH_TABLE_DEFINITION) | ||
29 | |||
30 | OUTHASH_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 | |||
45 | OUTHASH_TABLE_COLUMNS = tuple(name for name, _, _ in OUTHASH_TABLE_DEFINITION) | ||
46 | |||
47 | def _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 | |||
61 | def 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 | ||
88 | def parse_address(addr): | 22 | def 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 | ||
104 | def create_server(addr, dbname, *, sync=True, upstream=None, read_only=False): | 38 | def 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 | ||
121 | def create_client(addr): | 62 | def 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 | |||
135 | async def create_async_client(addr): | 78 | async 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) |