{"id":11280,"date":"2018-05-31T09:41:51","date_gmt":"2018-05-31T07:41:51","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/adding-a-documentum-extension-to-gawk-part-ii\/"},"modified":"2025-10-24T09:22:43","modified_gmt":"2025-10-24T07:22:43","slug":"adding-a-documentum-extension-to-gawk-part-ii","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/adding-a-documentum-extension-to-gawk-part-ii\/","title":{"rendered":"Adding a Documentum Extension to gawk, part II"},"content":{"rendered":"<p>This is part II of the article &#8220;Adding a Documentum Extension to gawk&#8221;. You can find Part I <a title=\"Adding a Documentum Extension to gawk, part I\" href=\"https:\/\/www.dbi-services.com\/blog\/?p=23510\" target=\"_blank\" rel=\"noopener\">here<\/a><br \/>\nBefore we can test the extension, we need a test program and some helper functions for comfort. Let&#8217;s prepare them.<br \/>\no\u00a0\u00a0Move back to the dmgawk directory and edit DctmAPI.awk, the wrapper functions;<br \/>\n<code><br \/>\n$ cd ..\/..\/..<br \/>\n$ pwd<br \/>\n\/home\/dmadmin\/gawk<br \/>\n$ vi DctmAPI.awk<br \/>\n<\/code><br \/>\no\u00a0\u00a0Cut and paste the lines below:<\/p>\n<pre class=\"brush: c; gutter: true; first-line: 1\">@load \"dctm\"\n\n# provides high-level function to do Documentum stuff;\n# set environment variable $DOCUMENTUM to where the dmcl.ini file is and $LD_LIBRARY_PATH to the location of libdmcl40.so;\n# this library file is made available to gawk scripts by @include-ing in it;\n# the environment variable AWKPATH can be set to the path containing the included awk sources;\n# Cesare Cervini\n# dbi-services.com\n# 5\/2018\n\ndmLogLevel = 1\n\nfunction dmShow(mesg) {\n# displays the message msg if allowed\n   if (dmLogLevel &gt; 0)\n      print mesg\n}\n\nfunction dmConnect(docbase, user_name, password) {\n# connects to given docbase as user_name\/password;\n# returns a session id if OK, an empty string otherwise\n   dmShow(\"in connect(), docbase = \" docbase \", user_name = \" user_name \", password = \" password)\n   session = dmAPIGet(\"connect,\" docbase \",\" user_name \",\" password)\n   if (!session) {\n      print \"unsuccessful connection to docbase \" docbase \" as user \" user_name\n      return \"\" \n   }\n   else {\n      dmShow(\"successful session \" session)\n      dmShow(dmAPIGet(\"getmessage,\" session))\n   }\n   dmShow(\"exiting connect()\")\n   return session\n}\n\nfunction dmExecute(session, dql_stmt) {\n# execute non-SELECT DQL statements;\n# returns 1 if OK, 0 otherwise;\n   dmShow(\"in dmExecute(), dql_stmt=\" dql_stmt)\n   query_id = dmAPIGet(\"query,\" session \",\" dql_stmt)\n   if (!query_id) {\n      dmShow(dmAPIGet(\"getmessage,\" session))\n      return 0\n   }\n   if (!dmAPIExec(\"close,\" session \",\" query_id)) {\n      dmShow(dmAPIGet(\"getmessage,\" session))\n      return 0\n   }\n   dmAPIGet(\"getmessage,\" session)\n   return 1\n}\n\nfunction dmSelect(session, dql_stmt, attribute_names) {\n# execute the DQL SELECT statement passed in dql_stmt and outputs the result to stdout;\n# attributes_names is a list of attributes to extract from the result set;\n# return 1 if OK, 0 otherwise;\n   dmShow(\"in dmSelect(), dql_stmt=\" dql_stmt)\n   query_id = dmAPIGet(\"query,\" session \",\" dql_stmt)\n   if (!query_id) {\n      dmShow(dmAPIGet(\"getmessage,\" session))\n      return 0\n   }\n\n   s = \"\"\n   nb_attrs = split(attribute_names, attributes_tab, \" \")\n   for (attr = 1; attr &lt;= nb_attrs; attr++)\n      s = s \"[\" attributes_tab[attr] \"]t\"\n   print s\n   resp_cntr = 0\n   while (dmAPIExec(\"next,\" session \",\" query_id) &gt; 0) {\n      s = \"\"\n      for (attr = 1; attr &lt;= nb_attrs; attr++) {\n         value = dmAPIGet(\"get,\" session \",\" query_id \",\" attributes_tab[attr])\n         if (\"r_object_id\" == attributes_tab[attr] &amp;&amp; !value) {\n            dmShow(dmAPIGet(\"getmessage,\" session))\n            return 0\n         }\n         s= s \"[\" (value ? value : \"NULL\") \"]t\"\n      }\n      resp_cntr += 1\n      dmShow(sprintf(\"%d: %s\", resp_cntr, s))\n   }\n   dmShow(sprintf(\"%d rows iterated\", resp_cntr))\n\n   if (!dmAPIExec(\"close,\" session \",\" query_id)) {\n      dmShow(dmAPIGet(\"getmessage,\" session))\n      return 0\n   }\n\n   return 1\n}\n\nfunction dmDisconnect(session) {\n# closes the given session;\n# returns 1 if no error, 0 otherwise;\n   dmShow(\"in dmDisconnect()\")\n   status = dmAPIExec(\"disconnect,\" session)\n   if (!status)\n      dmShow(\"Exception in dmDisconnect():\")\n   else\n      dmShow(\"exiting disconnect()\")\n   return status\n}\n<\/pre>\n<p>o\u00a0\u00a0Ditto for the test program tdctm.awk;<br \/>\n<code>$ vi tdctm.awk<\/code><\/p>\n<pre class=\"brush: c; gutter: true; first-line: 1\"># test program for DctmAPI.awk and the interface dctm.c;\n# Cesare Cervini\n# dbi-services.com\n# 5\/2018\n\n@include \"DctmAPI.awk\"\n\nBEGIN {\n   dmLogLevel = 1\n\n   status = dmAPIInit()\n   printf(\"dmAPIInit(): %dn\", status)\n   if (status)\n      print(\"dmAPIInit() was successful\")\n   else\n      print(\"dmAPIInit() was not successful\")\n \n   printf \"n\"\n   session = dmConnect(\"dmtest\", \"dmadmin\" , \"dmadmin\")\n   printf(\"dmConnect: session=%sn\", session)\n   if (!session) {\n      print(\"no session opened, exiting ...\")\n      exit(1)\n   }\n\n   printf \"n\"\n   dump = dmAPIGet(\"dump,\" session \",0900c35080008107\")\n   print(\"object 0900c35080008107 dumped:n\" dump)\n\n   printf \"n\"\n   stmt = \"update dm_document object set language_code = 'FR' where r_object_id = '0900c35080008107'\"\n   status = dmExecute(session, stmt)\n   if (status)\n      print(\"dmExecute [\" stmt \"] was successful\")\n   else\n      print(\"dmExecute [\" stmt \"] was not successful\")\n\n   printf \"n\"\n   stmt = \"select r_object_id, object_name, owner_name, acl_domain, acl_name from dm_document\"\n   status = dmSelect(session, stmt, \"r_object_id object_name owner_name acl_domain acl_name\")\n   if (status)\n      print(\"dmSelect [\" stmt \"] was successful\")\n   else\n      print(\"dmSelect [\" stmt \"] was not successful\")\n\n   printf \"n\"\n   stmt = \"select count(*) from dm_document\"\n   status = dmSelect(session, stmt,  \"count(*)\")\n   if (status)\n      print(\"dmSelect [\" stmt \"] was successful\")\n   else\n      print(\"dmSelect [\" stmt \"] was not successful\")\n\n   printf \"n\"\n   status = dmDisconnect(session)\n   if (status)\n      print(\"successfully disconnected\")\n   else\n      print(\"error while  disconnecting\")\n\n   printf \"n\"\n   status = dmAPIDeInit()\n   if (status)\n      print(\"successfully deInited\")\n   else\n      print(\"error while  deInited\")\n\n   exit(0)\n}<\/pre>\n<p>o\u00a0\u00a0Let&#8217;s test now !<br \/>\nfirst, set the needed variables for the Documentum environment, if still not done;<br \/>\n<code>$ export DOCUMENTUM=\/home\/dmadmin\/documentum<br \/>\n$ export LD_LIBRARY_PATH=$DOCUMENTUM\/product\/7.3\/bin<br \/>\n<\/code><br \/>\no\u00a0\u00a0Then, we need to tell the new gawk where to find the dynamic extension and the awk wrapper;<br \/>\nthe environment variables are AWKLIBPATH and AWKPATH respectively;<br \/>\nlet&#8217;s define those variables on-the-fly for a change:<br \/>\n<code><br \/>\n$ AWKLIBPATH=gawk-4.2.1\/extension\/.libs AWKPATH=.\/ gawk-4.2.1\/gawk -f .\/tdctm.awk<br \/>\n<\/code><\/p>\n<p>o\u00a0\u00a0Produced output:<br \/>\n<code><br \/>\ndmAPIInit(): 1<br \/>\ndmAPIInit() was successful<br \/>\n&nbsp;<br \/>\nin connect(), docbase = dmtest, user_name = dmadmin, password = dmadmin<br \/>\nsuccessful session s0<br \/>\n[DM_SESSION_I_SESSION_START]info: \"Session 0100c3508000d6d6 started for user dmadmin.\"<br \/>\nexiting connect()<br \/>\ndmConnect: session=s0<br \/>\n&nbsp;<br \/>\nobject 0900c35080008107 dumped:<br \/>\nUSER ATTRIBUTES<br \/>\n&nbsp;<br \/>\nobject_name : 4\/10\/2018 20:09:28 dm_DBWarning<br \/>\ntitle : Result of dm_method(dm_DBWarning) with status code (0)<br \/>\nsubject : Result of dm_method(dm_DBWarning) with command line: .\/dmbasic -f..\/install\/admin\/mthd4.ebs -eDBWarning -- -docbase_name dmtest.dmtest -user_name dmadmin -job_id 0800c3508000035f -method_....<br \/>\nauthors []:<br \/>\nkeywords []:<br \/>\nresolution_label :<br \/>\nowner_name : dmadmin<br \/>\nowner_permit : 7<br \/>\ngroup_name : docu<br \/>\ngroup_permit : 5<br \/>\nworld_permit : 3<br \/>\nlog_entry :<br \/>\nacl_domain : dmadmin<br \/>\nacl_name : dm_4500c35080000101<br \/>\nlanguage_code : FR<br \/>\n&nbsp;<br \/>\nSYSTEM ATTRIBUTES<br \/>\n&nbsp;<br \/>\nr_object_type : dm_document<br \/>\nr_creation_date : 4\/10\/2018 20:09:41<br \/>\nr_modify_date : 5\/13\/2018 22:09:06<br \/>\nr_modifier : dmadmin<br \/>\nr_access_date : nulldate<br \/>\nr_composite_id []:<br \/>\nr_composite_label []:<br \/>\nr_component_label []:<br \/>\nr_order_no []:<br \/>\n...<br \/>\n&nbsp;<br \/>\ni_is_replica : F<br \/>\ni_vstamp : 200<br \/>\n&nbsp;<br \/>\nin dmExecute(), dql_stmt=update dm_document object set language_code = 'FR' where r_object_id = '0900c35080008107'<br \/>\ndmExecute [update dm_document object set language_code = 'FR' where r_object_id = '0900c35080008107'] was successful<br \/>\n&nbsp;<br \/>\nin dmSelect(), dql_stmt=select r_object_id, object_name, owner_name, acl_domain, acl_name from dm_document<br \/>\n[r_object_id] [object_name] [owner_name] [acl_domain] [acl_name]<br \/>\n1: [0900c350800001d0] [Default Signature Page Template] [dmadmin] [dmadmin] [dm_4500c35080000101]<br \/>\n2: [6700c35080000100] [CSEC Plugin] [dmadmin] [dmadmin] [dm_4500c35080000101]<br \/>\n3: [6700c35080000101] [Snaplock Connector] [dmadmin] [dmadmin] [dm_4500c35080000101]<br \/>\n4: [0900c350800001ff] [Blank Word 2007 \/ 2010 Document] [dmadmin] [dmadmin] [dm_4500c35080000101]<br \/>\n5: [0900c35080000200] [Blank Word 2007 \/ 2010 Template] [dmadmin] [dmadmin] [dm_4500c35080000101]<br \/>\n6: [0900c35080000201] [Blank Word 2007 \/ 2010 Macro-enabled Document] [dmadmin] [dmadmin] [dm_4500c35080000101]<br \/>\n7: [0900c35080000202] [Blank Word 2007 \/ 2010 Macro-enabled Template] [dmadmin] [dmadmin] [dm_4500c35080000101]<br \/>\n8: [0900c35080000203] [Blank Excel 2007 \/ 2010 Workbook] [dmadmin] [dmadmin] [dm_4500c35080000101]<br \/>\n9: [0900c35080000204] [Blank Excel 2007 \/ 2010 Template] [dmadmin] [dmadmin] [dm_4500c35080000101]<br \/>\n10: [0900c350800001da] [11\/21\/2017 16:31:10 dm_PostUpgradeAction] [dmadmin] [dmadmin] [dm_4500c35080000101]<br \/>\n...<br \/>\n885: [0900c35080005509] [11\/30\/2017 20:11:05 dm_DataDictionaryPublisher] [dmadmin] [dmadmin] [dm_4500c35080000101]<br \/>\n886: [0900c3508000611d] [12\/11\/2017 19:40:05 dm_DataDictionaryPublisher] [dmadmin] [dmadmin] [dm_4500c35080000101]<br \/>\n887: [0900c35080006123] [12\/11\/2017 20:10:08 dm_DataDictionaryPublisher] [dmadmin] [dmadmin] [dm_4500c35080000101]<br \/>\n888: [0900c3508000612d] [12\/11\/2017 20:30:07 dm_UpdateStats] [dmadmin] [dmadmin] [dm_4500c35080000101]<br \/>\n888 rows iterated<br \/>\ndmSelect [select r_object_id, object_name, owner_name, acl_domain, acl_name from dm_document] was successful<br \/>\n&nbsp;<br \/>\nin dmSelect(), dql_stmt=select count(*) from dm_document<br \/>\n[count(*)]<br \/>\n1: [888]<br \/>\n1 rows iterated<br \/>\ndmSelect [select count(*) from dm_document] was successful<br \/>\n&nbsp;<br \/>\nin dmDisconnect()<br \/>\nexiting disconnect()<br \/>\nsuccessfully disconnected<br \/>\n&nbsp;<br \/>\nsuccessfully deInited<br \/>\n<\/code><br \/>\nThat&#8217;s it, enjoy your new dmgawk!<\/p>\n<h4>Next steps<\/h4>\n<p>Now that the extension has proved to be usable, it could be interesting to deploy it system-wide. This can be done by the generated Makefile at the root directory of the package as follows:<br \/>\n<code><br \/>\n$ sudo make install<br \/>\n<\/code><br \/>\nThe loadable extensions are stored in \/usr\/local\/lib\/gawk:<br \/>\n<code><br \/>\n$ ll \/usr\/local\/lib\/gawk<br \/>\ntotal 504<br \/>\n-rwxr-xr-x 1 root root 124064 May 13 16:38 filefuncs.so<br \/>\n...<br \/>\n-rwxr-xr-x 1 root root 26920 May 13 16:38 time.so<br \/>\n<strong>-rwxr-xr-x 1 root root 31072 May 13 16:38 dctm.so<\/strong><br \/>\n<\/code><br \/>\nAs this is the standard place to look for them, there no need to specify the AWKLIBPATH anymore.<br \/>\nThere is also a standard place for awk utility scripts, \/usr\/local\/share\/awk. If DctmAPI.awk is installed there, it becomes available to anybody from anywhere on the system and setting AWKPATH is not needed any more. In addition, if \/usr\/local\/bin is in the righteous $PATH, the newly extended gawk is accessible directly, along with its extensions and its ancillary scripts, e.g.:<br \/>\n<code>$ gawk -f dmgawk\/tdctm.awk<\/code><br \/>\nYou may also want to define an alias dmawk pointing to the extended gawk:<br \/>\n<code>$ alias dmawk=\/usr\/local\/bin\/gawk<\/code><br \/>\nor you may want to name it dmgawk so you still can access the original dmawk:<br \/>\n<code>$ alias dmgawk=\/usr\/local\/bin\/gawk<\/code><\/p>\n<h4>I&#8217;m not finished yet!<\/h4>\n<p>I started this mini-project on a 32-bit Ubuntu VM with the Documentum v5.3 libdmcl40.so library. Once it proved working, I replayed all the steps on a 64-bit Ubuntu VM with the Documentum v7.3 binaries. There, as already noticed in the past, the library libdmcl40.so kept crashing the executable that loads it at run-time, gawk here, so I successfully resorted to libdmcl.so, the one that calls java code behind the scenes through JNI. It is a bit slower at start up but at least does work as expected. It is very likely that the ancient libdmcl40.so is going to be retired in some future release of the content server, so be prepared to switch.<br \/>\nYou may remember that I edited the automake Makefile.am to have the extension compiled, and that I had to relink said extension manually with the libdmcl.so library. A better way would be to provide it with its own makefile to automate those steps. This way, no original gawk source file would be altered.<\/p>\n<h4>Conclusion, finally<\/h4>\n<p>This test program and wrapper are actually the gawk counterparts of the Documentum extension for python I wrote earlier for this blog (check it <a title=\"Adding a Documentum Extension to python\" href=\"https:\/\/www.dbi-services.com\/blog\/adding-a-documentum-extension-into-python\/\" target=\"_blank\" rel=\"noopener\">here<\/a>). With these 2 extensions, an administrator does not have any longer to be stuck with a limited and, even worse, stagnant tool. The awk language is easy and well suited to the kind of work administrators do with Documentum. Its gawk implementation is powerful, open, very well maintained and, as shown, easily extensible so there is no reason not to use it.<br \/>\nFor licensing reasons, the interface cannot be distributed by Documentum but anybody can install it privately without restriction.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This is part II of the article &#8220;Adding a Documentum Extension to gawk&#8221;. You can find Part I here Before we can test the extension, we need a test program and some helper functions for comfort. Let&#8217;s prepare them. o\u00a0\u00a0Move back to the dmgawk directory and edit DctmAPI.awk, the wrapper functions; $ cd ..\/..\/.. $ [&hellip;]<\/p>\n","protected":false},"author":40,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[525],"tags":[],"type_dbi":[],"class_list":["post-11280","post","type-post","status-publish","format-standard","hentry","category-enterprise-content-management"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Adding a Documentum Extension to gawk, part II - dbi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/adding-a-documentum-extension-to-gawk-part-ii\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Adding a Documentum Extension to gawk, part II\" \/>\n<meta property=\"og:description\" content=\"This is part II of the article &#8220;Adding a Documentum Extension to gawk&#8221;. You can find Part I here Before we can test the extension, we need a test program and some helper functions for comfort. Let&#8217;s prepare them. o\u00a0\u00a0Move back to the dmgawk directory and edit DctmAPI.awk, the wrapper functions; $ cd ..\/..\/.. $ [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/adding-a-documentum-extension-to-gawk-part-ii\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-05-31T07:41:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-24T07:22:43+00:00\" \/>\n<meta name=\"author\" content=\"Middleware Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Middleware Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/adding-a-documentum-extension-to-gawk-part-ii\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/adding-a-documentum-extension-to-gawk-part-ii\\\/\"},\"author\":{\"name\":\"Middleware Team\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d8563acfc6e604cce6507f45bac0ea1\"},\"headline\":\"Adding a Documentum Extension to gawk, part II\",\"datePublished\":\"2018-05-31T07:41:51+00:00\",\"dateModified\":\"2025-10-24T07:22:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/adding-a-documentum-extension-to-gawk-part-ii\\\/\"},\"wordCount\":584,\"commentCount\":0,\"articleSection\":[\"Enterprise content management\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/adding-a-documentum-extension-to-gawk-part-ii\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/adding-a-documentum-extension-to-gawk-part-ii\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/adding-a-documentum-extension-to-gawk-part-ii\\\/\",\"name\":\"Adding a Documentum Extension to gawk, part II - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"datePublished\":\"2018-05-31T07:41:51+00:00\",\"dateModified\":\"2025-10-24T07:22:43+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d8563acfc6e604cce6507f45bac0ea1\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/adding-a-documentum-extension-to-gawk-part-ii\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/adding-a-documentum-extension-to-gawk-part-ii\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/adding-a-documentum-extension-to-gawk-part-ii\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Adding a Documentum Extension to gawk, part II\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/8d8563acfc6e604cce6507f45bac0ea1\",\"name\":\"Middleware Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g\",\"caption\":\"Middleware Team\"},\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/author\\\/middleware-team\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Adding a Documentum Extension to gawk, part II - dbi Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/adding-a-documentum-extension-to-gawk-part-ii\/","og_locale":"en_US","og_type":"article","og_title":"Adding a Documentum Extension to gawk, part II","og_description":"This is part II of the article &#8220;Adding a Documentum Extension to gawk&#8221;. You can find Part I here Before we can test the extension, we need a test program and some helper functions for comfort. Let&#8217;s prepare them. o\u00a0\u00a0Move back to the dmgawk directory and edit DctmAPI.awk, the wrapper functions; $ cd ..\/..\/.. $ [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/adding-a-documentum-extension-to-gawk-part-ii\/","og_site_name":"dbi Blog","article_published_time":"2018-05-31T07:41:51+00:00","article_modified_time":"2025-10-24T07:22:43+00:00","author":"Middleware Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Middleware Team","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/adding-a-documentum-extension-to-gawk-part-ii\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/adding-a-documentum-extension-to-gawk-part-ii\/"},"author":{"name":"Middleware Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1"},"headline":"Adding a Documentum Extension to gawk, part II","datePublished":"2018-05-31T07:41:51+00:00","dateModified":"2025-10-24T07:22:43+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/adding-a-documentum-extension-to-gawk-part-ii\/"},"wordCount":584,"commentCount":0,"articleSection":["Enterprise content management"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/adding-a-documentum-extension-to-gawk-part-ii\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/adding-a-documentum-extension-to-gawk-part-ii\/","url":"https:\/\/www.dbi-services.com\/blog\/adding-a-documentum-extension-to-gawk-part-ii\/","name":"Adding a Documentum Extension to gawk, part II - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2018-05-31T07:41:51+00:00","dateModified":"2025-10-24T07:22:43+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/adding-a-documentum-extension-to-gawk-part-ii\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/adding-a-documentum-extension-to-gawk-part-ii\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/adding-a-documentum-extension-to-gawk-part-ii\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Adding a Documentum Extension to gawk, part II"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/8d8563acfc6e604cce6507f45bac0ea1","name":"Middleware Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ddcae7ba0f9d1a0e7ae707f0e689e4a9c95bb48ec49c8e6d9cc86d43f4121cb6?s=96&d=mm&r=g","caption":"Middleware Team"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/middleware-team\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/11280","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/40"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=11280"}],"version-history":[{"count":1,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/11280\/revisions"}],"predecessor-version":[{"id":41165,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/11280\/revisions\/41165"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=11280"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=11280"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=11280"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=11280"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}