Как возвращать результаты вместе с операциями обновления в BaseX?

Я узнал, что ( insert/ delete) — XQueries, выполняемые с клиентом BaseX, всегда возвращают пустую строку. Я нахожу это очень запутанным или неинтуитивным.

Есть ли способ узнать, был ли запрос «успешным», не запрашивая базу данных снова (и используя потенциально багговую» транзитивную «логику, такую как»если я удалил узел, в XML должны быть» oldNodeCount-1 «узлы»)?

1 ответ

  1. Инструкции XQuery Update ничего не возвращают-так они определены. Но вы не единственный, кто не любит эти ограничения, и BaseX добавил два способа обойти это ограничение:

    возвращаемый результат

    По умолчанию невозможно смешивать различные типы выражений
    в результате запроса. Внешнее выражение запроса должно быть
    набор обновляющихся или не обновляющихся выражений. Но есть
    два выхода:

    • Функция BaseX-specific update:output()устраняет этот пробел: она кэширует результаты своих аргументов во время выполнения и возвращает их после
      все обновления обработаны. В следующем примере выполняется
      обновление и возвращает сообщение об успехе:

      update:output("Update successful."), insert node <c/> into doc('factbook')/mondial
      
    • С помощью этой MIXUPDATESопции все ограничения обновления будут отключены. Возвращенные узлы будут скопированы до их изменения
      обновление выражений. Если элементы возвращаются в пределах
      выражение преобразования.

    Если вы хотите изменить узлы в основной памяти, вы можете использовать transform
    выражение
    .

    Выражение transform не поможет вам, так как вы, кажется, изменить данные на диске . Включение MIXUPDATESпозволяет одновременно обновлять документ и возвращать что-то, например, запускать что-то вроде

    let $node := <c/>
    return ($node, insert node $node into doc('factbook')/mondial)
    

    MIXUPDATES позволяет вернуть что-то, что может быть дополнительно обработано. Результаты копируются перед возвращением, если вы выполняете несколько операций обновления и не получаете ожидаемых результатов, убедитесь, что вы получили концепцию списка ожидающих обновлений .

    db:output()Функция намеренно разрывает свой контракт интерфейса: она определяется как функция обновления (не имеющая выходных данных), но в то же время она выводит некоторую информацию в информацию запроса. Вы не можете дополнительно обработать эти результаты, но выходные данные могут помочь вам отладить некоторые проблемы.

    Список Ожидающих Обновлений

    В обоих случаях вы не сможете получить немедленный результат от обновления, вы должны добавить что-то самостоятельно-и имейте в виду, что обновления не видны, пока не будет применен список ожидающих обновлений, т. е.. после завершения запроса.

    Совместимость

    Очевидно, что эти варианты являются BaseX-конкретными. Если сильно требуется совместимый и стандартный XQuery, нельзя использовать эти выражения.