File: dbschema.txt

package info (click to toggle)
libgnatcoll-db 18-4
  • links: PTS
  • area: main
  • in suites: buster
  • size: 2,268 kB
  • sloc: ada: 23,786; python: 2,166; makefile: 486; sh: 34; ansic: 18
file content (168 lines) | stat: -rw-r--r-- 15,071 bytes parent folder | download | duplicates (5)
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
# for Emacs: -*- mode: org; mode: flyspell; fill-column: 79 -*-

# The database schema version is stored in sqlite's "PRAGMA user_version",
# which is faster to access than a specific table.

| TABLE    | files         | file            |   | Stores the list of source and LI files                                                   |
|----------+---------------+-----------------+---+------------------------------------------------------------------------------------------|
| id       | AUTOINCREMENT | PK              |   |                                                                                          |
| path     | TEXT          | NOT NULL, INDEX, NOCASE |   | Full normalized absolute path for the file. Casing is not normalized                     |
| stamp    | timestamp     | NULL            |   | The timestamp the last time the file was read (only set for LI files for efficiency)     |
| language | TEXT          | NOT NULL        |   | The language for this file (so that we can limit queries to specific languages), or "li" |
| project  | FK files()    | NULL            |   | V2.0: The project to which a source file belongs. With aggregate projects, a source file might occur several times in this table, each time with a different project. |

| TABLE | f2f_kind      |          |   | All kinds of file relationships |
|-------+---------------+----------+---+---------------------------------|
| id    | AUTOINCREMENT | PK       |   |                                 |
| name  | TEXT          | NOT NULL |   |                                 |

# No unique constraint error for (fromFile, toFile, kind), since a given source
# file might for instance have multiple ALI files if it contains multiple Ada
# units.
# 'is_array' is mostly used by the debugger to know whether the user should be
# able to dereference the variable.

| TABLE    | f2f                   |                   |   | Stores relationships between files |
|----------+-----------------------+-------------------+---+------------------------------------|
| fromFile | FK files(links)       | NOT NULL, NOINDEX, PK |   |                                    |
| toFile   | FK files(linked_from) | NOT NULL, NOINDEX, PK |   |                                    |
| kind     | FK f2f_kind()         | NOT NULL, NOINDEX, PK |   | Kind of dependency                 |

| TABLE                    | entity_kinds | entity_kinds      |       | General kinds for entities (their metaclasses) |
|--------------------------+--------------+-------------------+-------+------------------------------------------------|
| id                       | CHARACTER(1) | PK                |       |                                                |
| display                  | TEXT         | NOT NULL, NOINDEX |       | How to display this entity kind                |
| is_subprogram            | BOOLEAN      | NOINDEX           | false |                                                |
| is_container             | BOOLEAN      | NOINDEX           | false |                                                |
| body_is_full_declaration | BOOLEAN      | NOINDEX           | false |                                                |
| is_abstract              | BOOLEAN      | NOINDEX           | false |                                                |
| is_generic               | BOOLEAN      | NOINDEX           | false |                                                |
| is_access                | BOOLEAN      | NOINDEX           | false |                                                |
| is_type                  | BOOLEAN      | NOINDEX           | false |                                                |
| is_printable_in_gdb      | BOOLEAN      | NOINDEX           | false |                                                |
| is_array                 | BOOLEAN      | NOINDEX           | false |                                                |
| has_methods              | BOOLEAN      | NOINDEX           | false |                                                |

