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

PaKo

Well-known member
29.04.2005
59
0
#1
В одной из БД использу. session.setEnvironmentVar
В справке написано что хранит в notes.ini или Preferences file

which are stored in the local notes.ini or Preferences file
Беда в том что при сохранении в notes.ini он быстро достигает 32К и потом "бьется". Приходится перенастраивать клиент.
Юзьверей раздражает да и самому надоело бегать к ним.

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

savl

Lotus team
28.10.2011
2 136
105
#2
PaKo
Зачем такие объемы писать в Notes.ini? Другие же варианты всегда есть.

Otherwise, a new environment variable is added to the notes.ini (or Notes Preferences) file.
Notes Preferences - это название notes.ini в MacOS, да и думаю что в Linux тоже.
Так что ответ прост - никак.

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

PaKo

Well-known member
29.04.2005
59
0
#3
Нет.
Обьемы там маленькие (за раз)
Пишется всего лишь одна строчка вида:
$37A1CEE9A269768343257D3B003CC1C3=398562
$C22577EE002EFD9243257CE500373F4E=1576888
$C60547C6D880243E46257D4000316206=788508
$C6053E959955BEFA43257CD7004E6227=788508
$653F499B2D11FF1743257D2A0021969E=595058
$5D3A8C1ED128C0E946257D40003905A1=854536
$143EFE368755037246257D4100161FA7=724646

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

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

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

savl

Lotus team
28.10.2011
2 136
105
#4
PaKo
Не можно, а нужно!
Когда работа с переменной полностью завершена необходимо записать в неё пустую строку - это её удалит.
Код:
Setenvironmentvar(<имя переменной>, "", false)
 

alexas1

Lotus team
10.04.2014
726
145
#5
PaKo
Не стоит использовать notes.ini не по назначению, как произвольный буфер данных.
Profile Documents & Мessage Queue решают все задачи, кроме псевдо-динамических вьюшек.
Да и там Environment лучше не применять.
Хотя, у Вас база "чужая"...
Если уж дорабатывать, то не добавлением в код удаления переменной, а заменой места хранения (конечно, если это не въюшки)
 

PaKo

Well-known member
29.04.2005
59
0
#6
savl
Попробую этот вариант.

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

Можно подробнее про
Profile Documents & Мessage Queue решают все задачи, кроме псевдо-динамических вьюшек.
?

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

alexas1

Lotus team
10.04.2014
726
145
#7
1 "Чужая" - в смысле, как я понял, не Вы автор.
MQ - штатный механизм передачи сообщений на сервере при помощи стека MQ by IBM
На клиенте он тоже применим.
В кратце, MQ запоминает в памяти сервера (или клиента) в стеке "последний пришёл - первый ушёл" строки в 32 байта (сервер там временно хранит UNIDs)
После чтения сообщения, оно удаляется из стека.
MQ может быть несколько и они могут быть "личными" (с ключом UserName), по аналогии с UserProfile.
Могут висеть и в клиенте и на сервере.

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

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

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

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#8
MQ - штатный механизм передачи сообщений на сервере при помощи стека MQ by IBM
с оговорками - надо задействовать СиАПИ, на java пробовал писать - не взлетело (на клиенте точно)
P.S. кста, тут на форуме MQ
это если поднять вебсферу
 

alexas1

Lotus team
10.04.2014
726
145
#9
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">
Код:
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
 

ty3uk

Well-known member
31.03.2008
170
0
#10
Я использую такую библу
аха, сразу упираемся в использование тока на винде.

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

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#11
аха, сразу упираемся в использование тока на винде.
отнюдь, здесь выкладывали для мака, я расширял до линуха, выложу позже, с разрядностью параметров для вызова надо смотреть (т.е. все исполняется, но возможны завороты стека)
 

alexas1

Lotus team
10.04.2014
726
145
#12
С профайлами твориться какая-та фигня, они как-то задваиваются (возможно связано с кэшированием или ещё с чем
"Просто Вы не умеете их готовить"(с) :angry2:
В кешировании и удобном и быстром доступе по имени/ключу и есть их "сила".
При работе с общими профайлами о кеши надо помнить всегда.
С личными всё проще.
Однозначный Must Have.