lib/types.nim
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 |
import
db_sqlite,
pegs,
asynchttpserver2,
strtabs,
parsecfg,
strutils,
streams
type
EDatastoreExists* = object of Exception
EDatastoreDoesNotExist* = object of Exception
EDatastoreUnavailable* = object of Exception
EInvalidTag* = object of Exception
EDirectoryNotFound* = object of Exception
EFileNotFound* = object of Exception
EFileExists* = object of Exception
EInvalidRequest* = object of Exception
uarray* {.unchecked.} [T] = array[0..0, T]
Datastore* = object
db*: TDbConn
path*: string
mount*: string
QueryOptions* = object
select*: seq[string]
single*:bool
limit*: int
offset*: int
orderby*: string
tags*: string
search*: string
TagExpression* = object
tag*: string
startswith*: bool
endswith*: bool
negated*: bool
Operation* = enum
opRun,
opImport,
opExport,
opDelete,
opVacuum,
opOptimize
LogLevel* = enum
lvDebug
lvInfo
lvWarn
lvError
lvNone
Logger* = object
level*: LogLevel
LiteStore* = object
store*: Datastore
address*: string
port*: int
operation*: Operation
directory*: string
file*: string
mount*: bool
readonly*: bool
appname*: string
appversion*: string
favicon*:string
loglevel*:string
reset*: bool
Response* = tuple[
code: HttpCode,
content: string,
headers: StringTableRef]
ResourceInfo* = tuple[
resource: string,
id: string,
version: string
]
var
PEG_TAG* {.threadvar.}: Peg
PEG_USER_TAG* {.threadvar.}: Peg
PEG_DEFAULT_URL* {.threadvar.}: Peg
PEG_URL* {.threadvar.}: Peg
PEG_TAG = peg"""^\$? [a-zA-Z0-9_\-?~:.@#^!+]+$"""
PEG_USER_TAG = peg"""^[a-zA-Z0-9_\-?~:.@#^!+]+$"""
PEG_DEFAULT_URL = peg"""^\/{(docs / info)} (\/ {(.+)} / \/?)$"""
PEG_URL = peg"""^\/({(v\d+)} \/) {([^\/]+)} (\/ {(.+)} / \/?)$"""
const cfgfile = "litestore.nimble".slurp
var
file*, address*, version*, appname*: string
port*: int
f = newStringStream(cfgfile)
if f != nil:
var p: CfgParser
open(p, f, "litestore.nimble")
while true:
var e = next(p)
case e.kind
of cfgEof:
break
of cfgKeyValuePair:
case e.key:
of "version":
version = e.value
of "appame":
appname = e.value
of "port":
port = e.value.parseInt
of "address":
address = e.value
of "file":
file = e.value
else:
discard
of cfgError:
stderr.writeln("Configuration error.")
quit(1)
else:
discard
close(p)
else:
stderr.writeln("Cannot process configuration file.")
quit(2)
# Initialize LiteStore
var LS* {.threadvar.}: LiteStore
var TAB_HEADERS* {.threadvar.}: array[0..2, (string, string)]
LS.port = port
LS.address = address
LS.file = file
LS.appversion = version
LS.appname = appname
TAB_HEADERS = {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Headers": "Content-Type",
"Server": LS.appname & "/" & LS.appversion
}
proc newQueryOptions*(): QueryOptions =
return QueryOptions(select: @["id", "data", "content_type", "binary", "searchable", "created", "modified"], single: false, limit: 0, offset: 0, orderby: "", tags: "", search: "")
|