Obj Tips

anim-bulbglow.gif (80393 bytes)

Acacia is happy to provide programming tips. Help others by adding your own tips to this page.


The tips shown here are for information only and should be tested thoroughly before use in any production environment.

Last updated 18:07:39-20/12/2008

Click here to add your own tips.

Click to search the Acacia site
Click to search using Google

Obj Tips

Tips for configuration and tuning of Objective client and server.

Tip Details
Adding indexer stop words
Geoff
You add stop words by creating a style.stp file in the collections "style" directory. This is a simple text file with each stop word on a separate line.

Add the style.stp file to the common/style, common/textfld and common/chargate directories so stop words are added next time the index is re-built.
Adding Indexer Stop Words
Geoff
You add stop words by creating a style.stp file in the collections "style" directory. This is a simple text file with each stop word on a separate line.  This will stop the indexer from indexing these words.  Beware when you reindex because the file will be blown away!
Change Name Contains seaching to use Oracle
GC
UPDATE type_operators
SET id_base_operator = '4'
WHERE id_type = 'dotiA12'
AND text_label = 'CONTAINS';
Check Index is OK
Geoff
To check if the index is OK use
./rcvdk -vdkhome ../common
RC>s <in> 869251 (finds number in collection)
RC>q (to quit)

./objmgr user password
>te 869251
Check you are on the correct instance
Geoff
select text_path from volumes;
Combine Obj Data Types for searching
John Ng
So what we could do is create a compound type, composed of only the alias,
document and folder object types, that is searchable. Change IPA's saved
searches so that they search for this compound type rather than "any
objects". This would cut down the number of tablespans from 20-30 to 3.

This SQL statement will create a searchable compound type, called "alias or
document or folder":

INSERT INTO OBJECT_TYPE_DEFINITIONS ( ID_OBJECT, NAME,
ID_OWNER,ID_USER_CREATE,DATE_CREATE,DATE_UPDATE, DATE_ARRIVE, PLURAL_NAME,
ID_ICON, ID_SMALL_ICON,FLAG_SEARCHABLE, NAME_EDIT_CLASS,NAME_INSTANCE_CLASS,
FLAG_CATEGORY, FLAG_CATFIELD_TYPE, TEXT_INTERNAL_NAME,
LIST_TYPE_IDS,ID_DATABASE )
VALUES ( 'dotcA17', 'alias or document or folder', 'uA1', 'uA1', sysdate,
sysdate, sysdate, 'aliases or documents or folders', 'ObjectGroup',
'ObjectGroup16', 'Y', 'ObjObjectTypeLookupPane', 'ObjDBObject', 'C', 'N',
'alias or document or folder', 'dotdA20,dotdA9,dotdA12', 'A');
Debug an Objective server
Geoff
To debug an Objective server, use the following

objmgr <user> <password> <instname> debug=Y

or debug a single user by using the other tip on this site.
Debugging indexer problems
Geoff
If you use the following command, you can see a list of Verity record IDs for each word registered in a xxxxxx.DID file:

didump -words -verbose -pattern "A*" 000000123.did

A
4540
4541

You can then use the following command to locate these records and see the associated id_object.

browse 000000123.ddd
>4540

.....
....
56 id_object VAR-text (9) zA138258
....
..... 
The dumpids.exe seems to output more id_objects than are actually indexed from your testing:

dumpids -collection .../alias -vdkhome .... -outlevel 0

zA1
zA2
... etc

You can use objmgr to extract a list of objects that match an expression as follows:

objmgr user password instance

>te A

0.77 zA123 Alias for object
....
... etc
Notice from the above that the did files are mappings from words to a list of records in the ddd files.  The ddd files contain records and the id_object field points to the Objective objects.
Debug indexer problems
Geoff
To show the contents of a Verity partition:
./didump xxxxx.did
or to debug the indexer
./rcvdk -vdkhome [path to ../common]
RC>s <in> [search string]
or
./objmgr [start params]
>te [search string]
Debug NT ObjServer
Geoff
objserver -c INSTANCE user password debug=Y
Debug the indexer
Geoff Collett
$OBJECTIVE_HOME/bin/objindex -d > /tmp/indexer.log &
Determining Privileges
Geoff
The algorithm appears to be:
Look at the object.
Apply individual user privs first.
Apply group privs next and if conflict, take the one with the most privs.
Go to the parent and repeat until top level folder reached.
Priv = sum of privs.
Should apply privs at lower levels and restrict using higher level folders.
Disable server email
Geoff
The following settings will allow client functionality to continue but stop server based emails from being sent.

