Passer au contenu principal

Récupérer et mettre à jour atomiquement une ligne (LCC.db.fetch_one)

Déclaration​

row, err = LCC.db.fetch_one(name, opts, timeout?)

Paramètres​

  • name
    Type chaîne, nom de la table, non vide et limité à 256 octets
  • opts
    Type table contenant les champs suivants :
    • conditions : type table, conditions de filtrage par égalité, {} par défaut
    • update : type table, ensemble de champs à mettre à jour après une récupération réussie
    • pick : type chaîne, peut être "min" / "max" / "random", "min" par défaut ; sélectionne les enregistrements selon id
  • timeout
    Type numérique, facultatif ; délai d'attente de la demande en secondes, 60 par défaut

Valeurs de retour​

  • row
    Type table, ligne récupérée ; nil en cas d'échec ou si aucune ligne ne correspond
  • err
    Type chaîne ou nil, description de l'erreur en cas d'échec. En l'absence de correspondance, renvoie 'not found' ; si la table n'existe pas, renvoie 'unknown table'

Description​

Lit et met à jour atomiquement une ligne, pour les scénarios concurrents tels que la récupération de tâches.
Le champ update est écrit immédiatement après la lecture afin d'empêcher l'attribution répétée d'une même ligne.
Sans update, une ligne est tout de même sélectionnée atomiquement, mais aucun champ n'est réécrit.

Exemple​

local row, err = LCC.db.fetch_one("任务表", {
conditions = { 状态 = "空闲" },
update = { 状态 = "进行中" },
pick = "min"
})
if row then
print("领取任务", row.id, row.名称)
elseif err == "not found" then
print("暂无空闲任务")
end