mirror of
https://github.com/waku-org/nwaku.git
synced 2025-03-01 15:30:55 +00:00
* queue driver refactor (#2753) * chore(archive): archive refactor (#2752) * chore(archive): sqlite driver refactor (#2754) * chore(archive): postgres driver refactor (#2755) * chore(archive): renaming & copies (#2751) * posgres legacy: stop using the storedAt field * migration script 6: we still need the id column The id column is needed because it contains the message digest which is used in store v2, and we need to keep support to store v2 for a while * legacy archive: set target migration version to 6 * waku_node: try to use wakuLegacyArchive if wakuArchive is nil * node_factory, waku_node: mount legacy and future store simultaneously We want the nwaku node to simultaneously support store-v2 requests and store-v3 requests. Only the legacy archive is in charge of archiving messages, and the archived information is suitable to fulfill both store-v2 and store-v3 needs. * postgres_driver: adding temporary code until store-v2 is removed --------- Co-authored-by: Ivan FB <128452529+Ivansete-status@users.noreply.github.com> Co-authored-by: gabrielmer <101006718+gabrielmer@users.noreply.github.com> Co-authored-by: Ivan Folgueira Bande <ivansete@status.im>
89 lines
2.8 KiB
Nim
89 lines
2.8 KiB
Nim
when (NimMajor, NimMinor) < (1, 4):
|
|
{.push raises: [Defect].}
|
|
else:
|
|
{.push raises: [].}
|
|
|
|
import std/[strutils, options], regex, results
|
|
import
|
|
../retention_policy,
|
|
./retention_policy_time,
|
|
./retention_policy_capacity,
|
|
./retention_policy_size
|
|
|
|
proc new*(
|
|
T: type RetentionPolicy, retPolicy: string
|
|
): RetentionPolicyResult[Option[RetentionPolicy]] =
|
|
let retPolicy = retPolicy.toLower
|
|
|
|
# Validate the retention policy format
|
|
if retPolicy == "" or retPolicy == "none":
|
|
return ok(none(RetentionPolicy))
|
|
|
|
const StoreMessageRetentionPolicyRegex = re2"^\w+:\d*\.?\d+((g|m)b)?$"
|
|
if not retPolicy.match(StoreMessageRetentionPolicyRegex):
|
|
return err("invalid 'store message retention policy' format: " & retPolicy)
|
|
|
|
# Apply the retention policy, if any
|
|
let rententionPolicyParts = retPolicy.split(":", 1)
|
|
let
|
|
policy = rententionPolicyParts[0]
|
|
policyArgs = rententionPolicyParts[1]
|
|
|
|
if policy == "time":
|
|
var retentionTimeSeconds: int64
|
|
try:
|
|
retentionTimeSeconds = parseInt(policyArgs)
|
|
except ValueError:
|
|
return err("invalid time retention policy argument")
|
|
|
|
let retPolicy: RetentionPolicy = TimeRetentionPolicy.new(retentionTimeSeconds)
|
|
return ok(some(retPolicy))
|
|
elif policy == "capacity":
|
|
var retentionCapacity: int
|
|
try:
|
|
retentionCapacity = parseInt(policyArgs)
|
|
except ValueError:
|
|
return err("invalid capacity retention policy argument")
|
|
|
|
let retPolicy: RetentionPolicy = CapacityRetentionPolicy.new(retentionCapacity)
|
|
return ok(some(retPolicy))
|
|
elif policy == "size":
|
|
var retentionSize: string
|
|
retentionSize = policyArgs
|
|
|
|
# captures the size unit such as GB or MB
|
|
let sizeUnit = retentionSize.substr(retentionSize.len - 2)
|
|
# captures the string type number data of the size provided
|
|
let sizeQuantityStr = retentionSize.substr(0, retentionSize.len - 3)
|
|
# to hold the numeric value data of size
|
|
var inptSizeQuantity: float
|
|
var sizeQuantity: int64
|
|
var sizeMultiplier: float
|
|
|
|
try:
|
|
inptSizeQuantity = parseFloat(sizeQuantityStr)
|
|
except ValueError:
|
|
return err("invalid size retention policy argument: " & getCurrentExceptionMsg())
|
|
|
|
case sizeUnit
|
|
of "gb":
|
|
sizeMultiplier = 1024.0 * 1024.0 * 1024.0
|
|
of "mb":
|
|
sizeMultiplier = 1024.0 * 1024.0
|
|
else:
|
|
return err (
|
|
"""invalid size retention value unit: expected "Mb" or "Gb" but got """ &
|
|
sizeUnit
|
|
)
|
|
|
|
# quantity is converted into bytes for uniform processing
|
|
sizeQuantity = int64(inptSizeQuantity * sizeMultiplier)
|
|
|
|
if sizeQuantity <= 0:
|
|
return err("invalid size retention policy argument: a non-zero value is required")
|
|
|
|
let retPolicy: RetentionPolicy = SizeRetentionPolicy.new(sizeQuantity)
|
|
return ok(some(retPolicy))
|
|
else:
|
|
return err("unknown retention policy")
|