# Objective Mail Server - Name of mail server (for SMTP only)
OMS.MailServer=noteshub01.xyz.com.au

# Objective Mail Server - Mail logon id that Objective uses (SMTP - mail box owner, MAPI - mail profile name)
OMS.MailLogon="Disabled"
Doc Version num_state values
Geoff
STATE_PUBLISHED 101
STATE_EDITING_PUBLISHED 102
STATE_DRAFT 103
STATE_EDITING_DRAFT 104
STATE_WAITING_APPROVAL 105
STATE_APPROVED 106
STATE_EDITING_APPROVED 107
STATE_WAITING_PUBLICATION 108
STATE_CANCELED_DRAFT 109
Dump topic partition contents
Geoff
Dump the contents of a Topic partition

./didump xxxxx.did
Field IDs
Acacia
select id_object, name from field_definitions where name like 'Prio%' and date_delete is null;
File disposition
Geoff
Physical/Virtual file disposition is:
d = destroyed
s = sentenced
w = waiting (normal status)
Fix Audit Trail
Geoff
To fix Obj2k+ audit trail so it remembers some settings:
update object_type_definitions
set name_instance_class = 'ObjKeyword',
date_arrive = sysdate
where name='keyword';
Missing help menu
Geoff
If the help menu is not present on the client, check that the c:\Objective\Client\User Guides directory is present and contains Online Help Index.pdf
Missing Help Menu
Geoff
If the help menu is not present on the client, check that the
c:\Objective\Client\User Guides directory is present and contains Online
Help Index.pdf
objCollSubmit
Acacia
objCollSubmit ? gives:

objCollSubmit <vdkHome> <collection> <style> <bulk> <update|delete> <errHandle> <indexingMode> <debug(Y|N)> <service(Y|N)
objindex parameters
Acacia
objindex -? gives the following
objindex -sleep <seconds>] [-batchsize <number>] [-iterations <number>] [-flags (0-15)] [-table <tablename>] [-mode <indexing mode>] [-nosubmit] [-debug]
objmgr usage
Geoff
The following notes relate to objmgr that is supplied with Objective 2000 Plus on Solaris. 

The objmgr application can be used to do a number of useful actions:

Get very limited help

help

Available Commands:
HELP Display this message
SET Display/change system settings
RECLAIM Permanently remove deleted objects from database
REINDEX Submit an object for reindexing
TEXTSEARCH Search the full text database
USERS Display currently logged on users
REPLICATE Replicate data from remote servers to this server now
DEBUGSESSION Debug a user session
DISABLE Disable new logons
ENABLE Enable new logons
REFRESH SVR DD Refresh the server internal data dictionary
QUIT End this program

Login to objmgr on Solaris

. main.env # import environment settings
./objmgr objective password 8080 # start objmgr

Change a configuration setting

By changing configuration settings in this way, you don't have to do database updates or restart obj2000. 

set owner_has_all_privileges Y

Reclaim Space used by Deleted Objects

reclaim # submits a batch job that is logged in ../log/reclaim.log

Force the indexer to rescan an object

This is useful if a single object appears to have been skipped by the indexer.  You may need to stop the indexer and place it into debug mode if there is no information in /var/adm/messages.  Another way to force a reindex of an object is to place a comment on the "General" tab of the properties window of the object using the Objective client. 

reindex fA23

Search using name contains search

This will submit a name contains search to obj2000.  If you get results from this but not from the Objective client, the index is probably OK, the obj2000 is probably OK, but the client is failing and should be restarted, holding down the shift key at login. 

te fred

You can also use another utility called rcvdk to do searching that doesn't require obj2000 and hence can be used to eliminate or narrow searching problems down to obj2000.  Use the following commands:

./rcvdk -vdkhome ../common

RC>s <in> fred

List all connected user sessions

Use this command to determine the session ID so that you can get a debug log for a user that is already logged in. 

