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 |
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 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: "") |