mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-19 05:50:30 +00:00
Merge branch 'master' of git@github.com:Araq/Nimrod
This commit is contained in:
@@ -606,6 +606,35 @@ proc `[]=`*(obj: PJsonNode, key: String, val: PJsonNode) =
|
||||
return
|
||||
obj.fields.add((key, val))
|
||||
|
||||
proc delete*(obj: PJsonNode, key: string) =
|
||||
assert(obj.kind == JObject)
|
||||
for i in 0..obj.fields.len-1:
|
||||
if obj.fields[i].key == key:
|
||||
obj.fields.delete(i)
|
||||
return
|
||||
raise newException(EInvalidIndex, "key not in object")
|
||||
|
||||
proc copy*(p: PJsonNode): PJsonNode =
|
||||
case p.kind
|
||||
of JString:
|
||||
result = newJString(p.str)
|
||||
of JInt:
|
||||
result = newJInt(p.num)
|
||||
of JFloat:
|
||||
result = newJFloat(p.fnum)
|
||||
of JBool:
|
||||
result = newJBool(p.bval)
|
||||
of JNull:
|
||||
result = newJNull()
|
||||
of JObject:
|
||||
result = newJObject()
|
||||
for key, field in items(p.fields):
|
||||
result.fields.add((key, copy(field)))
|
||||
of JArray:
|
||||
result = newJArray()
|
||||
for i in items(p.elems):
|
||||
result.elems.add(copy(i))
|
||||
|
||||
# ------------- pretty printing ----------------------------------------------
|
||||
|
||||
proc indent(s: var string, i: int) =
|
||||
|
||||
@@ -338,15 +338,15 @@ proc hMSet*(r: TRedis, key: string,
|
||||
r.sendCommand("HMSET", args)
|
||||
raiseNoOK(r.parseStatus())
|
||||
|
||||
proc hSet*(r: TRedis, key, field, value: string) =
|
||||
proc hSet*(r: TRedis, key, field, value: string): TRedisInteger =
|
||||
## Set the string value of a hash field
|
||||
r.sendCommand("HSET", key, field, value)
|
||||
raiseNoOK(r.parseStatus())
|
||||
return r.parseInteger()
|
||||
|
||||
proc hSetNX*(r: TRedis, key, field, value: string) =
|
||||
proc hSetNX*(r: TRedis, key, field, value: string): TRedisInteger =
|
||||
## Set the value of a hash field, only if the field does **not** exist
|
||||
r.sendCommand("HSETNX", key, field, value)
|
||||
raiseNoOK(r.parseStatus())
|
||||
return r.parseInteger()
|
||||
|
||||
proc hVals*(r: TRedis, key: string): TRedisList =
|
||||
## Get all the values in a hash
|
||||
|
||||
@@ -73,7 +73,7 @@ proc recvBuffer(s: var TScgiState, L: int) =
|
||||
scgiError("could not read all data")
|
||||
setLen(s.input, L)
|
||||
|
||||
proc open*(s: var TScgiState, port = TPort(4000)) =
|
||||
proc open*(s: var TScgiState, port = TPort(4000), address = "127.0.0.1") =
|
||||
## opens a connection.
|
||||
s.bufLen = 4000
|
||||
s.input = newString(s.buflen) # will be reused
|
||||
@@ -81,7 +81,7 @@ proc open*(s: var TScgiState, port = TPort(4000)) =
|
||||
s.server = socket()
|
||||
if s.server == InvalidSocket: scgiError("could not open socket")
|
||||
#s.server.connect(connectionName, port)
|
||||
bindAddr(s.server, port)
|
||||
bindAddr(s.server, port, address)
|
||||
listen(s.server)
|
||||
|
||||
proc close*(s: var TScgiState) =
|
||||
|
||||
@@ -179,19 +179,27 @@ proc bindAddr*(socket: TSocket, port = TPort(0), address = "") =
|
||||
## binds an address/port number to a socket.
|
||||
## Use address string in dotted decimal form like "a.b.c.d"
|
||||
## or leave "" for any address.
|
||||
var name: Tsockaddr_in
|
||||
when defined(Windows):
|
||||
name.sin_family = int16(ord(AF_INET))
|
||||
else:
|
||||
name.sin_family = posix.AF_INET
|
||||
name.sin_port = sockets.htons(int16(port))
|
||||
|
||||
if address == "":
|
||||
var name: Tsockaddr_in
|
||||
when defined(Windows):
|
||||
name.sin_family = int16(ord(AF_INET))
|
||||
else:
|
||||
name.sin_family = posix.AF_INET
|
||||
name.sin_port = sockets.htons(int16(port))
|
||||
name.sin_addr.s_addr = sockets.htonl(INADDR_ANY)
|
||||
if bindSocket(cint(socket), cast[ptr TSockAddr](addr(name)),
|
||||
sizeof(name)) < 0'i32:
|
||||
OSError()
|
||||
else:
|
||||
name.sin_addr.s_addr = parseIp4(address)
|
||||
if bindSocket(cint(socket), cast[ptr TSockAddr](addr(name)),
|
||||
sizeof(name)) < 0'i32:
|
||||
OSError()
|
||||
var hints: TAddrInfo
|
||||
var aiList: ptr TAddrInfo = nil
|
||||
hints.ai_family = toInt(AF_INET)
|
||||
hints.ai_socktype = toInt(SOCK_STREAM)
|
||||
hints.ai_protocol = toInt(IPPROTO_TCP)
|
||||
if getAddrInfo(address, $port, addr(hints), aiList) != 0'i32: OSError()
|
||||
if bindSocket(cint(socket), aiList.ai_addr, aiList.ai_addrLen) < 0'i32:
|
||||
OSError()
|
||||
|
||||
when false:
|
||||
proc bindAddr*(socket: TSocket, port = TPort(0)) =
|
||||
|
||||
Reference in New Issue
Block a user