added schemas and data insertion function
This commit is contained in:
parent
6fdda4f414
commit
7493676c2c
110
conf.org
110
conf.org
|
@ -2651,16 +2651,118 @@ Org mode is great and all, but in many cases, text files just won't cut it. Hard
|
|||
"Path for the sqlite database that holds archive data.")
|
||||
|
||||
(defun nd/org-init-db ()
|
||||
"Make a sqlite database for org archive files if it does not exits already."
|
||||
"Make a sqlite database for org archive files if it does not exist already."
|
||||
(unless (file-exists-p nd/org-sqlite-db-path)
|
||||
(process-file-shell-command (concat "touch " nd/org-sqlite-db-path))
|
||||
(nd/sql-cmd nd/org-sqlite-db-path "create table test(one smallint);")))
|
||||
(nd/sql-cmd nd/org-sqlite-db-path nd/org-sqlite-header-schema)
|
||||
(nd/sql-cmd nd/org-sqlite-db-path nd/org-sqlite-state-changes-schema)
|
||||
(nd/sql-cmd nd/org-sqlite-db-path nd/org-sqlite-clocking-schema)
|
||||
(nd/sql-cmd nd/org-sqlite-db-path nd/org-sqlite-notes-schema)
|
||||
(nd/sql-cmd nd/org-sqlite-db-path nd/org-sqlite-deadline-changes-schema)
|
||||
(nd/sql-cmd nd/org-sqlite-db-path nd/org-sqlite-schedule-changes-schema)
|
||||
(nd/sql-cmd nd/org-sqlite-db-path nd/org-sqlite-properties-schema)
|
||||
(nd/sql-cmd nd/org-sqlite-db-path nd/org-sqlite-tags-schema)))
|
||||
|
||||
(defun nd/sql-cmd (db sql)
|
||||
"Execute string SQL on database DB using sqlite3 shell command.
|
||||
"Execute string SQL on database DB executing `sql-sqlite-program'.
|
||||
Returns the output of CMD. SQL should not contain any quotes as if it
|
||||
were entered on the shell."
|
||||
(shell-command-to-string (concat nd/sqlite3-cmd " " db " \"" sql "\"")))
|
||||
(shell-command-to-string (concat sql-sqlite-program " " db " '" sql "'")))
|
||||
|
||||
(defun nd/sql-insert (db tbl data)
|
||||
"Insert list DATA into TBL in sqlite database DB.
|
||||
Note that in list DATA, numbers will be converted to strings,
|
||||
strings will be flanked with '\"', and any other symbols will be
|
||||
converted to their symbol name."
|
||||
(let* ((data-str (mapcar
|
||||
(lambda (d)
|
||||
(cond ((stringp d) (concat "\"" d "\""))
|
||||
((numberp d) (number-to-string d))
|
||||
(t (symbol-name d))))
|
||||
data))
|
||||
(data-joined (string-join data-str ",")))
|
||||
(nd/sql-cmd db (concat "insert into " tbl " values(" data-joined ");"))))
|
||||
#+END_SRC
|
||||
**** schemas
|
||||
The database is going to hold all header information in the archive files according to these schemas. The data structure consists of one master table =headers= for all headers and and one layer of auxilary tables for information in the property and logging drawers.
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(defconst nd/org-sqlite-header-schema
|
||||
"CREATE TABLE headers (
|
||||
archive_path TEXT,
|
||||
archive_offset INTEGER,
|
||||
header TEXT NOT NULL,
|
||||
time_created DATE,
|
||||
time_closed DATE,
|
||||
parent_tree INTEGER,
|
||||
source_path TEXT NOT NULL,
|
||||
content TEXT,
|
||||
PRIMARY KEY (archive_path, archive_offset ASC));"
|
||||
"Schema to build the headers table in the org archive db.")
|
||||
|
||||
(defconst nd/org-sqlite-clocking-schema
|
||||
"CREATE TABLE clocking (
|
||||
path TEXT,
|
||||
\"offset\" INTEGER,
|
||||
time_in DATE NOT NULL,
|
||||
time_out DATE NOT NULL,
|
||||
FOREIGN KEY (path, \"offset\") REFERENCES header (archive_path, archive_offset));"
|
||||
"Schema to build the clocking table in the org archive db.")
|
||||
|
||||
(defconst nd/org-sqlite-state-changes-schema
|
||||
"CREATE TABLE state_changes (
|
||||
path TEXT,
|
||||
\"offset\" INTEGER,
|
||||
state_old TEXT NOT NULL,
|
||||
state_new TEXT NOT NULL,
|
||||
time_changed DATE NOT NULL,
|
||||
FOREIGN KEY (path, \"offset\") REFERENCES header (archive_path, archive_offset));"
|
||||
"Schema to build the state changes table in the org archive db.")
|
||||
|
||||
(defconst nd/org-sqlite-tags-schema
|
||||
"CREATE TABLE tags (
|
||||
path TEXT,
|
||||
\"offset\" INTEGER,
|
||||
tag TEXT NOT NULL,
|
||||
inherit BOOLEAN NOT NULL,
|
||||
FOREIGN KEY (path, \"offset\") REFERENCES header (archive_path, archive_offset));"
|
||||
"Schema to build the tags table in the org archive db.")
|
||||
|
||||
(defconst nd/org-sqlite-properties-schema
|
||||
"CREATE TABLE properties (
|
||||
path TEXT,
|
||||
\"offset\" INTEGER,
|
||||
\"key\" TEXT NOT NULL,
|
||||
value TEXT NOT NULL,
|
||||
FOREIGN KEY (path, \"offset\") REFERENCES header (archive_path, archive_offset));"
|
||||
"Schema to build the properties table in the org archive db.")
|
||||
|
||||
(defconst nd/org-sqlite-deadline-changes-schema
|
||||
"CREATE TABLE deadline_changes (
|
||||
path TEXT, \"offset\" INTEGER,
|
||||
time_old DATE NOT NULL,
|
||||
time_new DATE NOT NULL,
|
||||
time_changed DATE NOT NULL,
|
||||
FOREIGN KEY (path, \"offset\") REFERENCES header (archive_path, archive_offset));"
|
||||
"Schema to build the deadline changes table in the org archive db.")
|
||||
|
||||
(defconst nd/org-sqlite-schedule-changes-schema
|
||||
"CREATE TABLE schedule_changes (
|
||||
path TEXT,
|
||||
\"offset\" INTEGER,
|
||||
time_old DATE NOT NULL,
|
||||
time_new DATE NOT NULL,
|
||||
time_changed DATE NOT NULL,
|
||||
FOREIGN KEY (path, \"offset\") REFERENCES header (archive_path, archive_offset));"
|
||||
"Schema to build the schedule changes table in the org archive db.")
|
||||
|
||||
(defconst nd/org-sqlite-notes-schema
|
||||
"CREATE TABLE notes (
|
||||
path TEXT,
|
||||
\"offset\" INTEGER,
|
||||
contents TEXT,
|
||||
time_written DATE NOT NULL,
|
||||
FOREIGN KEY (path, \"offset\") REFERENCES header (archive_path, archive_offset));"
|
||||
"Schema to build the notes table in the org archive db.")
|
||||
#+END_SRC
|
||||
* tools
|
||||
** printing
|
||||
|
|
Loading…
Reference in New Issue