You probably know that Documentum (in its default state) stores content on the file system and retains a pointer to the content in its database. Likely, you have navigated the file store on the Content Server and discovered directories like
../data/docbase/content_storage_01/00000123/80/00/23/. How in the world does this directory structure relate back to a particular object?
Documentum uses several objects to hold persistence information about content; we will use five of them to determine where the content for an object with
r_object_id = '0900000180023d07' resides:
dmr_content, dm_format, dm_filestore, dm_docbase_config, and
dm_location. The following query will get us all the information we need to assemble the path to the object’s content.
select data_ticket, dos_extension, file_system_path, r_docbase_id from dmr_content c, dm_format f, dm_filestore fs, dm_location l, dm_docbase_config dc where any c.parent_id = '0900000180023d07' and f.r_object_id = c.format and fs.r_object_id = c.storage_id and l.object_name = fs.root
- data_ticket = -2147474649
- dos_extension = txt
- file_system_path = C:/Documentum/data/docbase/content_storage_01
- r_docbase_id = 123
The trick to determining the path to the content is in decoding the
data_ticket's 2’s complement decimal value. Convert the
data_ticket to a 2’s compliment hexidecimal number by first adding 2^32 to the number and then converting it to hex. You can use a scientific calculator to do this or grab some Java code off the net.
- -2147474649 + 2^32 = (-2147474649 + 4294967296) = 2147492647
- converting 2147492647 to hex = 80002327
Now, split the hex value of the
data_ticket at every two characters, append it to
docbase_id (padded to 8 digits), and add the
dos_extension. Viola! you have the complete path to the content file.
I think this is a really clever way to manage the creation and assignment of directories and filenames, don’t you? In addition, this scheme guarantees that there is never more than 256 files in a single directory, increasing optimization.
You can do it in reverse also. Say you have file with this path: /
80/20/23.txt. What is its
- converting 80002023 to decimal = 2147491875
- subtract 2^32: 2147491875 – 4294967296 = -2147475421
select r_object_id, object_name from dm_sysobject, s dmr_content c where any c.parent_id = s.r_object_id and c.data_ticket = -2147475421.0
Note: You must append “.0” to the
data_ticket value to force DQL to process the variable as a floating point number, otherwise you get an integer overflow error.
Of course, you can always use the
GET_FILE administrative method to find an object’s content’s file path. Just remember, that the content ID it is asking for is the
r_object_id for the