Title: msilib Fetch raises MSIError rather than return None
Type: behavior Stage: resolved
Components: Library (Lib) Versions: Python 2.7
Status: closed Resolution: duplicate
Dependencies: Superseder: Add support for _msi.Record.GetString() and _msi.Record.GetInteger()
View: 1102
Assigned To: Nosy List: Jason Matthew, berker.peksag
Priority: normal Keywords:

Created on 2017-01-24 18:54 by Jason Matthew, last changed 2017-02-01 19:34 by berker.peksag. This issue is now closed.

Messages (3)
msg286204 - (view) Author: Jason Matthew (Jason Matthew) Date: 2017-01-24 18:54
Fairly new to MSIs here.  Working towards extracting the same information which is available via Orca graphical interfaces.  

I believe I've hit a bug within _msi.View class, namely the inability to safely determine the number of records in my result.  

Examples I've found depicting how to obtain query results lead me to believe _msi.View.Fetch() will return None if no more rows exist.  My development using python 2.7.11, Windows 7 enterprise and 2.7.13, Windows Server 2016, has shown Fetch() will raise a msilib.MSIError when no more rows are available.  MSIError is commonly used within msilib which means explicit error handling (or leniency in this case) may incorrectly suppress other error scenarios.

Entering a bug with the hope either a patch addresses this issue or documentation can be updated to reflect proper usage.  Example provided below.

    >>> import msilib
    >>> db = msilib.OpenDatabase("msi-", msilib.MSIDBOPEN_READONLY)
    >>> v = db.OpenView("select * from Property")
    >>> v.Execute(None)
    >>> while 1:
    ...     r = v.Fetch()
    ...     if not r:break
    ...     print r.GetString(1)
    Traceback (most recent call last):
      File "<stdin>", line 2, in <module>
    _msi.MSIError: unknown error 103
msg286669 - (view) Author: Berker Peksag (berker.peksag) * (Python committer) Date: 2017-02-01 17:52
Thanks for the report, Jason. I think this is a duplicate of issue 1102. The second patch (_msi_fetch.patch.txt) there should fix your problem (if I read MSDN correctly, 103 is ERROR_NO_MORE_ITEMS.)

I don't have access to a Windows box at the moment so could you please verify my theory so we can close this as a duplicate?
msg286679 - (view) Author: Jason Matthew (Jason Matthew) Date: 2017-02-01 19:32
Thanks for pointing that one out Berker.  I agree, this is a dup.
Date User Action Args
2017-02-01 19:34:04berker.peksagsetsuperseder: Add support for _msi.Record.GetString() and _msi.Record.GetInteger()
stage: resolved
2017-02-01 19:32:23Jason Matthewsetstatus: open -> closed
resolution: duplicate
messages: + msg286679
2017-02-01 17:52:18berker.peksagsetnosy: + berker.peksag
messages: + msg286669
2017-01-24 18:54:25Jason Matthewcreate