users

Get debug information on a connected user

This information can be logged to a file and shows the SQLs and data passed between the Objective client and server.  It is useful for migrations as you can see what SQLs would have to be performed to replicate the actions of the Objective server. 

debugsession 133 debug.log # user the users command to get the session id

Stop more users from logging in until a reindex completes. 

Often you will want to ensure that no more users are able to login for an organised server restart or a reindex or other server operation, you can use the

disable

command to provide a message to all users that try to connect.  They will get this message as a popup window on the Objective client when they attempt to login and not be able to login. 

To reactivate logins use:

enable

Note that the objective user will still be able to login. 

To refresh the cached server data

refresh svr dd

This command will help if the server experiences a sudden loss of cached information such as when nobody can login because a codeword appears to have been placed on the top level folder.  This may help avoid a server restart with 200 connected users. 

operf with multiple conditions
Geoff
CmdSearch:object_type=folder,relop=any,condition=ancestor 1 fA12343,condition=id_file 1 fA34334,condition=id_parent 1 fA1222
Optimise Collections
Bob Pitt
> start_objective inc Saturday trap for the optimize
> #!/bin/csh
> #
> #
> #
> #
> setenv ADMIN_HOME /usr/home/obj/admin
>
> #if it is the right day and objective is not running, run the optimizer
> setenv PS 'ps -ef | egrep "obj2000|objindex" | grep -v grep | wc -l'
> setenv DAY 'date +%a'
> #setenv DAY "don't run optimize"
>
> if ( ("$DAY" == "Sat") && ($PS == 0) ) then
>
> mv /tmp/opt.prod.log /tmp/opt.prod.log.old
> cd /disk00/objdata/prod/
> rm -r coll.preopt
> mkdir coll.preopt
> cp -r coll/* coll.preopt/
>
> cd /disk00/objdata/prod/coll
> source /disk00/objdata/prod/bin/objenv
>
> foreach coll (*)
> echo $coll >> /tmp/opt.prod.log
> $OBJ_VDKHOME/bin/mkvdk -collection $OBJECTIVE_HOME/coll/$coll -common
> $OBJ_VDKHOME -optimize maxmerge-squeeze >> /tmp/opt.prod.log
> $OBJ_VDKHOME/bin/mkvdk -collection $OBJECTIVE_HOME/coll/$coll -common
> $OBJ_VDKHOME -optimize maxclean >> /tmp/opt.prod.log
> end
>
> endif
> source $ADMIN_HOME/prod/bin/objenv
> cd /usr/home/obj/product/current/bin
>
> echo -n "'date +%Y/%m/%d-%H:%M:%S' Start obj2000 - "
> $ADMIN_HOME/prod/bin/obj2000 $OBJ_PORT $* &
> echo -n "'date +%Y/%m/%d-%H:%M:%S' Start objindex - "
> $ADMIN_HOME/prod/bin/objindex &
>
> #and restart ObjMonitor and email the number of files in coll
> if ( "$DAY" == "Sat" ) then
> setenv COUNT 'find /disk00/objdata/prod/coll -print | wc -l '
> echo "Number of files in the PROD collections is $COUNT" | mailx -s "SEC:
> UNCLASS PROD optimize results" b@d.au
> endif
>
>
>
> crontab entries
> #run an tuneup on the Verity collections
> 30 06,12,18 * * 1-5 /usr/home/obj/local/bin/tuneup 1>/dev/null
> 2>/dev/null
>
>
> Tuneup script (3 times a day)
> #!/bin/csh
> #
> #
> #
> #
> setenv ADMIN_HOME /usr/home/obj/admin
>
> setenv LD_LIBRARY_PATH
> /usr/home/oracle/product/ora8.0.5/lib:/usr/home/obj/product/current/bin
> mv /tmp/opt.prod.log /tmp/opt.prod.log.old
> #cd /disk00/objdata/prod/
> #rm -r coll.preopt
> #mkdir coll.preopt
> #cp -r coll/* coll.preopt/
>
> cd /disk00/objdata/prod/coll
> source /disk00/objdata/prod/bin/objenv
>
> foreach coll (*)
> echo $coll >> /tmp/opt.prod.log
> $OBJ_VDKHOME/bin/mkvdk -collection $OBJECTIVE_HOME/coll/$coll -common
> $OBJ_VDKHOME -optimize tuneup >> /tmp/opt.prod.log
> end
>
> setenv COUNT 'find /disk00/objdata/prod/coll -print | wc -l '
> echo "Number of files in the PROD collections is $COUNT" | mailx -s "SEC:
> UNCLASS PROD optimize results" b@d.au
>
Oracle vs Topic Searching
John
Below is a list of the values that define the meaning of the
type_operators.id_base_operator column. Basically, for name searching,
values in the range 43 - 48 will use Verity searching, whereas values in the
range 1 - 6 will use Oracle searching.


// String comparison operators (Oracle)
#define OBJ_IS 1
#define OBJ_IS_NOT 2
#define OBJ_IS_ONE_OF 3
#define OBJ_CONTAINS 4
#define OBJ_BEGINS 5
#define OBJ_ENDS 6
#define OBJ_DOES_NOT_CONTAIN 42

#define OBJ_NAMEIS 20
#define OBJ_MATCH_CASE_INSENSITIVE 22
#define OBJ_SUBQUERY 23
#define OBJ_BEGINS_CASE_SENSITIVE 40

// Number comparison operators
#define OBJ_LESS 7
#define OBJ_GREATER 8
#define OBJ_EQUAL 9
#define OBJ_NE_OR_NULL 10

// Date comparison operators
#define OBJ_BEFORE 11
#define OBJ_ON 12
#define OBJ_AFTER 13
#define OBJ_NOT_ON 41
#define OBJ_ON_OR_BEFORE 49
#define OBJ_ON_OR_AFTER 50

// Date/time comparison operators
#define OBJ_IS_EXACTLY 51
#define OBJ_ON_DATE 52
#define OBJ_NOT_ON_DATE 53
#define OBJ_BEFORE_DATE 54
#define OBJ_AFTER_DATE 55

// Column comparison
#define OBJ_IS_NOT_COL 24

// Object type comparison operator
#define OBJ_ARE 14

// Miscellaneous operators.
#define OBJ_IS_NULL 15
#define OBJ_IS_NOT_NULL 16

// Relational operators
#define OBJ_AND 17
#define OBJ_OR 18
#define OBJ_AND_NOT 47

// Document Text searching operators (Verity)
#define OBJ_TEXT_OP 19
#define OBJ_CONTAINS_ALL 28
#define OBJ_CONTAINS_ANY 29
#define OBJ_NEAR 30
#define OBJ_SENTENCE 31
#define OBJ_PARAGRAPH 32

// Document Field searching operators (Verity)
#define OBJ_FIELD_CONTAINS_WORD 43
#define OBJ_FIELD_BEGINS 44
#define OBJ_FIELD_ENDS 45
#define OBJ_FIELD_MATCHES 46
#define OBJ_FIELD_CONTAINS_SUBSTRING 48

// Generic IN
#define OBJ_IN 33
#define OBJ_NOT_IN 34

// Keyword searching operators
#define OBJ_KWD_IS 35
#define OBJ_KWD_NARROWER 36
#define OBJ_KWD_RELATED 37
#define OBJ_KWD_ANYRELATED 38
#define OBJ_KWD_ANYUSAGE 39

PRZ Files
Geoff
Looking at some past problems reported to Objective, it seems that when a document is created in Objective and it has no file name extension, Objective is not able to determine what type of file it is (ie doc, zip etc).  When this happens, it assigns a default type of prz and displays the icon that you are seeing.  The impact would be that these document versions cannot be opened by clicking on them, although they can be exported and openned by dropping them in the appropriate editor (MS Word?).
Remove registry entries
Geoff
REGEDIT4

[-HKEY_CLASSES_ROOT\Objective\shell\open\ddeexec]


Note that the - removes an entry
Replication order
g
The order that a replicating server pulls data from other servers is based on the databases.text_name_server column in ascending order.
Server debug mode
Geoff
HKEY_LOCAL_MACHINE\SOFTWARE\Objective\Objective Server\6isp3\Debug=9

objserver -foreground -c 6isp3
Show how indexing works
Geoff
To see the steps carried out by the indexer on Win32 platforms, stop the indexing service then on a DOS command line:

net stop "ObjectiveXXXX Text Indexer"
cd "\program files\obj\bin"
objindex -c XXXX -sleep 20 -iterations 1
SmallTalk Validation Script
Geoff
fieldPane := {fieldPane}.
lnameField := ObjDataDictionary current fieldByName: 'Surname'.
fnameField := ObjDataDictionary current fieldByName: 'First Name'.
catField := ObjDataDictionary current fieldByName: 'Army File Category'.
servnoField := ObjDataDictionary current fieldByName: 'Service/AGS Number Vettee ID'.
pmkeysnoField := ObjDataDictionary current fieldByName: 'PMKeys Number'.
hiddenField := ObjDataDictionary current fieldByName: 'hidden field'.
catalogueEntry := fieldPane cataloguesToView
detect: [ :each | (each findCatalogueAttributeById: servnoField objId) notNil ]
ifNone: [ nil ].
catalogueEntry notNil ifTrue:
[
namePane := fieldPane outmostManager paneNamed: 'namePane'.
namePane isNil ifTrue:
[
namePane := fieldPane outmostManager paneNamed: 'nameField'
].
].

namePane notNil ifTrue:
[
fieldPane copyWindowToModel.
x := catalogueEntry catalogue name upTo: 32 asCharacter.
lname := catalogueEntry valueAt: lnameField objId.
fname := catalogueEntry valueAt: fnameField objId.
cat := (catField validationPolicy findMatching: (catalogueEntry valueAt: catField objId)) value .
pmkeysno := catalogueEntry valueAt: pmkeysnoField objId.
servno := catalogueEntry valueAt: servnoField objId.
pmkeysno notNil ifTrue:
[
pmkeysno > 0 ifTrue:
[
newName := pmkeysno asString , ' ' , lname , ', ' , fname , ' - ' , cat , ' - ', x .
namePane contents: newName; triggerChanged; textChanged
].
pmkeysno > 0 ifFalse:
[
newName := servno , ' ' , lname , ', ' , fname , ' - ' , cat , ' - ', x .
namePane contents: newName; triggerChanged; textChanged
].
].
].
{value}
Solaris configuration tips
Geoff
There is a configuration setting in Solaris that limits a number of things including core dump sizes.  If you type "ulimit -a" you can see your current settings which should be something like:

time(seconds) unlimited
file(blocks) unlimited
data(kbytes) unlimited
stack(kbytes) 8192
coredump(blocks) 0
nofiles(descriptors) 64
vmemory(kbytes) unlimited

Note that on this non-objective server the coredump size is limited to 0 bytes so it will not dump.  To correct this situation, you can alter lines like the following (or remove). 
#truncate core files to zero
ulimit -c 0

Adding the following will increase the number of file descriptors allowed:
set rlim_fd_cur=1024
set rlim_fd_max=8192

or set the following in your ~/.profile (file descriptor limits)
ulimit -Sn 8192

While you're at it, adding the following 2 lines to the start_objective script will reduce the time required to restart the Objective server from 15 min to 60 sec by changing TCP/IP timeouts.  This doesn't seem to have any bad affects either!
/opt/local/bin/sudo /usr/sbin/ndd -set /dev/tcp tcp_fin_wait_2_flush_interval 30000
/opt/local/bin/sudo /usr/sbin/ndd -set /dev/tcp tcp_time_wait_interval 30000

Most core files are called core.9122 if the PID of the server was 9122. 

To force a core dump of a running process, type "gcore 9122" and look for the core dump.  ObjServer will freeze while core is dumped and then resume.  Users will notice a pause and then continue. 

To analyse the core, use the gdb Solaris utility (may not be installed by default).  Send the output of "thread apply all" and "thread apply all where" to the support dudes. 

Starting objmgr
Acacia
Start objmgr using the following:
source objenv (if necessary)
objmgr objusername objpassword portnum
Stop Word from saving paths as UNCs
Geoff
Situation:
You use Microsoft Word 97 as your default word processor and save your documents to a server using a mapped drive. Word is saving the documents using the Universal Naming Convention (UNC). For example, you save a document as K:\Docs\TEST.DOC and Word saves it as \\servername\Docs\TEST.DOC

Solution:
The benefit to saving your documents with mapped drive is increased speed when viewing contacts. UNC paths on the Notes/History tab that point to Netware servers will cause a slowdown in ACT! due to namespace issues with Netware.

To change the way Word saves your documents, you need to check for a Microsoft update and add a entry to your registry. Please follow these steps:

1. Ensure that you have installed Office 97 Service Release 1 from Microsoft. In Microsoft Word, choose Help, About Microsoft Word. It should say Microsoft Word 97 SR- 1 or above. 

If it does, go on to step 2. 
If it does not, download the file from Microsoft at http://officeupdate.microsoft.com/index.htm, and install it before proceding. 
2. Copy and paste the following text into Notepad. Do not use a standard word processor such as Microsoft Word. Note that the second line is blank.

REGEDIT4

[HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Word\Options]
"DontUseUNC"=dword:00000001

3. In Notepad, choose File, Save As, and from the Save As Type list, select All Files (*.*).
4. For Filename, type NOUNC.REG
5. From the Save In list select Desktop, and click Save.
6. Exit Notepad.
7. Double-click the NOUNC.REG file on the Desktop. This will instruct Word not to use UNC when saving your Microsoft Word documents.
Switch Name Contains to Oracle Search
John Ng
This procedure will change your name contains searching to use Oracle
> instead of TOPIC:
>
> - Execute the following SQL statement:
>
> UPDATE type_operators SET id_base_operator = '4' WHERE id_type = 'dotiA12'
> AND text_label = 'CONTAINS'
>
> - Restart the server
>
> - Log in to client with SHIFT key
>
>
> If you are using the load-testing program, the searching operator in the
> config file should be the string 'contains' instead of the number '48'.
> For example:
>
> CmdSearch:object_type=document,relop=all,condition=name contains test
> (will use Oracle searching)
>
> instead of
>
> CmdSearch:object_type=document,relop=all,condition=name 48 test
> (will use TOPIC searching)
Switch Search To Oracle
Victor
The following will change all name searching back to database:


update field_definitions set id_type='dotiA3' where id_object='tsysA30'
Switch Topic to Oracle Searching
Geoff
To switch searching to use Oracle instead of topic:
update field_definitions
set id_type='dotiA3'
where id_object = 'tsysA30';

To switch only name contains to use Oracle searching:
update type_operators
set id_base_operator = '4'
where id_type = 'dotiA12'
and text_label = 'CONTAINS';

Note that you must restart obj2000 and hold shift at login.
Test the indexer for searches
Geoff Collett
-start objmgr
-type "textsearch Trade Mark" (should display some results)
-exit objmgr
-Start another objective server in debug mode and capture the output
-source objenv
-obj2000 -debug 8101
-log in from an Objective client onto port 8101
-run a name begins search.
Turn off stemming
Geoff
Disabling Verity's stemming feature isn't a hard thing to do, but you should think hard about whether they want to go down that path, for the following reasons:

1. it will require a complete reindex of all of their existing collections
(an expensive exercise).
2. it is a custom change that, without proper configuration management, could be accidentally reverted by future Objective upgrades and reindexes.
3. users can disable word stemming now by placing words in dbl-quotes or using the <WORD> qualifier.
4. 6i SP3 supports operators that prevent word stemming (requires some Oracle DB configuration).


Given that, to stop Verity from stemming, you need to modify a file called style.prm, in 3 separate directories:
<objective_home>/common/chargate
<objective_home>/common/style
<objective_home>/common/textfld

Look for the following line:

$define WORD-IDXOPTS "Stemdex Casedex"

and remove the Stemdex option. i.e.

$define WORD-IDXOPTS "Casedex"


Save the file and that's it. As stated above, every collection will need to be completely rebuilt for the change to take effect.

Unix Logging Levels
Acacia
You can redirect the Objective error/info message into a file other than /var/adm/messages by adding the following 2 lines in '/etc/syslog.conf' file:

user.err /var/adm/objlog
user.info /var/adm/objlog

Warning: This will redirect all the applications logging message through LOG_USER facility. Do a 'man' page on openlog for details.
Verity Doco
Tim H
Please see
http://download.macromedia.com/pub/coldfusion/documentation/cfmx_verity.pdf

Click here to add your own tips.