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.