Как Изменить Место Хранения Session.setenvironmentvar

Тема в разделе "Lotus - Программирование", создана пользователем PaKo, 16 сен 2014.

  1. PaKo

    PaKo Well-Known Member

    Регистрация:
    29 апр 2005
    Сообщения:
    59
    Симпатии:
    0
    В одной из БД использу. session.setEnvironmentVar
    В справке написано что хранит в notes.ini или Preferences file

    Беда в том что при сохранении в notes.ini он быстро достигает 32К и потом "бьется". Приходится перенастраивать клиент.
    Юзьверей раздражает да и самому надоело бегать к ним.

    Вопросы - можно ли увеличить размер notes.ini и как заюзать "Preferences file"
     
  2. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    PaKo
    Зачем такие объемы писать в Notes.ini? Другие же варианты всегда есть.

    Notes Preferences - это название notes.ini в MacOS, да и думаю что в Linux тоже.
    Так что ответ прост - никак.

    Добавлено: Подозреваю что не бьется notes.ini, просто значения в переменной слишком большое.
     
  3. PaKo

    PaKo Well-Known Member

    Регистрация:
    29 апр 2005
    Сообщения:
    59
    Симпатии:
    0
    Нет.
    Обьемы там маленькие (за раз)
    Пишется всего лишь одна строчка вида:
    $37A1CEE9A269768343257D3B003CC1C3=398562
    $C22577EE002EFD9243257CE500373F4E=1576888
    $C60547C6D880243E46257D4000316206=788508
    $C6053E959955BEFA43257CD7004E6227=788508
    $653F499B2D11FF1743257D2A0021969E=595058
    $5D3A8C1ED128C0E946257D40003905A1=854536
    $143EFE368755037246257D4100161FA7=724646

    но таких строк со временем собирается довольно много.

    И когда достигается 32к размер notes.ini начинает иться строка
    Directory=
    и прочие...

    Вот и надо как то решить. Может можно как т опрограммно удалять их?
     
  4. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    PaKo
    Не можно, а нужно!
    Когда работа с переменной полностью завершена необходимо записать в неё пустую строку - это её удалит.
    Код (LotusScript):
    Setenvironmentvar(<имя переменной>, "", false)
     
  5. alexas1

    alexas1 Lotus team
    Lotus team

    Регистрация:
    10 апр 2014
    Сообщения:
    562
    Симпатии:
    214
    PaKo
    Не стоит использовать notes.ini не по назначению, как произвольный буфер данных.
    Profile Documents & Мessage Queue решают все задачи, кроме псевдо-динамических вьюшек.
    Да и там Environment лучше не применять.
    Хотя, у Вас база "чужая"...
    Если уж дорабатывать, то не добавлением в код удаления переменной, а заменой места хранения (конечно, если это не въюшки)
     
  6. PaKo

    PaKo Well-Known Member

    Регистрация:
    29 апр 2005
    Сообщения:
    59
    Симпатии:
    0
    savl
    Попробую этот вариант.

    alexas1
    Что значит "чужая".

    Можно подробнее про
    ?

    Добавлено: savl
    Проверил. Помогло! + к вашей карме!
     
  7. alexas1

    alexas1 Lotus team
    Lotus team

    Регистрация:
    10 апр 2014
    Сообщения:
    562
    Симпатии:
    214
    1 "Чужая" - в смысле, как я понял, не Вы автор.
    MQ - штатный механизм передачи сообщений на сервере при помощи стека MQ by IBM
    На клиенте он тоже применим.
    В кратце, MQ запоминает в памяти сервера (или клиента) в стеке "последний пришёл - первый ушёл" строки в 32 байта (сервер там временно хранит UNIDs)
    После чтения сообщения, оно удаляется из стека.
    MQ может быть несколько и они могут быть "личными" (с ключом UserName), по аналогии с UserProfile.
    Могут висеть и в клиенте и на сервере.

    2 Хранить временные данные в профильных документах оч удобно. (В том числе и для передачи данных из одного скрипта в другой, например когда работа скриптов "разорвана" работой юзера в UI)
    Общие данные - в общих профайлах, личные, соответственно - в личных.
    Надо иметь в виду, что Profile Document кешируется в памяти при первом обращении к нему. Это надо иметь в виду при использования общих профайлов. Иначе произойдёт ситуация когда user1 его изменил, а после этого user2 изменения может не увидеть, если до этого он уже читал инфу из него, поскольку чтение будет происходить уже из кешированного (для этого юзера) в памяти общего профайла.
    Как это обойти, на форуме разбиралось.
    В случае личного профайла - никаких проблем нет. Более того, поскольку используется кеш, работа с данными в профайле происходит оч быстро (если принудительно не "сохранять" профайл).

    3 Иногда Environment используют в формулах отбора вьюшек (хотя это и не рекомендовано вендором) для организации некоторой "динамичности". Это плохо, потому, что увеличивает время "открытия" из за того, что скрипт лезет в файловую систему и индекс вида перестраивается на каждое открытие. К тому же фича не документирована, наверное не спроста. Я от этого давно отказался. Но "хозяин - барин"
    =====================
    Работа с Profile Document в хелпе освещена оч хорошо. Посмотрите, если не знакомы.

    P.S. кста, тут на форуме MQ
     
  8. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    с оговорками - надо задействовать СиАПИ, на java пробовал писать - не взлетело (на клиенте точно)
    это если поднять вебсферу
     
  9. alexas1

    alexas1 Lotus team
    Lotus team

    Регистрация:
    10 апр 2014
    Сообщения:
    562
    Симпатии:
    214
    lmike Да.

    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Я использую такую библу</div></div><div class="sp-body"><div class="sp-content">
    Код (Text):
    Option Public
    ' -----------------------------------------------------------------------------------
    ' Реализация класса по работе с очередью сообщений
    ' -----------------------------------------------------------------------------------
    ' Константы
    ' -----------------------------------------------------------------------------------
    Private Const MQ_MAX_MSGSIZE = &HF0 '(MAXONESEGSIZE - 0x40)
    Private Const NOPRIORITY = &HFFFF ' MAXWORD
    'Private Const ERR_MQ_POOLFULL = 1024 + 94 '"Insufficient memory - Message Queue pool is full."
    'Private Const ERR_MQ_TIMEOUT = 1024 + 95 '"Timeout occurred waiting for message.")
    'Private Const ERR_MQSCAN_ABORT = 1024 + 96 'Message Queue scan was aborted.")
    Private Const ERR_DUPLICATE_MQ = 1024 + 97 '"Message Queue name already in use.")
    'Private Const ERR_NO_SUCH_MQ = 1024 + 98 '"No Message Queue with that name.")
    'Private Const ERR_MQ_EXCEEDED_QUOTA = 1024 + 99 '"Message Queue is full.")
    Private Const ERR_MQ_EMPTY = 1024 + 100 '"Message Queue is empty.")
    'Private Const ERR_MQ_BFR_TOO_SMALL = 1024 + 101 '"Message is larger than the buffer provided.")
    Private Const ERR_MQ_QUITTING = 1024 + 102 '"Quit is pending on the Message Queue")



    ' -----------------------------------------------------------------------------------
    ' api - функции
    ' -----------------------------------------------------------------------------------
    Declare Function apiMQCreate Lib "nnotes.dll" Alias "MQCreate" (Byval QueueName As String, Byval Quota As Integer, Byval Options As Long) As Integer
    Declare Function apiMQOpen Lib "nnotes.dll" Alias "MQOpen" (Byval QueueName As String, Byval Options As Long, RetQueue As Long) As Integer
    Declare Function apiMQClose Lib "nnotes.dll" Alias "MQClose" (Byval Queue As Long, Byval Options As Long) As Integer
    Declare Function apiMQPut Lib "nnotes.dll" Alias "MQPut" (Byval Queue As Long, Byval Priority As Integer, Byval Buffer As Lmbcs String, Byval Length As Integer, Byval Options As Long) As Integer
    Declare Function apiMQGet Lib "nnotes.dll" Alias "MQGet" (Byval Queue As Long, Byval Buffer As Lmbcs String, Byval BufLength As Integer, Byval Options As Long, Byval timeout As Long, retMsgLength As Integer) As Integer
    'Private Declare Function apiMQPutQuitMsg Lib "nnotes.dll" Alias "MQPutQuitMsg" (ByVal Queue As Long)
    'Private Declare Function apiMQIsQuitPending Lib "nnotes.dll" Alias "MQIsQuitPending" (ByVal Queue As Long) As Integer
    Declare Function apiMQGetCount Lib "nnotes.dll" Alias "MQGetCount" (Byval Queue As Long) As Integer'

    Declare Function apiOSLoadString Lib "nnotes.dll" Alias "OSLoadString" (Byval hModule As Long, Byval StringCode As Integer, Byval retBuffer As Lmbcs String, Byval BufferLength As Integer) As Integer'NotesMessageQueue


    ' -----------------------------------------------------------------------------------
    ' NotesMessageQueue - класс для создания очереди сообщений
    ' -----------------------------------------------------------------------------------
    Public Class NotesMessageQueue
    Private hMQ As Long
    Private mName As String
    Private misOwner As Integer
    Private mAutoClose As Integer

    Public Property Get QueueName As String 'название очереди
    QueueName = mName
    End Property

    Public Property Get isOwner As Integer  'Флаг что очередб создана этим объектом
    isOwner = misOwner
    End Property

    Public Property Get AutoClose As Integer 'очередь закрывает владелец в деструкторе
    AutoClose = mAutoClose
    End Property

    Public Property Set AutoClose As Integer
    mAutoClose = AutoClose
    End Property

    Public Property Get Messages As Integer  'число сообщений в очереди
    If hMQ<>0 Then Messages=apiMQGetCount(hMQ)
    End Property

    Public Property Get Message As String 'чтение сообщений из очереди
    Dim msg As String
    Dim ret As Integer
    Dim status As Integer

    msg = Space(MQ_MAX_MSGSIZE-1) + Chr(0)
    apiCall "MQGet:"+mName, apiMQGet(hMQ, msg, MQ_MAX_MSGSIZE, 0, 0, ret)
    Message=Left(msg,ret)
    End Property

    Public Property Set Message As String
    If Message<>"" Then apiCall "MQPut:"+mName, apiMQPut(hMQ, NOPRIORITY, Message, Lenb(Message), 0 )
    End Property

    Sub New(MQName As String)
    Dim status As Integer

    misOwner=True
    mAutoClose=True
    mName=Trim( mqName)

    If Len(mName)>0 Then
    status= apiMQCreate(mName,NOPRIORITY,0)
    If status=ERR_DUPLICATE_MQ Then misOwner=False
    apiCall "MQOpen", apiMQOpen(mName,0,hMQ)
    Else
    Error 1024+110,"MessageQueue name is empty string…"
    End If

    End Sub

    Sub Delete
    If misOwner And mAutoClose And hMQ<>0 Then Call apiMQClose(hMQ,0)
    End Sub
    End Class

    ' -----------------------------------------------------------------------------------
    ' NotesUIMessageQueue - базовый класс для UI
    ' -----------------------------------------------------------------------------------
    Public Class NotesUIMessageQueue As NotesMessageQueue
    Private nTimer As NotesTimer
    Private mList List As String
    Private mListCount As Integer

    Public Property Get Message As String
    Dim msg As String

    msg=NotesMessageQueue..Message
    If msg<>"" Then
    mList(Cstr(mListCount))=msg
    mListCount=mListCount+1
    End If

    Message=msg
    End Property

    Public Property Get MessageList As Variant
    MessageList=mList
    End Property

    Public Property Get MessageListCount As Integer
    MessageListCount=mListCount
    End Property

    ' Method for overloading
    Public Sub OnMessageAction
    Print mName+":", Me.Message
    End Sub

    Sub New(MQName As String, checkInterval As Integer) , NotesMessageQueue(MQName)
    Set nTimer = New NotesTimer(checkInterval)
    On Event Alarm From nTimer Call nAlarm
    End Sub

    Private Sub nAlarm(pTimer As NotesTimer)
    pTimer.Enabled=False
    If NotesMessageQueue..Messages>0 Then Call Me.OnMessageAction
    ' While NotesMessageQueue..Messages>0
    ' mList(Cstr(mListCount))=NotesMessageQueue..Message
    ' mListCount=mListCount+1
    ' Wend

    pTimer.Enabled=True
    End Sub
    End Class 'NotesUIMessageQueue
    Private Sub apiCall(apiCallName As String, Status As Integer)
    ' функция обработки ошибок CAPI, содрана и переделана у D. Katz
    'This function takes the 16-bit status value (set by returning from most api function calls), and returns the "english" version of the error.
    Dim Err_Mask As Integer
    Dim errorStr As String

    If Status = 0 Then Exit Sub
    'Strip the two highest-order bits from status (remember, status is only 16 bits total). Those two bits show location of the error (local or remote server, etc.)
    'They should be stripped so that the reference number of the error can be looked up appropriately.
    Err_Mask = &H3FFF
    Status = Status And Err_Mask

    'We need to pass the C function a string it can overwrite (so that the memory for the string is already allocated when the OSLoadString is called)
    errorStr =String(255,Clng(0))
    Status = apiOSLoadString(0, Status, errorStr, Len(errorStr) - 1)
    'Error Status, apiCallName + "::"+errorStr

    End Sub 'apiCall
     
  10. ty3uk

    ty3uk Well-Known Member

    Регистрация:
    31 мар 2008
    Сообщения:
    169
    Симпатии:
    0
    аха, сразу упираемся в использование тока на винде.

    По профайлам. С самого начала своего программинга, использовал профайлы для хранения настроек базы. Но, пришлось отказаться. С профайлами твориться какая-та фигня, они как-то задваиваются (возможно связано с кэшированием или ещё с чем, но пляски с бубном более чем на 300-та компах, распределённых по городам и офисам, это перебор). Из замеченного: доступ у пользвоателей на базу на уровне автора, у админа на полную. Первый профайл работает нормально. Но, когда админ меняет в профайле значение, некоторые клиенты, не видят изменения. При этом, если у пользователя уровень едитор и выше, то всё нормально (но тут начинаются проблемы с безопасностью в базе, т.к. категорически сложно сделать нормальный воркфло, когда пользвоатели имеют едиторский доступ до базы)
    В итого сделал профили обычными документами, работает нормально. Вопрос с скоростью не поднимался.
     
  11. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    отнюдь, здесь выкладывали для мака, я расширял до линуха, выложу позже, с разрядностью параметров для вызова надо смотреть (т.е. все исполняется, но возможны завороты стека)
     
  12. alexas1

    alexas1 Lotus team
    Lotus team

    Регистрация:
    10 апр 2014
    Сообщения:
    562
    Симпатии:
    214
    "Просто Вы не умеете их готовить"(с) :angry2:
    В кешировании и удобном и быстром доступе по имени/ключу и есть их "сила".
    При работе с общими профайлами о кеши надо помнить всегда.
    С личными всё проще.
    Однозначный Must Have.
     
Загрузка...

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