Initial commit
This commit is contained in:
commit
42b004c664
|
@ -0,0 +1,15 @@
|
||||||
|
.vscode/*
|
||||||
|
|
||||||
|
[._]*.s[a-v][a-z]
|
||||||
|
[._]*.sw[a-p]
|
||||||
|
[._]s[a-rt-v][a-z]
|
||||||
|
[._]ss[a-gi-z]
|
||||||
|
[._]sw[a-p]
|
||||||
|
Session.vim
|
||||||
|
Sessionx.vim
|
||||||
|
.netrwhist
|
||||||
|
*~
|
||||||
|
tags
|
||||||
|
[._]*.un~
|
||||||
|
|
||||||
|
*.sqlite
|
|
@ -0,0 +1,85 @@
|
||||||
|
# RFC 5545 (iCalendar) parser
|
||||||
|
# ~lucidiot, 2023
|
||||||
|
|
||||||
|
# iCalendar (.ics) files contain a series of components delimited by BEGIN:<type> and END:<type>.
|
||||||
|
# Each component can have properties. Each property has a name and a value.
|
||||||
|
# Each property may have some optional key/value parameters:
|
||||||
|
# THING;PARAM1=VALUE1;PARAM2=VALUE2:CONTENT
|
||||||
|
# Parameters may have a list of values instead of just one parameter value:
|
||||||
|
# THING;PARAM=VAL1,VAL2,VAL3,"VAL4,WITH,COMMAS":CONTENT
|
||||||
|
# We do parse the parameter syntax here, but they will in the end only be stored as a single string.
|
||||||
|
|
||||||
|
|
||||||
|
# Remove any final newlines as this would appear to us as an empty line
|
||||||
|
rtrimstr("\n")
|
||||||
|
| rtrimstr("\r")
|
||||||
|
# Lines are supposed to end after 75 characters. Adding a space at the beginning of the next line
|
||||||
|
# means that the next line is really just part of the previous line, so we remove those extra
|
||||||
|
# line breaks to merge every line.
|
||||||
|
| gsub("\r?\n "; "")
|
||||||
|
# Iterate on each line.
|
||||||
|
| reduce split("\n")[] as $item (
|
||||||
|
# Initial state of the parser
|
||||||
|
{
|
||||||
|
# Placeholder for the root component of this file.
|
||||||
|
# The _type will be filled in with the type specified in BEGIN:<type>.
|
||||||
|
# "_" is not an allowed character in property names, so we can use it for our own purposes.
|
||||||
|
"root": {"_type": null},
|
||||||
|
# Path within this state where the parser is currently inserting new properties.
|
||||||
|
# This is used to keep track of where we are in the hierarchy when parsing nested components.
|
||||||
|
"current_path": ["root"]
|
||||||
|
};
|
||||||
|
. as $state
|
||||||
|
| (
|
||||||
|
$item
|
||||||
|
# Parse a whole line as { name: "...", param: "..." (or null), value: "..." }
|
||||||
|
| capture("^(?'name'[a-zA-Z0-9-]+)(?:;(?'params'[a-zA-Z0-9-]+=(?:\"[^[:cntrl:]\"]*\"|[^[:cntrl:]\",;:]*)(?:,(?:\"[^[:cntrl:]\"]*\"|[^[:cntrl:]\",;:]*))*(?:;[a-zA-Z0-9-]+=(?:\"[^[:cntrl:]\"]*\"|[^[:cntrl:]\",;:]*)(?:,(?:\"[^[:cntrl:]\"]*\"|[^[:cntrl:]\",;:]*))*)*))?:(?'value'[^[:cntrl:]]*)\r?$")
|
||||||
|
) as {$name, $params, $value}
|
||||||
|
# Property names should be case-insensitive, we will use lowercase everywhere
|
||||||
|
| ($name | ascii_downcase) as $name
|
||||||
|
| $state
|
||||||
|
| if .current_path[0] != "root" then
|
||||||
|
# If we get any line after an `END:` that was meant for the root component,
|
||||||
|
# the current_path will be set to []. We should not allow parsing anything else.
|
||||||
|
error("Unexpected end of root component")
|
||||||
|
elif getpath([.current_path[], "_type"]) == null then
|
||||||
|
# When the type was not yet filled in, we are expecting a BEGIN for the root component.
|
||||||
|
if $name == "begin" then
|
||||||
|
setpath([.current_path[], "_type"]; $value)
|
||||||
|
else
|
||||||
|
error("Expected BEGIN, got \($name)")
|
||||||
|
end
|
||||||
|
elif $name == "begin" then
|
||||||
|
# This BEGIN: declares a nested component.
|
||||||
|
# When we are somewhere other than the root component, we will never get a `null` type
|
||||||
|
# because we can set it as soon as we get here; so we know that the above branch only
|
||||||
|
# runs for the root component and we are always working with nested components.
|
||||||
|
# We will nest components under an array called `_components`.
|
||||||
|
# We therefore add to our paths the `_components` key, and then the index of this new
|
||||||
|
# component. The length of the array matches the last index of the array + 1, so this
|
||||||
|
# will append our new component at the end of the list.
|
||||||
|
.current_path += ["_components", ((getpath(.current_path)._components // []) | length)]
|
||||||
|
# Add the new component now at our new path with the type from the BEGIN:<type>.
|
||||||
|
| setpath(.current_path; {"_type": $value})
|
||||||
|
elif $name == "end" then
|
||||||
|
# Handle an END by checking that its type matches the type we are working with now,
|
||||||
|
# and going back up in the structure by removing the array index and the `_components` from the path.
|
||||||
|
if $value == getpath([.current_path[], "_type"]) then
|
||||||
|
.current_path |= .[:-2]
|
||||||
|
else
|
||||||
|
error("Unexpected end of \($value) component while in a \(getpath([.current_path[], "_type"])) component")
|
||||||
|
end
|
||||||
|
else
|
||||||
|
# This is not any special case, so we will just set a property.
|
||||||
|
# Since some properties could have multiple values for the same set of parameters
|
||||||
|
# and multiple sets of parameters for the same name, we structure the output like this:
|
||||||
|
# { "name": {"parameters": ["value1", "value2"] } }
|
||||||
|
# When there are no parameters, we will use the "" key.
|
||||||
|
setpath(
|
||||||
|
[.current_path[], $name, ($params // "")];
|
||||||
|
(getpath([.current_path[], $name, ($params // "")]) // []) + [$value]
|
||||||
|
)
|
||||||
|
end
|
||||||
|
)
|
||||||
|
# Return the parsed calendar from our parser's state.
|
||||||
|
| .root
|
|
@ -0,0 +1,292 @@
|
||||||
|
PRAGMA foreign_keys = OFF;
|
||||||
|
BEGIN TRANSACTION;
|
||||||
|
|
||||||
|
INSERT INTO library (name) VALUES
|
||||||
|
('Abbaye-les-Bains'),
|
||||||
|
('Alliance'),
|
||||||
|
('Arlequin'),
|
||||||
|
('Bibliothèque d''étude et du patrimoine'),
|
||||||
|
('Kateb Yacine'),
|
||||||
|
('Bibliothèque municipale internationale'),
|
||||||
|
('Centre-Ville'),
|
||||||
|
('Eaux-Claires'),
|
||||||
|
('Fonds commun'),
|
||||||
|
('Jardin de Ville'),
|
||||||
|
('Saint-Bruno'),
|
||||||
|
('Tesseire-Malherbe'),
|
||||||
|
('Archives municipales'),
|
||||||
|
('Musée de Grenoble');
|
||||||
|
|
||||||
|
INSERT INTO weekdays (dow, name) VALUES
|
||||||
|
(0, 'Dimanche'),
|
||||||
|
(1, 'Lundi'),
|
||||||
|
(2, 'Mardi'),
|
||||||
|
(3, 'Mercredi'),
|
||||||
|
(4, 'Jeudi'),
|
||||||
|
(5, 'Vendredi'),
|
||||||
|
(6, 'Samedi');
|
||||||
|
|
||||||
|
INSERT INTO schedule (library, dow, holidays, start, end) VALUES
|
||||||
|
('Bibliothèque d''étude et du patrimoine', 2, FALSE, '10:00:00', '19:00:00'),
|
||||||
|
('Bibliothèque d''étude et du patrimoine', 3, FALSE, '10:00:00', '19:00:00'),
|
||||||
|
('Bibliothèque d''étude et du patrimoine', 4, FALSE, '13:00:00', '19:00:00'),
|
||||||
|
('Bibliothèque d''étude et du patrimoine', 5, FALSE, '10:00:00', '19:00:00'),
|
||||||
|
('Bibliothèque d''étude et du patrimoine', 6, FALSE, '10:00:00', '18:00:00'),
|
||||||
|
('Bibliothèque d''étude et du patrimoine', 2, TRUE, '13:00:00', '18:00:00'),
|
||||||
|
('Bibliothèque d''étude et du patrimoine', 3, TRUE, '13:00:00', '18:00:00'),
|
||||||
|
('Bibliothèque d''étude et du patrimoine', 4, TRUE, '13:00:00', '18:00:00'),
|
||||||
|
('Bibliothèque d''étude et du patrimoine', 5, TRUE, '13:00:00', '18:00:00'),
|
||||||
|
('Bibliothèque d''étude et du patrimoine', 6, TRUE, '13:00:00', '18:00:00'),
|
||||||
|
('Bibliothèque municipale internationale', 2, FALSE, '17:00:00', '19:00:00'),
|
||||||
|
('Bibliothèque municipale internationale', 3, FALSE, '13:00:00', '18:00:00'),
|
||||||
|
('Bibliothèque municipale internationale', 4, FALSE, '17:00:00', '19:00:00'),
|
||||||
|
('Bibliothèque municipale internationale', 5, FALSE, '17:00:00', '19:00:00'),
|
||||||
|
('Bibliothèque municipale internationale', 6, NULL, '10:00:00', '13:00:00'),
|
||||||
|
('Bibliothèque municipale internationale', 6, FALSE, '14:00:00', '17:00:00'),
|
||||||
|
('Bibliothèque municipale internationale', 2, TRUE, '14:00:00', '18:00:00'),
|
||||||
|
('Bibliothèque municipale internationale', 3, TRUE, '14:00:00', '18:00:00'),
|
||||||
|
('Bibliothèque municipale internationale', 4, TRUE, '14:00:00', '18:00:00'),
|
||||||
|
('Bibliothèque municipale internationale', 5, TRUE, '14:00:00', '18:00:00'),
|
||||||
|
('Abbaye-les-Bains', 2, NULL, '13:00:00', '18:30:00'),
|
||||||
|
('Abbaye-les-Bains', 3, NULL, '10:00:00', '13:00:00'),
|
||||||
|
('Abbaye-les-Bains', 3, NULL, '14:00:00', '18:00:00'),
|
||||||
|
('Abbaye-les-Bains', 4, NULL, '09:00:00', '12:00:00'),
|
||||||
|
('Abbaye-les-Bains', 5, NULL, '13:00:00', '18:30:00'),
|
||||||
|
('Abbaye-les-Bains', 6, NULL, '10:00:00', '13:00:00'),
|
||||||
|
('Abbaye-les-Bains', 6, NULL, '14:00:00', '18:00:00'),
|
||||||
|
('Archives municipales', 1, NULL, '13:00:00', '17:00:00'),
|
||||||
|
('Archives municipales', 2, NULL, '13:00:00', '17:00:00'),
|
||||||
|
('Archives municipales', 3, NULL, '13:00:00', '17:00:00'),
|
||||||
|
('Archives municipales', 4, NULL, '09:00:00', '12:30:00'),
|
||||||
|
('Archives municipales', 5, NULL, '09:00:00', '12:30:00'),
|
||||||
|
('Musée de Grenoble', 1, NULL, '14:00:00', '18:00:00'),
|
||||||
|
('Musée de Grenoble', 3, NULL, '14:00:00', '18:00:00'),
|
||||||
|
('Musée de Grenoble', 4, NULL, '14:00:00', '18:00:00'),
|
||||||
|
('Musée de Grenoble', 5, NULL, '14:00:00', '18:00:00'),
|
||||||
|
('Kateb Yacine', 2, NULL, '11:00:00', '18:30:00'),
|
||||||
|
('Kateb Yacine', 3, NULL, '11:00:00', '18:30:00'),
|
||||||
|
('Kateb Yacine', 4, NULL, '11:00:00', '18:30:00'),
|
||||||
|
('Kateb Yacine', 5, NULL, '11:00:00', '18:30:00'),
|
||||||
|
('Kateb Yacine', 6, NULL, '11:00:00', '18:30:00'),
|
||||||
|
('Centre-Ville', 2, NULL, '11:00:00', '18:30:00'),
|
||||||
|
('Centre-Ville', 3, NULL, '11:00:00', '18:30:00'),
|
||||||
|
('Centre-Ville', 4, NULL, '11:00:00', '18:30:00'),
|
||||||
|
('Centre-Ville', 5, NULL, '11:00:00', '18:30:00'),
|
||||||
|
('Centre-Ville', 6, NULL, '11:00:00', '18:30:00'),
|
||||||
|
('Alliance', 2, NULL, '14:00:00', '19:00:00'),
|
||||||
|
('Alliance', 3, NULL, '10:00:00', '13:00:00'),
|
||||||
|
('Alliance', 3, NULL, '14:00:00', '18:00:00'),
|
||||||
|
('Alliance', 6, NULL, '10:00:00', '13:00:00'),
|
||||||
|
('Alliance', 6, NULL, '14:00:00', '18:00:00'),
|
||||||
|
('Arlequin', 2, NULL, '13:00:00', '18:00:00'),
|
||||||
|
('Arlequin', 3, NULL, '10:00:00', '13:00:00'),
|
||||||
|
('Arlequin', 3, NULL, '14:00:00', '18:00:00'),
|
||||||
|
('Arlequin', 5, NULL, '13:00:00', '18:00:00'),
|
||||||
|
('Arlequin', 4, NULL, '09:00:00', '12:00:00'),
|
||||||
|
('Arlequin', 6, NULL, '10:00:00', '13:00:00'),
|
||||||
|
('Arlequin', 6, NULL, '14:00:00', '18:00:00'),
|
||||||
|
('Eaux-Claires', 2, NULL, '13:00:00', '18:30:00'),
|
||||||
|
('Eaux-Claires', 3, NULL, '10:00:00', '13:00:00'),
|
||||||
|
('Eaux-Claires', 3, NULL, '14:00:00', '18:00:00'),
|
||||||
|
('Eaux-Claires', 4, NULL, '09:00:00', '12:00:00'),
|
||||||
|
('Eaux-Claires', 5, NULL, '13:00:00', '18:30:00'),
|
||||||
|
('Eaux-Claires', 6, NULL, '10:00:00', '13:00:00'),
|
||||||
|
('Eaux-Claires', 6, NULL, '14:00:00', '18:00:00'),
|
||||||
|
('Jardin de Ville', 2, NULL, '16:00:00', '18:00:00'),
|
||||||
|
('Jardin de Ville', 3, NULL, '10:00:00', '13:00:00'),
|
||||||
|
('Jardin de Ville', 3, NULL, '14:00:00', '18:00:00'),
|
||||||
|
('Jardin de Ville', 5, NULL, '16:00:00', '18:00:00'),
|
||||||
|
('Jardin de Ville', 6, NULL, '10:00:00', '13:00:00'),
|
||||||
|
('Jardin de Ville', 6, NULL, '14:00:00', '18:00:00'),
|
||||||
|
('Tesseire-Malherbe', 2, NULL, '13:00:00', '18:30:00'),
|
||||||
|
('Tesseire-Malherbe', 3, NULL, '10:00:00', '13:00:00'),
|
||||||
|
('Tesseire-Malherbe', 3, NULL, '14:00:00', '18:00:00'),
|
||||||
|
('Tesseire-Malherbe', 4, NULL, '09:00:00', '12:00:00'),
|
||||||
|
('Tesseire-Malherbe', 5, NULL, '13:00:00', '18:30:00'),
|
||||||
|
('Tesseire-Malherbe', 6, NULL, '10:00:00', '13:00:00'),
|
||||||
|
('Tesseire-Malherbe', 6, NULL, '14:00:00', '18:00:00'),
|
||||||
|
('Saint-Bruno', 2, NULL, '13:00:00', '18:30:00'),
|
||||||
|
('Saint-Bruno', 3, NULL, '10:00:00', '13:00:00'),
|
||||||
|
('Saint-Bruno', 3, NULL, '14:00:00', '18:00:00'),
|
||||||
|
('Saint-Bruno', 4, NULL, '09:00:00', '12:00:00'),
|
||||||
|
('Saint-Bruno', 5, NULL, '13:00:00', '18:30:00'),
|
||||||
|
('Saint-Bruno', 6, NULL, '10:00:00', '13:00:00'),
|
||||||
|
('Saint-Bruno', 6, NULL, '14:00:00', '18:00:00');
|
||||||
|
|
||||||
|
INSERT INTO holidays (start, end, closed) VALUES
|
||||||
|
('2017-10-20', '2017-11-05', FALSE),
|
||||||
|
('2017-12-22', '2018-01-07', FALSE),
|
||||||
|
('2018-01-01', '2018-01-01', TRUE),
|
||||||
|
('2018-02-09', '2018-02-25', FALSE),
|
||||||
|
('2018-04-02', '2018-04-02', TRUE),
|
||||||
|
('2018-04-06', '2018-04-22', FALSE),
|
||||||
|
('2018-05-01', '2018-05-01', TRUE),
|
||||||
|
('2018-05-08', '2018-05-08', TRUE),
|
||||||
|
('2018-05-10', '2018-05-10', TRUE),
|
||||||
|
('2018-05-21', '2018-05-21', TRUE),
|
||||||
|
('2018-07-06', '2018-09-02', FALSE),
|
||||||
|
('2018-07-14', '2018-07-14', TRUE),
|
||||||
|
('2018-08-15', '2018-08-15', TRUE),
|
||||||
|
('2018-10-19', '2018-11-04', FALSE),
|
||||||
|
('2018-11-01', '2018-11-01', TRUE),
|
||||||
|
('2018-11-11', '2018-11-11', TRUE),
|
||||||
|
('2018-12-21', '2019-01-06', FALSE),
|
||||||
|
('2018-12-25', '2018-12-25', TRUE),
|
||||||
|
('2019-01-01', '2019-01-01', TRUE),
|
||||||
|
('2019-02-15', '2019-03-03', FALSE),
|
||||||
|
('2019-04-12', '2019-04-28', FALSE),
|
||||||
|
('2019-04-22', '2019-04-22', TRUE),
|
||||||
|
('2019-05-01', '2019-05-01', TRUE),
|
||||||
|
('2019-05-08', '2019-05-08', TRUE),
|
||||||
|
('2019-05-28', '2019-06-02', FALSE),
|
||||||
|
('2019-05-30', '2019-05-30', TRUE),
|
||||||
|
('2019-06-10', '2019-06-10', TRUE),
|
||||||
|
('2019-07-05', '2019-09-01', FALSE),
|
||||||
|
('2019-07-14', '2019-07-14', TRUE),
|
||||||
|
('2019-08-15', '2019-08-15', TRUE),
|
||||||
|
('2019-10-18', '2019-11-03', FALSE),
|
||||||
|
('2019-11-01', '2019-11-01', TRUE),
|
||||||
|
('2019-11-11', '2019-11-11', TRUE),
|
||||||
|
('2019-12-20', '2020-01-05', FALSE),
|
||||||
|
('2019-12-25', '2019-12-25', TRUE),
|
||||||
|
('2020-01-01', '2020-01-01', TRUE),
|
||||||
|
('2020-02-21', '2020-03-08', FALSE),
|
||||||
|
('2020-04-13', '2020-04-13', TRUE),
|
||||||
|
('2020-04-17', '2020-05-03', FALSE),
|
||||||
|
('2020-05-01', '2020-05-01', TRUE),
|
||||||
|
('2020-05-08', '2020-05-08', TRUE),
|
||||||
|
('2020-05-19', '2020-05-24', FALSE),
|
||||||
|
('2020-05-21', '2020-05-21', TRUE),
|
||||||
|
('2020-06-01', '2020-06-01', TRUE),
|
||||||
|
('2020-07-03', '2020-08-31', FALSE),
|
||||||
|
('2020-07-14', '2020-07-14', TRUE),
|
||||||
|
('2020-08-15', '2020-08-15', TRUE),
|
||||||
|
('2020-10-16', '2020-11-01', FALSE),
|
||||||
|
('2020-11-01', '2020-11-01', TRUE),
|
||||||
|
('2020-11-11', '2020-11-11', TRUE),
|
||||||
|
('2020-12-18', '2021-01-03', FALSE),
|
||||||
|
('2020-12-25', '2020-12-25', TRUE),
|
||||||
|
('2021-01-01', '2021-01-01', TRUE),
|
||||||
|
('2021-02-05', '2021-02-21', FALSE),
|
||||||
|
('2021-04-05', '2021-04-05', TRUE),
|
||||||
|
('2021-04-09', '2021-04-25', FALSE),
|
||||||
|
('2021-05-01', '2021-05-01', TRUE),
|
||||||
|
('2021-05-08', '2021-05-08', TRUE),
|
||||||
|
('2021-05-12', '2021-05-16', FALSE),
|
||||||
|
('2021-05-13', '2021-05-13', TRUE),
|
||||||
|
('2021-05-24', '2021-05-24', TRUE),
|
||||||
|
('2021-07-05', '2021-09-01', FALSE),
|
||||||
|
('2021-07-14', '2021-07-14', TRUE),
|
||||||
|
('2021-08-15', '2021-08-15', TRUE),
|
||||||
|
('2021-10-22', '2021-11-07', FALSE),
|
||||||
|
('2021-11-01', '2021-11-01', TRUE),
|
||||||
|
('2021-11-11', '2021-11-11', TRUE),
|
||||||
|
('2021-12-17', '2022-01-02', FALSE),
|
||||||
|
('2021-12-25', '2021-12-25', TRUE),
|
||||||
|
('2022-01-01', '2022-01-01', TRUE),
|
||||||
|
('2022-02-11', '2022-02-27', FALSE),
|
||||||
|
('2022-04-15', '2022-05-01', FALSE),
|
||||||
|
('2022-04-18', '2022-04-18', TRUE),
|
||||||
|
('2022-05-01', '2022-05-01', TRUE),
|
||||||
|
('2022-05-08', '2022-05-08', TRUE),
|
||||||
|
('2022-05-25', '2022-05-27', FALSE),
|
||||||
|
('2022-05-26', '2022-05-26', TRUE),
|
||||||
|
('2022-06-06', '2022-06-06', TRUE),
|
||||||
|
('2022-07-06', '2022-08-31', FALSE),
|
||||||
|
('2022-07-14', '2022-07-14', TRUE),
|
||||||
|
('2022-08-15', '2022-08-15', TRUE),
|
||||||
|
('2022-10-21', '2022-11-06', FALSE),
|
||||||
|
('2022-11-01', '2022-11-01', TRUE),
|
||||||
|
('2022-11-11', '2022-11-11', TRUE),
|
||||||
|
('2022-12-16', '2023-01-02', FALSE),
|
||||||
|
('2022-12-25', '2022-12-25', TRUE),
|
||||||
|
('2023-01-01', '2023-01-01', TRUE),
|
||||||
|
('2023-02-03', '2023-02-19', FALSE),
|
||||||
|
('2023-04-07', '2023-04-23', FALSE),
|
||||||
|
('2023-04-10', '2023-04-10', TRUE),
|
||||||
|
('2023-05-01', '2023-05-01', TRUE),
|
||||||
|
('2023-05-08', '2023-05-08', TRUE),
|
||||||
|
('2023-05-17', '2023-05-21', FALSE),
|
||||||
|
('2023-05-18', '2023-05-18', TRUE),
|
||||||
|
('2023-05-29', '2023-05-29', TRUE),
|
||||||
|
('2023-07-07', '2023-09-03', FALSE),
|
||||||
|
('2023-07-14', '2023-07-14', TRUE),
|
||||||
|
('2023-08-15', '2023-08-15', TRUE),
|
||||||
|
('2023-10-20', '2023-11-05', FALSE),
|
||||||
|
('2023-11-01', '2023-11-01', TRUE),
|
||||||
|
('2023-11-11', '2023-11-11', TRUE),
|
||||||
|
('2023-12-22', '2024-01-07', FALSE),
|
||||||
|
('2023-12-25', '2023-12-25', TRUE),
|
||||||
|
('2024-01-01', '2024-01-01', TRUE),
|
||||||
|
('2024-02-16', '2024-03-03', FALSE),
|
||||||
|
('2024-04-01', '2024-04-01', TRUE),
|
||||||
|
('2024-04-12', '2024-04-28', FALSE),
|
||||||
|
('2024-05-01', '2024-05-01', TRUE),
|
||||||
|
('2024-05-08', '2024-05-08', TRUE),
|
||||||
|
('2024-05-09', '2024-05-09', TRUE),
|
||||||
|
('2024-05-09', '2024-05-10', FALSE),
|
||||||
|
('2024-05-20', '2024-05-20', TRUE),
|
||||||
|
('2024-07-05', '2024-09-01', FALSE),
|
||||||
|
('2024-07-14', '2024-07-14', TRUE),
|
||||||
|
('2024-08-15', '2024-08-15', TRUE),
|
||||||
|
('2024-10-18', '2024-11-03', FALSE),
|
||||||
|
('2024-11-01', '2024-11-01', TRUE),
|
||||||
|
('2024-11-11', '2024-11-11', TRUE),
|
||||||
|
('2024-12-20', '2025-01-05', FALSE),
|
||||||
|
('2024-12-25', '2024-12-25', TRUE),
|
||||||
|
('2025-01-01', '2025-01-01', TRUE),
|
||||||
|
('2025-02-21', '2025-03-09', FALSE),
|
||||||
|
('2025-04-18', '2025-05-04', FALSE),
|
||||||
|
('2025-04-21', '2025-04-21', TRUE),
|
||||||
|
('2025-05-01', '2025-05-01', TRUE),
|
||||||
|
('2025-05-08', '2025-05-08', TRUE),
|
||||||
|
('2025-05-29', '2025-05-29', TRUE),
|
||||||
|
('2025-05-29', '2025-05-30', FALSE),
|
||||||
|
('2025-06-09', '2025-06-09', TRUE),
|
||||||
|
('2025-07-04', '2025-08-31', FALSE),
|
||||||
|
('2025-07-14', '2025-07-14', TRUE),
|
||||||
|
('2025-08-15', '2025-08-15', TRUE),
|
||||||
|
('2025-10-17', '2025-11-02', FALSE),
|
||||||
|
('2025-11-01', '2025-11-01', TRUE),
|
||||||
|
('2025-11-11', '2025-11-11', TRUE),
|
||||||
|
('2025-12-19', '2026-01-04', FALSE),
|
||||||
|
('2025-12-25', '2025-12-25', TRUE),
|
||||||
|
('2026-01-01', '2026-01-01', TRUE),
|
||||||
|
('2026-02-06', '2026-02-22', FALSE),
|
||||||
|
('2026-04-03', '2026-04-19', FALSE),
|
||||||
|
('2026-04-06', '2026-04-06', TRUE),
|
||||||
|
('2026-05-01', '2026-05-01', TRUE),
|
||||||
|
('2026-05-08', '2026-05-08', TRUE),
|
||||||
|
('2026-05-14', '2026-05-14', TRUE),
|
||||||
|
('2026-05-14', '2026-05-15', FALSE),
|
||||||
|
('2026-05-25', '2026-05-25', TRUE),
|
||||||
|
('2026-07-03', '2026-07-03', FALSE),
|
||||||
|
('2026-07-14', '2026-07-14', TRUE),
|
||||||
|
('2026-08-15', '2026-08-15', TRUE),
|
||||||
|
('2026-11-01', '2026-11-01', TRUE),
|
||||||
|
('2026-11-11', '2026-11-11', TRUE),
|
||||||
|
('2026-12-25', '2026-12-25', TRUE),
|
||||||
|
('2027-01-01', '2027-01-01', TRUE),
|
||||||
|
('2027-03-29', '2027-03-29', TRUE),
|
||||||
|
('2027-05-01', '2027-05-01', TRUE),
|
||||||
|
('2027-05-06', '2027-05-06', TRUE),
|
||||||
|
('2027-05-08', '2027-05-08', TRUE),
|
||||||
|
('2027-05-17', '2027-05-17', TRUE),
|
||||||
|
('2027-07-14', '2027-07-14', TRUE),
|
||||||
|
('2027-08-15', '2027-08-15', TRUE),
|
||||||
|
('2027-11-01', '2027-11-01', TRUE),
|
||||||
|
('2027-11-11', '2027-11-11', TRUE),
|
||||||
|
('2027-12-25', '2027-12-25', TRUE),
|
||||||
|
('2028-01-01', '2028-01-01', TRUE),
|
||||||
|
('2028-04-17', '2028-04-17', TRUE),
|
||||||
|
('2028-05-01', '2028-05-01', TRUE),
|
||||||
|
('2028-05-08', '2028-05-08', TRUE),
|
||||||
|
('2028-05-25', '2028-05-25', TRUE),
|
||||||
|
('2028-06-05', '2028-06-05', TRUE),
|
||||||
|
('2028-07-14', '2028-07-14', TRUE),
|
||||||
|
('2028-08-15', '2028-08-15', TRUE),
|
||||||
|
('2028-11-01', '2028-11-01', TRUE),
|
||||||
|
('2028-11-11', '2028-11-11', TRUE),
|
||||||
|
('2028-12-25', '2028-12-25', TRUE);
|
||||||
|
|
||||||
|
COMMIT;
|
|
@ -0,0 +1,60 @@
|
||||||
|
BEGIN TRANSACTION;
|
||||||
|
|
||||||
|
CREATE TABLE library (
|
||||||
|
name TEXT PRIMARY KEY NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE work (
|
||||||
|
ark TEXT NOT NULL PRIMARY KEY
|
||||||
|
CHECK (ark LIKE 'ark:/%'),
|
||||||
|
author TEXT NOT NULL,
|
||||||
|
title TEXT NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE book (
|
||||||
|
ark TEXT NOT NULL
|
||||||
|
REFERENCES work (ark) ON UPDATE CASCADE ON DELETE CASCADE,
|
||||||
|
library TEXT NOT NULL
|
||||||
|
REFERENCES library (name) ON UPDATE CASCADE ON DELETE CASCADE,
|
||||||
|
location TEXT NOT NULL,
|
||||||
|
dewey TEXT NOT NULL,
|
||||||
|
borrowable INTEGER NOT NULL
|
||||||
|
DEFAULT TRUE
|
||||||
|
CHECK (borrowable IS TRUE OR borrowable IS FALSE),
|
||||||
|
PRIMARY KEY (ark, library)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE weekdays (
|
||||||
|
dow INTEGER NOT NULL PRIMARY KEY
|
||||||
|
CHECK (dow BETWEEN 0 AND 6),
|
||||||
|
name TEXT NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE schedule (
|
||||||
|
library TEXT NOT NULL
|
||||||
|
REFERENCES library (name) ON UPDATE CASCADE ON DELETE CASCADE,
|
||||||
|
dow INTEGER NOT NULL
|
||||||
|
REFERENCES weekdays (dow) ON UPDATE CASCADE ON DELETE RESTRICT,
|
||||||
|
holidays INTEGER
|
||||||
|
CHECK (holidays IS NULL OR holidays IS TRUE OR holidays IS FALSE),
|
||||||
|
start TEXT NOT NULL
|
||||||
|
CHECK (start GLOB '[01][0-9]:[0-5][0-9]:[0-5][0-9]' OR start GLOB '2[0-3]:[0-5][0-9]:[0-5][0-9]'),
|
||||||
|
end TEXT NOT NULL
|
||||||
|
CHECK (end GLOB '[01][0-9]:[0-5][0-9]:[0-5][0-9]' OR end GLOB '2[0-3]:[0-5][0-9]:[0-5][0-9]'),
|
||||||
|
UNIQUE (library, dow, start, end),
|
||||||
|
CONSTRAINT start_before_end CHECK (julianday(start) < julianday(end))
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE holidays (
|
||||||
|
start TEXT NOT NULL
|
||||||
|
CHECK (start GLOB '[0-9][0-9][0-9][0-9]-[01][0-9]-[0-3][0-9]'),
|
||||||
|
end TEXT NOT NULL
|
||||||
|
CHECK (end GLOB '[0-9][0-9][0-9][0-9]-[01][0-9]-[0-3][0-9]'),
|
||||||
|
closed INTEGER NOT NULL
|
||||||
|
DEFAULT FALSE
|
||||||
|
CHECK (closed IS FALSE OR closed IS TRUE),
|
||||||
|
PRIMARY KEY (start, end),
|
||||||
|
CONSTRAINT start_before_end CHECK (julianday(start) <= julianday(end))
|
||||||
|
);
|
||||||
|
|
||||||
|
COMMIT;
|
Loading…
Reference in New Issue