summaryrefslogtreecommitdiffstats
path: root/docs/tutorials/tutorial-lib/formats/tutorial-lib/tutorial.sql
diff options
context:
space:
mode:
Diffstat (limited to 'docs/tutorials/tutorial-lib/formats/tutorial-lib/tutorial.sql')
-rw-r--r--docs/tutorials/tutorial-lib/formats/tutorial-lib/tutorial.sql154
1 files changed, 154 insertions, 0 deletions
diff --git a/docs/tutorials/tutorial-lib/formats/tutorial-lib/tutorial.sql b/docs/tutorials/tutorial-lib/formats/tutorial-lib/tutorial.sql
new file mode 100644
index 0000000..2813357
--- /dev/null
+++ b/docs/tutorials/tutorial-lib/formats/tutorial-lib/tutorial.sql
@@ -0,0 +1,154 @@
+
+-- Tracks the current step in the tutorial
+CREATE TABLE lnav_tutorial_step
+(
+ name TEXT NOT NULL PRIMARY KEY,
+ step INTEGER NOT NULL
+);
+
+INSERT INTO lnav_tutorial_step
+ VALUES ('tutorial1', 1);
+
+-- A description of each step in the tutorial with its achievements
+CREATE TABLE lnav_tutorial_steps
+(
+ name TEXT NOT NULL,
+ step INTEGER NOT NULL,
+ achievements TEXT NOT NULL,
+ PRIMARY KEY (name, step)
+);
+
+-- Tracks the progress through the achievements in a step of the tutorial
+CREATE TABLE IF NOT EXISTS lnav_tutorial_progress
+(
+ name TEXT NOT NULL,
+ step INTEGER NOT NULL,
+ achieved TEXT NOT NULL,
+
+ PRIMARY KEY (name, step, achieved)
+);
+
+CREATE TABLE IF NOT EXISTS lnav_tutorial_lines
+(
+ name TEXT NOT NULL,
+ step INTEGER NOT NULL,
+ view_ptr TEXT NOT NULL,
+ view_value TEXT NOT NULL,
+ achievement TEXT NOT NULL,
+ log_comment TEXT
+);
+
+-- Copy the tutorial data from the markdown frontmatter to
+-- the appropriate tables.
+CREATE TRIGGER IF NOT EXISTS add_tutorial_data
+ AFTER INSERT
+ ON lnav_events
+ WHEN jget(new.content, '/$schema') = 'https://lnav.org/event-file-format-detected-v1.schema.json' AND
+ jget(new.content, '/format') = 'text/markdown'
+BEGIN
+ INSERT INTO lnav_tutorial_steps
+ SELECT jget(tutorial_meta, '/name'),
+ key + 1,
+ value
+ FROM (SELECT yaml_to_json(lnav_file_metadata.content) AS tutorial_meta
+ FROM lnav_file_metadata
+ WHERE filepath = jget(new.content, '/filename')) AS meta_content,
+ json_each(jget(meta_content.tutorial_meta, '/steps'));
+
+ REPLACE INTO lnav_tutorial_lines
+ SELECT name,
+ step,
+ jget(value, '/view_ptr'),
+ jget(value, '/view_value'),
+ key,
+ jget(value, '/comment')
+ FROM lnav_tutorial_steps,
+ json_each(achievements)
+ WHERE jget(value, '/view_ptr') IS NOT NULL;
+
+ REPLACE INTO lnav_user_notifications (id, views, message)
+ SELECT *
+ FROM lnav_tutorial_log_notification;
+END;
+
+CREATE TRIGGER IF NOT EXISTS tutorial_move_log_after_load
+ AFTER INSERT
+ ON lnav_events
+ WHEN jget(new.content, '/$schema') = 'https://lnav.org/event-session-loaded-v1.schema.json'
+BEGIN
+ UPDATE lnav_views SET top = 0 WHERE name = 'log';
+END;
+
+CREATE TRIGGER IF NOT EXISTS lnav_tutorial_view_listener UPDATE OF top
+ ON lnav_views_echo
+ WHEN new.name = 'log'
+BEGIN
+ INSERT OR IGNORE INTO lnav_tutorial_progress
+ SELECT lnav_tutorial_lines.name,
+ lnav_tutorial_lines.step,
+ achievement
+ FROM lnav_tutorial_step,
+ lnav_tutorial_lines
+ WHERE lnav_tutorial_step.step = lnav_tutorial_lines.step
+ AND jget(json_object('top', new.top,
+ 'left', new.left,
+ 'search', new.search),
+ view_ptr) = view_value;
+ UPDATE all_logs
+ SET log_comment = (SELECT log_comment
+ FROM lnav_tutorial_step,
+ lnav_tutorial_lines
+ WHERE lnav_tutorial_step.step = lnav_tutorial_lines.step
+ AND lnav_tutorial_lines.log_comment IS NOT NULL
+ AND jget(json_object('top', new.top,
+ 'left', new.left,
+ 'search', new.search), view_ptr) = view_value)
+ WHERE log_line = new.top
+ AND log_comment IS NULL;
+END;
+
+CREATE TABLE lnav_tutorial_message
+(
+ msgid INTEGER PRIMARY KEY,
+ msg TEXT
+);
+
+CREATE VIEW lnav_tutorial_current_achievements AS
+SELECT key AS achievement, value
+ FROM lnav_tutorial_step,
+ lnav_tutorial_steps, json_each(lnav_tutorial_steps.achievements)
+ WHERE lnav_tutorial_step.step = lnav_tutorial_steps.step;
+
+CREATE VIEW lnav_tutorial_current_progress AS
+SELECT achieved
+ FROM lnav_tutorial_step,
+ lnav_tutorial_progress
+ WHERE lnav_tutorial_step.step = lnav_tutorial_progress.step;
+
+CREATE VIEW lnav_tutorial_remaining_achievements AS
+SELECT *
+ FROM lnav_tutorial_current_achievements
+ WHERE achievement NOT IN (SELECT * FROM lnav_tutorial_current_progress);
+
+CREATE VIEW lnav_tutorial_log_notification AS
+SELECT *
+ FROM (SELECT 'org.lnav.tutorial.log' AS id, '["log"]' AS views, jget(value, '/notification') AS message
+ FROM lnav_tutorial_remaining_achievements
+ UNION ALL
+ SELECT 'org.lnav.tutorial.log' AS id,
+ '["log"]' AS views,
+ 'Press `y` to go to the next step in the tutorial' AS message)
+ LIMIT 1;
+
+CREATE TRIGGER IF NOT EXISTS lnav_tutorial_progress_listener
+ AFTER INSERT
+ ON lnav_tutorial_progress
+BEGIN
+ DELETE FROM lnav_user_notifications WHERE id = 'org.lnav.tutorial.log';
+ REPLACE INTO lnav_user_notifications (id, views, message)
+ SELECT *
+ FROM lnav_tutorial_log_notification;
+END;
+
+REPLACE INTO lnav_user_notifications (id, views, message)
+ VALUES ('org.lnav.tutorial.text', '["text"]', 'Press `q` to go to the log view')