# An entity is known by its name and the location of its declaration. An entry
# in this table cannot exist without a corresponding declaration. To make
# queries faster (when loading ALI files), we thus store the declaration
# directly in this table, rather than as a reference. This speeds up the check
# whether an entity already exists in the table, and removes one INSERT when
# we need to create the entity.
#
# ALI files do not provide the closure of the needed entities: for instance,
# an entity A might be an instantiation of a generic entity B. But all the
# ALI file provides is the file and line where B is declared, not its column.
# In addition, B does not necessarily appear in a.ali. So we need a forward
# declaration for B (since we don't know its name, we insert a new unnamed entity
# at the given line and column -1). We'll try to complete it when b.ali is
# parsed eventually.
#
# Indexes: we tried two indexes: idx1 on name,decl_file,decl_line,decl_column,
# and idx2 on decl_file,decl_line,decl_column.
# Testing with two queries Find_Predefined_Entity (ie using name) and
# Find_Entity_From_Decl (ie only loc):
#                  |    predefined          |  form_decl
#  ----------------+------------------------+----------------------
#    idx1 + idx2   | covering idx1 (~1row)  |  idx2 (~2rows)
#    idx1          | covering idx1 (~1row)  |  scan (~238rows)
#    idx2          | idx2 (~2rows)          |  idx2 (~2rows)
#    no index      | scan (~23rows)         |  scan (~238rows)
# So having only idx2 seems a good compromise (single index is faster at creation)

| TABLE           | entities                        | entity                    |       |                                                                  |
|-----------------+---------------------------------+---------------------------+-------+------------------------------------------------------------------|
| id              | AUTOINCREMENT                   | PK                        |       |                                                                  |
| name            | TEXT                            | NOT NULL, NOINDEX, NOCASE |       | Can be empty for forward decls (see above). Must be UTF-8        |
| kind            | FK entity_kinds()               | NOT NULL, NOINDEX         |       | The E_Kind for this entity                                       |
| decl_file       | FK files(references)            | NOT NULL, NOINDEX         |       | Set to -1 for a predefined entity                                |
| decl_line       | INTEGER                         | NOT NULL, NOINDEX         |       | Set to -1 for a predefined entity                                |
| decl_column     | INTEGER                         | NOT NULL, NOINDEX         |       | Set to -1 for a predefined entity                                |
| decl_caller     | FK entities                     | NULL, NOINDEX             |       | Parent entity                                                    |
| mangled_name    | TEXT                            | NULL                      |       | Mangled name of the entity, if applicable                        |
| exported        | BOOLEAN                         | NOT NULL, NOINDEX         | false | Whether the mangled name is an export or an import of the entity |
| is_global       | BOOLEAN                         | NOT NULL, NOINDEX         | false | Whether this is a global entity (library-level in Ada)           |
| is_static_local | BOOLEAN                         | NOT NULL, NOINDEX         | false | Whether this is a 'static' variable in C/C++                     |
|-----------------+---------------------------------+---------------------------+-------+------------------------------------------------------------------|
| INDEX:          | decl_file,decl_line,decl_column | entity_loc                |       | Needed during parse                                              |
| INDEX:          | decl_caller                     | entity_decl_caller        |       |                                                                  |

# Store links between entities.
# For instance, pointer to the parent types, pointed type, returned type,
# renames, primitive operations, instantiation_Of, parameters
#   - Called_Entities: not stored here, it is enough to search the
#     References table using the caller information

| TABLE | e2e_kind      |                   |   | Links between entities |
|-------+---------------+-------------------+---+------------------------|
| id    | AUTOINCREMENT | PK                |   |                        |
| name  | TEXT          | NOT NULL, NOINDEX |   |                        |

# entity-to-entity relationships.
# We cannot have a (fromEntity, toEntity, kind) primary key, because in some
# cases the relationships will be duplicated (for instance, the .gli format for
# C files sometimes improperly record columns for entities. Thus a C subprogram
# might appear to have the same parameter multiple times, although in reality
# each parameter is different but just appears to be on the same column):
#    37V31*gnu_dev_makedev{long long unsigned int} 55>1 55>1 55b1 60t1
#    55m1 __major{unsigned int}
#    55m1 __minor{unsigned int} 57r12

