summaryrefslogtreecommitdiff
path: root/platform/default/mbgl/storage/offline_schema.sql
blob: e55517c489cdfc515014d6e15003aac5caf1bd87 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
CREATE TABLE resources (                   -- Generic table for style, source, sprite, and glyph resources.
  url TEXT NOT NULL PRIMARY KEY,           -- Same schema as http_cache table.
  kind INTEGER NOT NULL,
  expires INTEGER,
  modified INTEGER,
  accessed INTEGER,
  etag TEXT,
  data BLOB,                               -- NULL if the response was a 404
  compressed INTEGER NOT NULL DEFAULT 0
);

CREATE TABLE tilesets (
  id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  url_template TEXT NOT NULL,           -- As it would appear in TileJSON (but no support for host sharding).
  pixel_ratio INTEGER,                  -- If NULL, 1 is assumed for raster sources.
  UNIQUE (url_template, pixel_ratio)    -- Capable of caching the same tileset at multiple resolutions.
);

CREATE TABLE tiles (
  tileset_id INTEGER NOT NULL REFERENCES tilesets(id),
  z INTEGER NOT NULL,                   -- Fully abandon TMS coordinates in favor of ZXY.
  x INTEGER NOT NULL,
  y INTEGER NOT NULL,
  expires INTEGER,
  modified INTEGER,
  accessed INTEGER,
  etag TEXT,
  data BLOB,                            -- NULL if the response was a 404
  compressed INTEGER NOT NULL DEFAULT 0,
  PRIMARY KEY (tileset_id, z, x, y)
);

CREATE TABLE regions (
  id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  definition TEXT NOT NULL,   -- JSON formatted definition of region. Regions may be of variant types:
                              -- e.g. bbox and zoom range, route path, flyTo parameters, etc. Note that
                              -- the set of tiles required for a region may span multiple sources.
  description BLOB            -- User provided data in user-defined format
);

CREATE TABLE region_resources (
  region_id INTEGER NOT NULL REFERENCES regions(id),
  resource_url TEXT NOT NULL REFERENCES resources(url),
  PRIMARY KEY (region_id, resource_url)
);

CREATE TABLE region_tiles (
  region_id INTEGER NOT NULL REFERENCES regions(id),
  tileset_id INTEGER NOT NULL REFERENCES tilesets(id),
  z INTEGER NOT NULL,
  x INTEGER NOT NULL,
  y INTEGER NOT NULL,
  PRIMARY KEY (region_id, tileset_id, z, x, y),
  FOREIGN KEY (tileset_id, z, x, y) REFERENCES tiles (tileset_id, z, x, y)
);

-- `region_resources` and `region_tiles` are used for deduplication and deletion logic.
-- A row in `tiles` exists IFF one or more corresponding rows exist in `region_tiles`. If
-- more than one corresponding row exists, it indicates multiple regions contain the tile, and
-- storage for the tile is being deduplicated. When a region is deleted, corresponding rows in
-- `region_tiles` must also be deleted, and then rows in `tiles` and `tilesets` without a
-- corresponding `region_tiles` row must be deleted. Similarly for `resources` / `region_resources`.