build the documentation of official packages (#20986)
* remove db stuffs * remove punycode * remove * fixes script * add cloner * patches * disable * patch * fixes external packages * disable two packages * preview documentation build * try again * fixes URL * fixes a bug * simplify * fixes documentaion * fixes * Apply suggestions from code review
This commit is contained in:
parent
4ca2dcb404
commit
9ba07edb2e
31 changed files with 92 additions and 6358 deletions
|
|
@ -1,100 +0,0 @@
|
|||
#
|
||||
#
|
||||
# Nim's Runtime Library
|
||||
# (c) Copyright 2015 Andreas Rumpf
|
||||
#
|
||||
# See the file "copying.txt", included in this
|
||||
# distribution, for details about the copyright.
|
||||
#
|
||||
|
||||
## Common datatypes and definitions for all `db_*.nim` (
|
||||
## `db_mysql <db_mysql.html>`_, `db_postgres <db_postgres.html>`_,
|
||||
## and `db_sqlite <db_sqlite.html>`_) modules.
|
||||
|
||||
type
|
||||
DbError* = object of IOError ## exception that is raised if a database error occurs
|
||||
|
||||
SqlQuery* = distinct string ## an SQL query string
|
||||
|
||||
|
||||
DbEffect* = object of IOEffect ## effect that denotes a database operation
|
||||
ReadDbEffect* = object of DbEffect ## effect that denotes a read operation
|
||||
WriteDbEffect* = object of DbEffect ## effect that denotes a write operation
|
||||
|
||||
DbTypeKind* = enum ## a superset of datatypes that might be supported.
|
||||
dbUnknown, ## unknown datatype
|
||||
dbSerial, ## datatype used for primary auto-increment keys
|
||||
dbNull, ## datatype used for the NULL value
|
||||
dbBit, ## bit datatype
|
||||
dbBool, ## boolean datatype
|
||||
dbBlob, ## blob datatype
|
||||
dbFixedChar, ## string of fixed length
|
||||
dbVarchar, ## string datatype
|
||||
dbJson, ## JSON datatype
|
||||
dbXml, ## XML datatype
|
||||
dbInt, ## some integer type
|
||||
dbUInt, ## some unsigned integer type
|
||||
dbDecimal, ## decimal numbers (fixed-point number)
|
||||
dbFloat, ## some floating point type
|
||||
dbDate, ## a year-month-day description
|
||||
dbTime, ## HH:MM:SS information
|
||||
dbDatetime, ## year-month-day and HH:MM:SS information,
|
||||
## plus optional time or timezone information
|
||||
dbTimestamp, ## Timestamp values are stored as the number of seconds
|
||||
## since the epoch ('1970-01-01 00:00:00' UTC).
|
||||
dbTimeInterval, ## an interval [a,b] of times
|
||||
dbEnum, ## some enum
|
||||
dbSet, ## set of enum values
|
||||
dbArray, ## an array of values
|
||||
dbComposite, ## composite type (record, struct, etc)
|
||||
dbUrl, ## a URL
|
||||
dbUuid, ## a UUID
|
||||
dbInet, ## an IP address
|
||||
dbMacAddress, ## a MAC address
|
||||
dbGeometry, ## some geometric type
|
||||
dbPoint, ## Point on a plane (x,y)
|
||||
dbLine, ## Infinite line ((x1,y1),(x2,y2))
|
||||
dbLseg, ## Finite line segment ((x1,y1),(x2,y2))
|
||||
dbBox, ## Rectangular box ((x1,y1),(x2,y2))
|
||||
dbPath, ## Closed or open path (similar to polygon) ((x1,y1),...)
|
||||
dbPolygon, ## Polygon (similar to closed path) ((x1,y1),...)
|
||||
dbCircle, ## Circle <(x,y),r> (center point and radius)
|
||||
dbUser1, ## user definable datatype 1 (for unknown extensions)
|
||||
dbUser2, ## user definable datatype 2 (for unknown extensions)
|
||||
dbUser3, ## user definable datatype 3 (for unknown extensions)
|
||||
dbUser4, ## user definable datatype 4 (for unknown extensions)
|
||||
dbUser5 ## user definable datatype 5 (for unknown extensions)
|
||||
|
||||
DbType* = object ## describes a database type
|
||||
kind*: DbTypeKind ## the kind of the described type
|
||||
notNull*: bool ## does the type contain NULL?
|
||||
name*: string ## the name of the type
|
||||
size*: Natural ## the size of the datatype; 0 if of variable size
|
||||
maxReprLen*: Natural ## maximal length required for the representation
|
||||
precision*, scale*: Natural ## precision and scale of the number
|
||||
min*, max*: BiggestInt ## the minimum and maximum of allowed values
|
||||
validValues*: seq[string] ## valid values of an enum or a set
|
||||
|
||||
DbColumn* = object ## information about a database column
|
||||
name*: string ## name of the column
|
||||
tableName*: string ## name of the table the column belongs to (optional)
|
||||
typ*: DbType ## type of the column
|
||||
primaryKey*: bool ## is this a primary key?
|
||||
foreignKey*: bool ## is this a foreign key?
|
||||
DbColumns* = seq[DbColumn]
|
||||
|
||||
template sql*(query: string): SqlQuery =
|
||||
## constructs a SqlQuery from the string `query`. This is supposed to be
|
||||
## used as a raw-string-literal modifier:
|
||||
## `sql"update user set counter = counter + 1"`
|
||||
##
|
||||
## If assertions are turned off, it does nothing. If assertions are turned
|
||||
## on, later versions will check the string for valid syntax.
|
||||
SqlQuery(query)
|
||||
|
||||
proc dbError*(msg: string) {.noreturn, noinline.} =
|
||||
## raises an DbError exception with message `msg`.
|
||||
var e: ref DbError
|
||||
new(e)
|
||||
e.msg = msg
|
||||
raise e
|
||||
|
|
@ -1,88 +0,0 @@
|
|||
#
|
||||
#
|
||||
# Nim's Runtime Library
|
||||
# (c) Copyright 2016 Andreas Rumpf
|
||||
#
|
||||
# See the file "copying.txt", included in this
|
||||
# distribution, for details about the copyright.
|
||||
#
|
||||
|
||||
## Memory tracking support for Nim.
|
||||
|
||||
when not defined(memTracker) and not isMainModule:
|
||||
{.error: "Memory tracking support is turned off!".}
|
||||
|
||||
{.push memtracker: off.}
|
||||
# we import the low level wrapper and are careful not to use Nim's
|
||||
# memory manager for anything here.
|
||||
import sqlite3
|
||||
|
||||
var
|
||||
dbHandle: PSqlite3
|
||||
insertStmt {.threadvar.}: Pstmt
|
||||
|
||||
const insertQuery = "INSERT INTO tracking(op, address, size, file, line) values (?, ?, ?, ?, ?)"
|
||||
|
||||
template sbind(x: int; value) =
|
||||
when value is cstring:
|
||||
let ret = insertStmt.bindText(x, value, value.len.int32, SQLITE_TRANSIENT)
|
||||
if ret != SQLITE_OK:
|
||||
quit "could not bind value"
|
||||
else:
|
||||
let ret = insertStmt.bindInt64(x, value)
|
||||
if ret != SQLITE_OK:
|
||||
quit "could not bind value"
|
||||
|
||||
when defined(memTracker):
|
||||
proc logEntries(log: TrackLog) {.nimcall, tags: [], gcsafe.} =
|
||||
if insertStmt.isNil:
|
||||
if prepare_v2(dbHandle, insertQuery,
|
||||
insertQuery.len, insertStmt, nil) != SQLITE_OK:
|
||||
quit "could not bind query to insertStmt " & $sqlite3.errmsg(dbHandle)
|
||||
for i in 0..log.count-1:
|
||||
var success = false
|
||||
let e = log.data[i]
|
||||
discard sqlite3.reset(insertStmt)
|
||||
discard clearBindings(insertStmt)
|
||||
sbind 1, e.op
|
||||
sbind(2, cast[int](e.address))
|
||||
sbind 3, e.size
|
||||
sbind 4, e.file
|
||||
sbind 5, e.line
|
||||
if step(insertStmt) == SQLITE_DONE:
|
||||
success = true
|
||||
if not success:
|
||||
quit "could not write to database! " & $sqlite3.errmsg(dbHandle)
|
||||
|
||||
proc execQuery(q: string) =
|
||||
var s: Pstmt
|
||||
if prepare_v2(dbHandle, q, q.len.int32, s, nil) == SQLITE_OK:
|
||||
discard step(s)
|
||||
if finalize(s) != SQLITE_OK:
|
||||
quit "could not finalize " & $sqlite3.errmsg(dbHandle)
|
||||
else:
|
||||
quit "could not prepare statement " & $sqlite3.errmsg(dbHandle)
|
||||
|
||||
proc setupDb() =
|
||||
execQuery """create table if not exists tracking(
|
||||
id integer primary key,
|
||||
op varchar not null,
|
||||
address integer not null,
|
||||
size integer not null,
|
||||
file varchar not null,
|
||||
line integer not null
|
||||
)"""
|
||||
execQuery "delete from tracking"
|
||||
|
||||
if sqlite3.open("memtrack.db", dbHandle) == SQLITE_OK:
|
||||
setupDb()
|
||||
const query = "INSERT INTO tracking(op, address, size, file, line) values (?, ?, ?, ?, ?)"
|
||||
if prepare_v2(dbHandle, insertQuery,
|
||||
insertQuery.len, insertStmt, nil) == SQLITE_OK:
|
||||
when defined(memTracker):
|
||||
setTrackLogger logEntries
|
||||
else:
|
||||
quit "could not prepare statement B " & $sqlite3.errmsg(dbHandle)
|
||||
else:
|
||||
quit "could not setup sqlite " & $sqlite3.errmsg(dbHandle)
|
||||
{.pop.}
|
||||
|
|
@ -1,209 +0,0 @@
|
|||
#
|
||||
#
|
||||
# Nim's Runtime Library
|
||||
# (c) Copyright 2016 Andreas Rumpf
|
||||
#
|
||||
# See the file "copying.txt", included in this
|
||||
# distribution, for details about the copyright.
|
||||
#
|
||||
|
||||
## Implements a representation of Unicode with the limited
|
||||
## ASCII character subset.
|
||||
|
||||
import strutils
|
||||
import unicode
|
||||
|
||||
# issue #3045
|
||||
|
||||
const
|
||||
Base = 36
|
||||
TMin = 1
|
||||
TMax = 26
|
||||
Skew = 38
|
||||
Damp = 700
|
||||
InitialBias = 72
|
||||
InitialN = 128
|
||||
Delimiter = '-'
|
||||
|
||||
type
|
||||
PunyError* = object of ValueError
|
||||
|
||||
func decodeDigit(x: char): int {.raises: [PunyError].} =
|
||||
if '0' <= x and x <= '9':
|
||||
result = ord(x) - (ord('0') - 26)
|
||||
elif 'A' <= x and x <= 'Z':
|
||||
result = ord(x) - ord('A')
|
||||
elif 'a' <= x and x <= 'z':
|
||||
result = ord(x) - ord('a')
|
||||
else:
|
||||
raise newException(PunyError, "Bad input")
|
||||
|
||||
func encodeDigit(digit: int): Rune {.raises: [PunyError].} =
|
||||
if 0 <= digit and digit < 26:
|
||||
result = Rune(digit + ord('a'))
|
||||
elif 26 <= digit and digit < 36:
|
||||
result = Rune(digit + (ord('0') - 26))
|
||||
else:
|
||||
raise newException(PunyError, "internal error in punycode encoding")
|
||||
|
||||
func isBasic(c: char): bool = ord(c) < 0x80
|
||||
func isBasic(r: Rune): bool = int(r) < 0x80
|
||||
|
||||
func adapt(delta, numPoints: int, first: bool): int =
|
||||
var d = if first: delta div Damp else: delta div 2
|
||||
d += d div numPoints
|
||||
var k = 0
|
||||
while d > ((Base-TMin)*TMax) div 2:
|
||||
d = d div (Base - TMin)
|
||||
k += Base
|
||||
result = k + (Base - TMin + 1) * d div (d + Skew)
|
||||
|
||||
func encode*(prefix, s: string): string {.raises: [PunyError].} =
|
||||
## Encode a string that may contain Unicode.
|
||||
## Prepend `prefix` to the result
|
||||
result = prefix
|
||||
var (d, n, bias) = (0, InitialN, InitialBias)
|
||||
var (b, remaining) = (0, 0)
|
||||
for r in s.runes:
|
||||
if r.isBasic:
|
||||
# basic Ascii character
|
||||
inc b
|
||||
result.add($r)
|
||||
else:
|
||||
# special character
|
||||
inc remaining
|
||||
|
||||
var h = b
|
||||
if b > 0:
|
||||
result.add(Delimiter) # we have some Ascii chars
|
||||
while remaining != 0:
|
||||
var m: int = high(int32)
|
||||
for r in s.runes:
|
||||
if m > int(r) and int(r) >= n:
|
||||
m = int(r)
|
||||
d += (m - n) * (h + 1)
|
||||
if d < 0:
|
||||
raise newException(PunyError, "invalid label " & s)
|
||||
n = m
|
||||
for r in s.runes:
|
||||
if int(r) < n:
|
||||
inc d
|
||||
if d < 0:
|
||||
raise newException(PunyError, "invalid label " & s)
|
||||
continue
|
||||
if int(r) > n:
|
||||
continue
|
||||
var q = d
|
||||
var k = Base
|
||||
while true:
|
||||
var t = k - bias
|
||||
if t < TMin:
|
||||
t = TMin
|
||||
elif t > TMax:
|
||||
t = TMax
|
||||
if q < t:
|
||||
break
|
||||
result.add($encodeDigit(t + (q - t) mod (Base - t)))
|
||||
q = (q - t) div (Base - t)
|
||||
k += Base
|
||||
result.add($encodeDigit(q))
|
||||
bias = adapt(d, h + 1, h == b)
|
||||
d = 0
|
||||
inc h
|
||||
dec remaining
|
||||
inc d
|
||||
inc n
|
||||
|
||||
func encode*(s: string): string {.raises: [PunyError].} =
|
||||
## Encode a string that may contain Unicode. Prefix is empty.
|
||||
result = encode("", s)
|
||||
|
||||
func decode*(encoded: string): string {.raises: [PunyError].} =
|
||||
## Decode a Punycode-encoded string
|
||||
var
|
||||
n = InitialN
|
||||
i = 0
|
||||
bias = InitialBias
|
||||
var d = rfind(encoded, Delimiter)
|
||||
var output: seq[Rune]
|
||||
|
||||
if d > 0:
|
||||
# found Delimiter
|
||||
for j in 0..<d:
|
||||
var c = encoded[j] # char
|
||||
if not c.isBasic:
|
||||
raise newException(PunyError, "Encoded contains a non-basic char")
|
||||
output.add(Rune(c)) # add the character
|
||||
inc d
|
||||
else:
|
||||
d = 0 # set to first index
|
||||
|
||||
while (d < len(encoded)):
|
||||
var oldi = i
|
||||
var w = 1
|
||||
var k = Base
|
||||
while true:
|
||||
if d == len(encoded):
|
||||
raise newException(PunyError, "Bad input: " & encoded)
|
||||
var c = encoded[d]; inc d
|
||||
var digit = int(decodeDigit(c))
|
||||
if digit > (high(int32) - i) div w:
|
||||
raise newException(PunyError, "Too large a value: " & $digit)
|
||||
i += digit * w
|
||||
var t: int
|
||||
if k <= bias:
|
||||
t = TMin
|
||||
elif k >= bias + TMax:
|
||||
t = TMax
|
||||
else:
|
||||
t = k - bias
|
||||
if digit < t:
|
||||
break
|
||||
w *= Base - t
|
||||
k += Base
|
||||
bias = adapt(i - oldi, len(output) + 1, oldi == 0)
|
||||
|
||||
if i div (len(output) + 1) > high(int32) - n:
|
||||
raise newException(PunyError, "Value too large")
|
||||
|
||||
n += i div (len(output) + 1)
|
||||
i = i mod (len(output) + 1)
|
||||
insert(output, Rune(n), i)
|
||||
inc i
|
||||
|
||||
result = $output
|
||||
|
||||
runnableExamples:
|
||||
static:
|
||||
block:
|
||||
doAssert encode("") == ""
|
||||
doAssert encode("a") == "a-"
|
||||
doAssert encode("A") == "A-"
|
||||
doAssert encode("3") == "3-"
|
||||
doAssert encode("-") == "--"
|
||||
doAssert encode("--") == "---"
|
||||
doAssert encode("abc") == "abc-"
|
||||
doAssert encode("London") == "London-"
|
||||
doAssert encode("Lloyd-Atkinson") == "Lloyd-Atkinson-"
|
||||
doAssert encode("This has spaces") == "This has spaces-"
|
||||
doAssert encode("ü") == "tda"
|
||||
doAssert encode("München") == "Mnchen-3ya"
|
||||
doAssert encode("Mnchen-3ya") == "Mnchen-3ya-"
|
||||
doAssert encode("München-Ost") == "Mnchen-Ost-9db"
|
||||
doAssert encode("Bahnhof München-Ost") == "Bahnhof Mnchen-Ost-u6b"
|
||||
block:
|
||||
doAssert decode("") == ""
|
||||
doAssert decode("a-") == "a"
|
||||
doAssert decode("A-") == "A"
|
||||
doAssert decode("3-") == "3"
|
||||
doAssert decode("--") == "-"
|
||||
doAssert decode("---") == "--"
|
||||
doAssert decode("abc-") == "abc"
|
||||
doAssert decode("London-") == "London"
|
||||
doAssert decode("Lloyd-Atkinson-") == "Lloyd-Atkinson"
|
||||
doAssert decode("This has spaces-") == "This has spaces"
|
||||
doAssert decode("tda") == "ü"
|
||||
doAssert decode("Mnchen-3ya") == "München"
|
||||
doAssert decode("Mnchen-3ya-") == "Mnchen-3ya"
|
||||
doAssert decode("Mnchen-Ost-9db") == "München-Ost"
|
||||
doAssert decode("Bahnhof Mnchen-Ost-u6b") == "Bahnhof München-Ost"
|
||||
Loading…
Add table
Add a link
Reference in a new issue