| TABLE      | e2e                      |                   |   |                                                                              |
|------------+--------------------------+-------------------+---+------------------------------------------------------------------------------|
| fromEntity | FK entities(links)       | NOT NULL, NOINDEX, PK |   |                                                                              |
| toEntity   | FK entities(linked_from) | NOT NULL, NOINDEX, PK |   |                                                                              |
| kind       | FK e2e_kind()            | NOT NULL, NOINDEX, PK |   | The type of link.                                                            |
| order_by   | INTEGER                  | NOT NULL, NOINDEX | 1 | Ordering among the references. Used for instance for subprogram parameters   |
|------------+--------------------------+-------------------+---+------------------------------------------------------------------------------|
| INDEX:     | "fromEntity"             | e2e_from          |   | Not needed during parsing                                                    |
| INDEX:     | "toEntity"               | e2e_to            |   | Not needed during parsing                                                    |

| TABLE             | reference_kinds | reference_kind   |       | Kind of references                                      |
|-------------------+-----------------+------------------+-------+---------------------------------------------------------|
| id                | CHARACTER(1)    | PK               |       | The character found in the ALI file                     |
| display           | TEXT            | NOT NULL,NOINDEX |       | Label to display the reference                          |
| is_real           | BOOLEAN         | NOINDEX          | true  | Whether the name of the entity appears at that location |
| is_read           | BOOLEAN         | NOINDEX          | false |                                                         |
| is_write          | BOOLEAN         | NOINDEX          | false |                                                         |
| is_end            | BOOLEAN         | NOINDEX          | false | Whether this marks the end of a scope (spec or body)    |
| show_in_callgraph | BOOLEAN         | NOINDEX          | true  | Whether this ref. should be shown in the call graph     |
| is_dispatching    | BOOLEAN         | NOINDEX          | false | Whether this is a dispatching call                      |
| is_implicit       | BOOLEAN         | NOINDEX          | false |                                                         |

# We store instantiations as a string for now: currently, they are only used to
# display tooltips in GPS as to where an entity comes from. This can easily be
# parsed from the string. But the string also makes it easy to find all
# references from the same instance as the one the user clicked on, which would
# be harder (and slower) to do if we stored the instances in a separate table,
# where each instance potentially points to its parent.
# The format is "file1|line1 file2|line2 ..." where file1|line1 is itself
# instantiated at file2|line2.
#
# This table might contain duplicates (for instance from .gli files). It is
# also possible that a given location is duplicated with different kinds, for
# instance the argument for an "in out" parameter has both a "read" and
# "modified" entries.
#
# Indexes: we have an index on "file". We used to have one on
# "file,line,column" instead. In practice, "explain query plan" shows that both
# have roughly the same performance on the DELETE query used to cleanup
# references when updating an ALI file, and on the SELECT query to find which
# entity occurs at a given location. However, the database is slightly smaller,
# and the generation of the index slightly faster, when only storing the file
# in the index.

| TABLE              | entity_refs             | entity_ref         |   |                                                     |
|--------------------+-------------------------+--------------------+---+-----------------------------------------------------|
| entity             | FK entities(references) | NOT NULL, NOINDEX  |   | The entity to which we have a reference             |
| file               | FK files(references)    | NOT NULL, NOINDEX  |   |                                                     |
| line               | INTEGER                 | NOT NULL, NOINDEX  |   |                                                     |
| column             | INTEGER                 | NOT NULL, NOINDEX  |   |                                                     |
| kind               | FK reference_kinds()    | NOT NULL, NOINDEX  |   | Type of reference (same letter as in ALI files)     |
| caller             | FK entities(calling)    | NULL, NOINDEX      |   | Enclosing entity at that location                   |
| from_instantiation | TEXT                    | NOINDEX            |   | Instances in which the ref occurs                   |
|--------------------+-------------------------+--------------------+---+-----------------------------------------------------|
| INDEX:             | "file"                  | entity_refs_file   |   | Needed during parsing to cleanup outdated ALI files |
| INDEX:             | "entity"                | entity_refs_entity |   | Not needed during parsing                           |
| INDEX:             | line,"column"           | entity_refs_loc    |   | Not needed during parsing                           |
| INDEX:             | caller                  | refs_caller        |   |                                                     |