How To Count And Delete Deletion Stubs

Тема в разделе "Работа с API", создана пользователем Akupaka, 16 май 2009.

  1. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Ниже представлен код, использующий Notes C API для получения/удаления т.з. Deletion Stub.
    Код рабочий, проверен в Notes 6.5.3. Думаю в 7-ке будет работать тоже. В 8-ке не знаю...

    How to count and delete deletion stubs

    Christophe Windelen wrote a blog entry a couple of years ago with a solution on how to delete deletion stubs for a Lotus Notes database. Take a look at his code to accomplish that, very nice!

    I have modified it just a little bit to be able to first choose which database to work on and then to choose if you only want to count or if you want to count and delete them

    (Options):
    Код (Text):
    Option Public
    Const wAPIModule = "NNOTES" ' Windows/32

    (Declarations):
    Declare Private Sub IDDestroyTable Lib wAPIModule Alias "IDDestroyTable" _
    ( Byval hT As Long)
    Declare Private Function IDScan Lib wAPIModule Alias "IDScan" _
    ( Byval hT As Long, Byval F As Integer, ID As Long) As Integer
    Declare Private Function NSFDbOpen Lib wAPIModule Alias "NSFDbOpen" _
    ( Byval P As String, hDB As Long) As Integer
    Declare Private Function NSFDbClose Lib wAPIModule Alias "NSFDbClose" _
    ( Byval hDB As Long) As Integer
    Declare Private Function NSFDbGetModifiedNoteTable Lib wAPIModule Alias "NSFDbGetModifiedNoteTable" _
    ( Byval hDB As Long, Byval C As Integer, Byval S As Currency, U As Currency, hT As Long) As Integer
    Declare Private Function NSFNoteDelete Lib wAPIModule Alias "NSFNoteDelete" _
    ( Byval hDB As Long, Byval N As Long, Byval F As Integer) As Integer
    Declare Private Function OSPathNetConstruct Lib wAPIModule Alias "OSPathNetConstruct" _
    ( Byval NullPort As Long, Byval Server As String, Byval FIle As String, Byval PathNet As String) As Integer
    Declare Private Sub TimeConstant Lib wAPIModule Alias "TimeConstant" _
    ( Byval C As Integer, T As Currency)
    Dim Db As NotesDatabase
    Initialize:
    Код (Text):
    Sub Initialize
    Dim Session As New NotesSession
    Dim ws As New NotesUIWorkspace
    Dim dbInfo As Variant
    Dim sDbServer As String
    Dim sDbPath As String
    Dim retVal As Integer

    dbInfo = ws.Prompt(13, "Choose database", "Choose a database")
    sDbServer = dbInfo(0)
    sDbPath = dbInfo(1)

    Set db = session.GetDatabase(sDbServer, sDbPath)

    retVal = ws.Prompt (PROMPT_YESNOCANCEL, _
    "Delete or just count?", _
    "Do you want to delete all of the deletion stubs in this database [Yes] or just count them [No]")

    Select Case retVal
    Case 1 : Call countAndDeleteStubs(db, 1)
    Case 0 : Call countAndDeleteStubs(db, 0)
    Case -1 : Msgbox "Operation cancelled"
    End Select

    End Sub
    countAndDeleteStubs:
    Код (Text):
    Sub countAndDeleteStubs(db As NotesDatabase, choice As Integer)
    Dim ever As Currency, last As Currency
    Dim hT As Long, RRV As Long, hDB As Long
    With db
    np$ = Space(1024)
    OSPathNetConstruct 0, db.Server, db.FilePath, np$
    End With
    NSFDbOpen np$, hDB
    TimeConstant 2, ever
    NSFDbGetModifiedNoteTable hDB, &H7FFF, ever, last, hT
    n& = 0
    done = (IDScan(hT, True, RRV) = 0)
    While Not done
    If RRV < 0 Then
    If (choice = 1) Then
    NSFNoteDelete hDB, RRV And &H7FFFFFFF, &H0201
    End If
    n& = n& + 1
    End If
    done = (IDScan(hT, False, RRV) = 0)
    Wend
    IDDestroyTable hT
    NSFDbClose hDB

    If (choice = 1) Then
    Msgbox "Deleted " & Cstr(n&) & " stubs in database " & db.FilePath & " on server " & db.Server
    Else
    Msgbox "Database " & db.FilePath & " on server " & db.Server & " contains " & Cstr(n&) & " stubs"
    End If

    End Sub
    взято отсюда
    http://www.wohill.com/design/272/How-to-co...tion-stubs.html
     
  2. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    Данный код не работает WinServer2008 64 и Domino 8.5.2 64.
    Вешает Агент Менеджер.

    Может знает кто как вылечить?)
     
  3. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    Использую скрипт удаления стабов:
    http://codeby.net/forum/threads/30190.html

    Сечас идет тест миграции с 8.0.2x32 на 8.5.2x64.

    Данный скрипт на некоторое время вешает систему (запуск на сервере) на строке:
    NSFDbGetModifiedNoteTable hDB, &H7FFF, ever, last, hT

    После чего агент постоянно висит.

    Может кто сталкивался...
    Или прошу поделиться идеями.

    заранее спасибо.
     
  4. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    Под 64бит хэндлы стали тоже 64 бит вместо 32. Соответственно, в декларациях их надо заменить на структуру. Что-то вроде

    Код (LotusScript):
    Type HANDLE64
    hLo as Long
    hHi as Long
    End Type

    Declare Private Function NSFDbOpen Lib wAPIModule Alias "NSFDbOpen" _
    ( Byval P As String, hDB As HANDLE64) As Integer
    Либо любой другой тип данных подходящей размерности.
    Через Type можно задать параметр любой размерности, а для приведённого примера можно исп. и Double
     
  5. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    Код (LotusScript):
    Const wAPIModule = "NNOTES" ' Windows/32
    Type HANDLE64
    hLo As Long
    hHi As Long
    End Type
    Declare Private Sub IDDestroyTable Lib wAPIModule Alias "IDDestroyTable" (Byval hT As Long)
    Declare Private Sub TimeConstant Lib wAPIModule Alias "TimeConstant" (Byval C As Integer, T As Currency)
    Declare Private Function IDScan Lib wAPIModule Alias "IDScan" (Byval hT As Long, Byval F As Integer, ID As Long) As Integer
    Declare Private Function NSFDbOpen Lib wAPIModule Alias "NSFDbOpen" (Byval P As String, hDB As HANDLE64) As Integer
    Declare Private Function NSFDbClose Lib wAPIModule Alias "NSFDbClose" (hDB As HANDLE64) As Integer
    Declare Private Function NSFDbGetModifiedNoteTable Lib wAPIModule Alias "NSFDbGetModifiedNoteTable" (hDB As HANDLE64, Byval C As Integer, Byval S As Currency, U As Currency, hT As Long) As Integer
    Declare Private Function NSFNoteDelete Lib wAPIModule Alias "NSFNoteDelete" (hDB As HANDLE64, Byval N As Long, Byval F As Integer) As Integer
    Function DeleteStubs(db As NotesDatabase, choice As Integer) As Double
    Dim ever As Currency, last As Currency
    Dim hT As Long, RRV As Long, hDB As HANDLE64

    Call NSFDbOpen(db.Server + "!!" + db.FilePath, hDB)

    Call TimeConstant(1, ever)

    Call NSFDbGetModifiedNoteTable(hDB, &H7FFF, ever, last, hT)

    n& = 0

    done = (IDScan(hT, True, RRV) = 0)
    While Not done
    If RRV < 0 Then
    If (choice = 1) Then
    Call NSFNoteDelete(hDB, RRV And &H7FFFFFFF, &H0201)
    End If
    n& = n& + 1
    End If
    done = (IDScan(hT, False, RRV) = 0)
    Wend

    Call IDDestroyTable(hT)

    Call NSFDbClose(hDB)

    DeleteStubs = n&
    End Function
    Таже фигня...
     
  6. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    ByVal потерян. Я поторописля, в LS не удаётся передать Type по значению. Значит просто меняем на Double или Currency.

    Код (LotusScript):
    Declare Private Function NSFDbGetModifiedNoteTable Lib wAPIModule Alias "NSFDbGetModifiedNoteTable" (Byval hDB As Double, Byval C As Integer, Byval S As Currency, U As Currency, hT As Long) As Integer
     
  7. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    А двухэлементный массив long'ов не подойдёт? В объявлении использовать Any.
     
  8. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    Double и Currency ведут себя аналогично(
     
  9. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    >В объявлении использовать Any.
    Так значения будет передаваться по ссылке.

    >Double и Currency ведут себя аналогично
    Дык ещё и hT надо к правильной размерности привести
     
  10. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    ByVal никто не отменял.
     
  11. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    Привел.
    Результат тот же
     
  12. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    >ByVal никто не отменял.
    Для Any отменял.
     
  13. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
  14. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    >Справка дизайнера с Вами не согласна:

    Справка то согласна (тыц):
    Arguments of type Any are always passed by reference, regardless of the type of data they contain.
     
  15. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Значит у бимеров левая нога не знает, что пишет правая B)
     
  16. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    А мб, в 8ке просто переделали по сравнению с 7кой? Это надо пробовать.
     
  17. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    >Под 64бит хэндлы стали тоже 64 бит вместо 32.
    Неправда насчет доминошных, цитаты из Notes С API (8.5.3):
    А вот указатели - да, будут 64бит под 64битную платформу.
     
  18. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
  19. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    а если еще вот так:
    Код (LotusScript):
    Type TIMEDATE
    Innards0 As Long
    Innards1 As Long
    End Type
    Толька для retUntil сделать, а остальное оставить как было в оригинале.
     
  20. Мыш

    Мыш Lotus team
    Lotus team

    Регистрация:
    12 фев 2008
    Сообщения:
    1.020
    Симпатии:
    8
    Че-то они мну запутали :) Выходит, что для хэндлов long можно передавать ByVal, для указателей - Double, но использовать возвращаемые значения (судя по кэйзу), не получится?

    Во чего нарыл... Ответ как-то удручает... :) Опять же, непонятно - проблемв только с этой ф-цией или с API, в целом?
    И на закуску - Вот это Мораль: 64-бита - "это не наш метод". По крайней мере, на текущий момент...
     
Загрузка...

Поделиться этой страницей