summaryrefslogtreecommitdiff
path: root/README.creole
blob: 39de316fb8bee3a466ff72f1753fda225a64a657 (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
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
= Emacs Db - Key/Values stores for Emacs =

An EmacsLisp interface to key/value stores (Mongo, Postgresql Hstore,
etc..) with a simple default implementation based on EmacsLisp Hashtables.

== The interface ==

The idea behind this is to make an interface for interacting with
simple key/value database stores that is portable across all such
stores. So you can make code once but swap out the database with
relative ease.

The interface includes the following functions:

=== db-make reference ===

Make a DB based on the //reference//.

=== db-get key db ===

Get the value from the //db// with the //key//.

=== db-put key value db ===

Put a new //value// into the //db// with the specified //key//.

Return the //value// as it has been put into the //db//.

=== db-map func db &optional query filter ===

Call //func// for every record in //db// optionally //query// filter.

//query//, if specified, should be a list of query terms.

//func// should take 2 arguments:

{{{
  key db-value
}}}

where the DB-VALUE is whatever the //db// has attached to the
specified KEY.

This returns an alist of the KEY and the value the function
returned.  If //filter// is [[t]] then only pairs with a value are
returned.

=== db-query db query ===

Do //query// on //db// and return the result.

This is [[db-map]] with an identity function.


== Query language ==

{{{db}}} uses the query language provided by the {{{kv}}} library,
which is implemented as a mapping function test on ever value by the
persistent hashtable implementation.

The language should be translatable to just about any database query
language (Mongo, SQL, etc...).

There are only 3 constructs currently, {{{|}}}, {{{&}}} and {{{=}}}.

An expression could be:

{{{
(= field-name value)
}}}

To select any record where {{{field-name}}} has the {{{value}}}

{{{
(|(= field-name value)(= other-field other-value))
}}}

To select any record where {{{field-name}}} has the {{{value}}} 
or {{{other-field}}} has the value {{{other-value}}}

{{{
(&(= field-name value)(= other-field other-value))
}}}

To select any record where {{{field-name}}} has the {{{value}}} 
and {{{other-field}}} has the value {{{other-value}}}.

Logical combinations of {{{|}}} and {{{&}}} are also possible.


== Hashtable implementation ==

{{{db}}} comes with a simple implementation which can store any
EmacsLisp object (though alists would most usually be preferred).

To make a {{{db}}} with the hash implementation:

{{{
(db-make 
  `(db-hash 
     :filename ,(format "/var/cache/some-file")))
}}}

Obviously, most often you will assign the db to a global variable.

{{{
(defvar my-db 
  (db-make 
   `(db-hash 
     :filename ,(format "/var/cache/some-file"))))

(db-put "001" '(("a" . 10)("b" . 20)) my-db)
(db-put "002" '(("a" . 17)("b" . "hello")("xyz" . "well!")) my-db)
(db-get "002" my-db)
}}}

results in:

{{{
(("a" . 17)("b" . "hello")("xyz" . "well!"))
}}}