sql.NullInt64
существует, потому что SQL null
нельзя представить как Go int
. Это третье состояние, которое не может быть представлено ни одним значением int
.
Одним из решений этой проблемы было бы представление таких значений SQL как *int
, но для этого потребовалось бы выделение для случаев, когда значение не равно null
в базе данных, и выделения плохо влияют на производительность.
Разработчики пакета SQL придумали решение NullInt64
, которое кодирует третье состояние нуля в качестве дополнительного Valid
логического значения. Это не хорошее решение, но лучшее, что мы можем получить.
Я не уверен, возможно ли написать маршаллер JSON для NullInt64
, который бы работал так, как вы ожидаете.
По-прежнему существует проблема «третьего состояния» при сортировке в JSON. С ,omitempty
было бы также опущено 0
int, так как вы можете отличить 0 от «не существует» / null?
В любом случае они не написали собственный маршаллер для NullInt64
, поэтому он просто кодирует как структура, которая это есть.
Вы можете создать тип псевдонима для NullInt64
, написать маршаллер JSON для кодирования того, как вы хотите, в JSON (вам нужен псевдоним, потому что вы не можете добавлять методы к типам из других пакетов). Вам также нужно будет разыграть между NullInt64
и sql.NullInt64
.
В настоящее время нет никакого способа проверить успешное выполнение [Выполненных] записей. Код просто регистрирует код выхода процесса и продолжает следующую запись (это может быть исследовано в исходном файле Установки Inno Main.pas, функцией является ProcessRunEntry (), запускающийся в строке 3404 в текущей версии 5.2.3).
Если необходимо удостовериться, что несколько выполнения msiexec были все успешны, необходимо будет кодировать промежуточный слой. Это может быть столь же просто как маленький тупик, который выполняется в [Выполнение] записи и запускает msiexec.exe с корректных параметров, ожидает процесса для окончания, затем пишет код возврата в файл.
Другой способ проверить на успех такого действия по установке состоял бы в том, чтобы добавить пользовательский вызов процедуры каждого [Выполнение] запись при помощи Параметра AfterInstall. В такой функции Вы могли, например, проверить, было ли управление OCX успешно установлено:
[Run]
Filename: "{tmp}\MyInstallation1.exe"; Parameters: "/foo"; AfterInstall: AfterMyInstallation1
[Code]
var
MyInstallation1Success: boolean;
procedure AfterMyInstallation1;
var
V: Variant;
begin
try
V := CreateOleObject('MyInstallation.InstalledOcxControl.1');
MyInstallation1Success := True;
except
MyInstallation1Success := False;
end;
end;
или ли каталоги и ключи реестра для зависимости - все там.
Каждый [Выполнение] запись только выполняется, когда ее дополнительный параметр Проверки действительно возвращает true. Таким образом в зависимости от Ваших потребностей Вы могли или начать все установки без диалогов один за другим, и после того, как последнее закончилось, выполняют функцию сценария, чтобы проверить, что все зависимости были успешно установлены; или Вы могли записать функцию проверки для каждой установки зависимости, которая затем возвратит false и таким образом пропустит все другие установки после первой неудавшейся.
Обратите внимание однако, что весь [Выполнение] записи выполняются после шагов для копирования файла и т.д. завершается реестр, пишущий, таким образом, Вы в основном уже закончены с установкой. Если Вы хотите действительно выполнить все свои действия по установке только, когда все зависимости правильно установлены, то необходимо было бы сделать это ранее в процессе, когда установка может все еще быть отменена.
Править: Проверьте вопрос, "Как Вы заставляете Установку Inno не выглядеть замороженной при выполнении длинного Должностного лица?" где некоторая информация дана, и демонстрационный сценарий связан с об использованием Должностного лица () функция для установки зависимостей. Таким образом, если Вы не используете [Выполнение] записи, там хороший шанс достигнуть того, что Вы хотите.