diff options
Diffstat (limited to 'bitbake/lib/hashserv/__init__.py')
| -rw-r--r-- | bitbake/lib/hashserv/__init__.py | 66 |
1 files changed, 44 insertions, 22 deletions
diff --git a/bitbake/lib/hashserv/__init__.py b/bitbake/lib/hashserv/__init__.py index 5f2e101e52..9cb3fd57a5 100644 --- a/bitbake/lib/hashserv/__init__.py +++ b/bitbake/lib/hashserv/__init__.py | |||
| @@ -22,46 +22,68 @@ ADDR_TYPE_TCP = 1 | |||
| 22 | # is necessary | 22 | # is necessary |
| 23 | DEFAULT_MAX_CHUNK = 32 * 1024 | 23 | DEFAULT_MAX_CHUNK = 32 * 1024 |
| 24 | 24 | ||
| 25 | TABLE_DEFINITION = ( | 25 | UNIHASH_TABLE_DEFINITION = ( |
| 26 | ("method", "TEXT NOT NULL"), | 26 | ("method", "TEXT NOT NULL", "UNIQUE"), |
| 27 | ("outhash", "TEXT NOT NULL"), | 27 | ("taskhash", "TEXT NOT NULL", "UNIQUE"), |
| 28 | ("taskhash", "TEXT NOT NULL"), | 28 | ("unihash", "TEXT NOT NULL", ""), |
| 29 | ("unihash", "TEXT NOT NULL"), | 29 | ) |
| 30 | ("created", "DATETIME"), | 30 | |
| 31 | UNIHASH_TABLE_COLUMNS = tuple(name for name, _, _ in UNIHASH_TABLE_DEFINITION) | ||
| 32 | |||
| 33 | OUTHASH_TABLE_DEFINITION = ( | ||
| 34 | ("method", "TEXT NOT NULL", "UNIQUE"), | ||
| 35 | ("taskhash", "TEXT NOT NULL", "UNIQUE"), | ||
| 36 | ("outhash", "TEXT NOT NULL", "UNIQUE"), | ||
| 37 | ("created", "DATETIME", ""), | ||
| 31 | 38 | ||
| 32 | # Optional fields | 39 | # Optional fields |
| 33 | ("owner", "TEXT"), | 40 | ("owner", "TEXT", ""), |
| 34 | ("PN", "TEXT"), | 41 | ("PN", "TEXT", ""), |
| 35 | ("PV", "TEXT"), | 42 | ("PV", "TEXT", ""), |
| 36 | ("PR", "TEXT"), | 43 | ("PR", "TEXT", ""), |
| 37 | ("task", "TEXT"), | 44 | ("task", "TEXT", ""), |
| 38 | ("outhash_siginfo", "TEXT"), | 45 | ("outhash_siginfo", "TEXT", ""), |
| 39 | ) | 46 | ) |
| 40 | 47 | ||
| 41 | TABLE_COLUMNS = tuple(name for name, _ in TABLE_DEFINITION) | 48 | OUTHASH_TABLE_COLUMNS = tuple(name for name, _, _ in OUTHASH_TABLE_DEFINITION) |
| 49 | |||
| 50 | def _make_table(cursor, name, definition): | ||
| 51 | cursor.execute(''' | ||
| 52 | CREATE TABLE IF NOT EXISTS {name} ( | ||
| 53 | id INTEGER PRIMARY KEY AUTOINCREMENT, | ||
| 54 | {fields} | ||
| 55 | UNIQUE({unique}) | ||
| 56 | ) | ||
| 57 | '''.format( | ||
| 58 | name=name, | ||
| 59 | fields=" ".join("%s %s," % (name, typ) for name, typ, _ in definition), | ||
| 60 | unique=", ".join(name for name, _, flags in definition if "UNIQUE" in flags) | ||
| 61 | )) | ||
| 62 | |||
| 42 | 63 | ||
| 43 | def setup_database(database, sync=True): | 64 | def setup_database(database, sync=True): |
| 44 | db = sqlite3.connect(database) | 65 | db = sqlite3.connect(database) |
| 45 | db.row_factory = sqlite3.Row | 66 | db.row_factory = sqlite3.Row |
| 46 | 67 | ||
| 47 | with closing(db.cursor()) as cursor: | 68 | with closing(db.cursor()) as cursor: |
| 48 | cursor.execute(''' | 69 | _make_table(cursor, "unihashes_v2", UNIHASH_TABLE_DEFINITION) |
| 49 | CREATE TABLE IF NOT EXISTS tasks_v2 ( | 70 | _make_table(cursor, "outhashes_v2", OUTHASH_TABLE_DEFINITION) |
| 50 | id INTEGER PRIMARY KEY AUTOINCREMENT, | 71 | |
| 51 | %s | ||
| 52 | UNIQUE(method, outhash, taskhash) | ||
| 53 | ) | ||
| 54 | ''' % " ".join("%s %s," % (name, typ) for name, typ in TABLE_DEFINITION)) | ||
| 55 | cursor.execute('PRAGMA journal_mode = WAL') | 72 | cursor.execute('PRAGMA journal_mode = WAL') |
| 56 | cursor.execute('PRAGMA synchronous = %s' % ('NORMAL' if sync else 'OFF')) | 73 | cursor.execute('PRAGMA synchronous = %s' % ('NORMAL' if sync else 'OFF')) |
| 57 | 74 | ||
| 58 | # Drop old indexes | 75 | # Drop old indexes |
| 59 | cursor.execute('DROP INDEX IF EXISTS taskhash_lookup') | 76 | cursor.execute('DROP INDEX IF EXISTS taskhash_lookup') |
| 60 | cursor.execute('DROP INDEX IF EXISTS outhash_lookup') | 77 | cursor.execute('DROP INDEX IF EXISTS outhash_lookup') |
| 78 | cursor.execute('DROP INDEX IF EXISTS taskhash_lookup_v2') | ||
| 79 | cursor.execute('DROP INDEX IF EXISTS outhash_lookup_v2') | ||
| 80 | |||
| 81 | # TODO: Upgrade from tasks_v2? | ||
| 82 | cursor.execute('DROP TABLE IF EXISTS tasks_v2') | ||
| 61 | 83 | ||
| 62 | # Create new indexes | 84 | # Create new indexes |
| 63 | cursor.execute('CREATE INDEX IF NOT EXISTS taskhash_lookup_v2 ON tasks_v2 (method, taskhash, created)') | 85 | cursor.execute('CREATE INDEX IF NOT EXISTS taskhash_lookup_v3 ON unihashes_v2 (method, taskhash)') |
| 64 | cursor.execute('CREATE INDEX IF NOT EXISTS outhash_lookup_v2 ON tasks_v2 (method, outhash)') | 86 | cursor.execute('CREATE INDEX IF NOT EXISTS outhash_lookup_v3 ON outhashes_v2 (method, outhash)') |
| 65 | 87 | ||
| 66 | return db | 88 | return db |
| 67 | 89 | ||
