[OGo-XML-RPC] Passing dates from Perl

Adam Tauno Williams xmlrpc@opengroupware.org
Tue, 27 Jun 2006 09:35:01 -0400


> I am writing a small Perl script to become familiar with the XML-RPC
> API. I am using the RPC::XML::Client package of Perl to get a
> connection to the OGo server.
> Now, I want to create a task programmatically. But contrary to the
> documentation, the xmlrpcd does not seem to accept dates in the format
> %Y%m%dT%H%M%S.
> In xmlrpcd.log I find the following:
> Jun 27 12:32:04 ogo-xmlrpcd-1.1 [3480]: [WARN] <0x08316CE4[LSNewJobCommand]> date command argument 'startDate' is not a date (NSShortInline8BitString): 20060722T10:30:00
> Jun 27 12:32:04 ogo-xmlrpcd-1.1 [3480]: [ERROR] <0x08316CE4[LSNewJobCommand]> Could not convert key startDate (NSShortInline8BitString:20060722T10:30:00) to date, format is %Y-%m-%d %H:%M:%S
> When I try the format %Y-%m-%d %H:%M:%S, I still get the warning in
> the logs and an error on the client side, but the task is created all
> right.

I think it accepts standard dates as in PHP I can call
XML_RPC_iso8601_encode($value) to encode the date and in .NET using the
CookComputing XML-RPC assembly DateTime types are automatically
formatted and submitted without errors.

<aside>Of course, XML-RPC is a "standard" only in the loosest definition
of the word, it is really more like a "consensus".  In some aspects more
like a "train wreck".  The 'standard' document is really poorly done and
leaves a whole heck of allot open to interpretation.</aside>

> Can someone tell me more about this issue? Should I use %Y-%m-%d
> %H:%M:%S and ignore the warning, i.e. did the date format change since
> the documentation was written (xml-rpc-de.pdf from around 2003)? 

It might be useful to look at the code of POGI (PHP) or OGoMojo (C#),
as I've gotten most things to work in both of those.  There are lots of
'caveats and addendums' that xml-rpc-de doesn't include.

>  Or
> is it that the xmlrpcd somehow does not properly convert date strings
> into date objects in my setup?
> The server is runing OGo-1.1.3 with sope-4.5.6.

An insertJob call on-the-wire looks like
------------------
Content-Type: text/xml
User-Agent: XML-RPC.NET
Authorization: Basic ********************
Content-Length: 24391
Connection: keep-alive
Host: gourd-amber

<?xml version="1.0"?>
<methodCall>
  <methodName>person.insertJob</methodName>
  <params>
    <param>
      <value>
        <struct>
          <member>
            <name>owner</name>
            <value>
              <struct>
                <member>
                  <name>id</name>
                  <value>

<string>skyrix://gourd-amber.morrison.iserv.net/morrisonOGo/10000</string>
                  </value>
                </member>
                <member>
                  <name>login</name>
                  <value>
                    <string>ogo</string>
                  </value>
                </member>
              </struct>
            </value>
          </member>
          <member>
            <name>url</name>
            <value>
              <string>http://www.whitemice.org</string>
            </value>
          </member>
          <member>
            <name>login</name>
            <value>
              <string>adam</string>
            </value>
          </member>
          <member>
            <name>gender</name>
            <value>
              <string>male</string>
            </value>
          </member>
          <member>
            <name>isComplete</name>
            <value>
              <boolean>1</boolean>
            </value>
          </member>
          <member>
            <name>addresses</name>
            <value>
              <struct>
                <member>
                  <name>mailing</name>
                  <value>
                    <struct>
                      <member>
                        <name>country</name>
                        <value>
                          <string>USA</string>
                        </value>
                      </member>
                      <member>
                        <name>type</name>
                        <value>
                          <string>mailing</string>
                        </value>
                      </member>
                      <member>
                        <name>state</name>
                        <value>
                          <string>MI</string>
                        </value>
                      </member>
                      <member>
                        <name>name1</name>
                        <value>
                          <string>*********************</string>
                        </value>
                      </member>
                      <member>
                        <name>street</name>
                        <value>
                          <string>*********************</string>
                        </value>
                      </member>
                      <member>
                        <name>zip</name>
                        <value>
                          <string>*********************</string>
                        </value>
                      </member>
                      <member>
                        <name>id</name>
                        <value>

<string>skyrix://gourd-amber.morrison.iserv.net/morrisonOGo/10140</string>
                        </value>
                      </member>
                      <member>
                        <name>city</name>
                        <value>
                          <string>*********************</string>
                        </value>
                      </member>
                      <member>
                        <name>name2</name>
                        <value>
                          <string>CIS/IT Dept.</string>
                        </value>
                      </member>
                      <member>
                        <name>name3</name>
                        <value>
                          <string>ATTN: Adam Tauno Williams</string>
                        </value>
                      </member>
                    </struct>
                  </value>
                </member>
                <member>
                  <name>private</name>
                  <value>
                    <struct>
                      <member>
                        <name>id</name>
                        <value>

<string>skyrix://gourd-amber.morrison.iserv.net/morrisonOGo/10130</string>
                        </value>
                      </member>
                      <member>
                        <name>city</name>
                        <value>
                          <string>Grand Rapids</string>
                        </value>
                      </member>
                      <member>
                        <name>name1</name>
                        <value>
                          <string>Adam Tauno Williams</string>
                        </value>
                      </member>
                      <member>
                        <name>country</name>
                        <value>
                          <string>USA</string>
                        </value>
                      </member>
                      <member>
                        <name>zip</name>
                        <value>
                          <string>*********************</string>
                        </value>
                      </member>
                      <member>
                        <name>street</name>
                        <value>
                          <string>*********************</string>
                        </value>
                      </member>
                      <member>
                        <name>state</name>
                        <value>
                          <string>MI</string>
                        </value>
                      </member>
                      <member>
                        <name>type</name>
                        <value>
                          <string>private</string>
                        </value>
                      </member>
                    </struct>
                  </value>
                </member>
                <member>
                  <name>location</name>
                  <value>
                    <struct>
                      <member>
                        <name>country</name>
                        <value>
                          <string>USA</string>
                        </value>
                      </member>
                      <member>
                        <name>type</name>
                        <value>
                          <string>location</string>
                        </value>
                      </member>
                      <member>
                        <name>state</name>
                        <value>
                          <string>MI</string>
                        </value>
                      </member>
                      <member>
                        <name>name1</name>
                        <value>
                          <string>Morrison Industrial Equipment</string>
                        </value>
                      </member>
                      <member>
                        <name>street</name>
                        <value>
                          <string>*********************</string>
                        </value>
                      </member>
                      <member>
                        <name>zip</name>
                        <value>
                          <string>*********************</string>
                        </value>
                      </member>
                      <member>
                        <name>id</name>
                        <value>

<string>skyrix://gourd-amber.morrison.iserv.net/morrisonOGo/10150</string>
                        </value>
                      </member>
                      <member>
                        <name>city</name>
                        <value>
                          <string>Grand Rapids</string>
                        </value>
                      </member>
                      <member>
                        <name>name2</name>
                        <value>
                          <string>CIS/IT Dept.</string>
                        </value>
                      </member>
                      <member>
                        <name>name3</name>
                        <value>
                          <string>ATTN: Adam Tauno Williams</string>
                        </value>
                      </member>
                    </struct>
                  </value>
                </member>
              </struct>
            </value>
          </member>
          <member>
            <name>keywords</name>
            <value>
              <string />
            </value>
          </member>
          <member>
            <name>extendedKeys</name>
            <value>
              <array>
                <data>
                  <value>
                    <string>email1</string>
                  </value>
                  <value>
                    <string>email2</string>
                  </value>
                  <value>
                    <string>callfrequency</string>
                  </value>
                  <value>
                    <string>division</string>
                  </value>
                  <value>
                    <string>email3</string>
                  </value>
                  <value>
                    <string>headboy</string>
                  </value>
                  <value>
                    <string>job_title</string>
                  </value>
                  <value>
                    <string>mailmktcode</string>
                  </value>
                  <value>
                    <string>other_title1</string>
                  </value>
                  <value>
                    <string>other_title2</string>
                  </value>
                  <value>
                    <string>salesperson</string>
                  </value>
                  <value>
                    <string>territory</string>
                  </value>
                </data>
              </array>
            </value>
          </member>
          <member>
            <name>birthday</name>
            <value>
              <dateTime.iso8601>19271206T05:00:00</dateTime.iso8601>
            </value>
          </member>
          <member>
            <name>number</name>
            <value>
              <string>OGo10100</string>
            </value>
          </member>
          <member>
            <name>objectVersion</name>
            <value>
              <i4>183</i4>
            </value>
          </member>
          <member>
            <name>comment</name>
            <value>
              <string>This dude rocks!</string>
            </value>
          </member>
          <member>
            <name>firstname</name>
            <value>
              <string>Adam</string>
            </value>
          </member>
          <member>
            <name>phoneTypes</name>
            <value>
              <array>
                <data>
                  <value>
                    <string>01_tel</string>
                  </value>
                  <value>
                    <string>02_tel</string>
                  </value>
                  <value>
                    <string>03_tel_funk</string>
                  </value>
                  <value>
                    <string>05_tel_private</string>
                  </value>
                  <value>
                    <string>10_fax</string>
                  </value>
                  <value>
                    <string>15_fax_private</string>
                  </value>
                </data>
              </array>
            </value>
          </member>
          <member>
            <name>id</name>
            <value>

<string>skyrix://gourd-amber.morrison.iserv.net/morrisonOGo/10100</string>
            </value>
          </member>
          <member>
            <name>isAccount</name>
            <value>
              <boolean>1</boolean>
            </value>
          </member>
          <member>
            <name>extendedAttrs</name>
            <value>
              <struct>
                <member>
                  <name>email1</name>
                  <value>
                    <string>adam@morrison-ind.com</string>
                  </value>
                </member>
                <member>
                  <name>headboy</name>
                  <value>
                    <string>no</string>
                  </value>
                </member>
                <member>
                  <name>email3</name>
                  <value>
                    <string>awilliam@wmmi.net</string>
                  </value>
                </member>
                <member>
                  <name>email2</name>
                  <value>
                    <string>awilliam@whitemice.org</string>
                  </value>
                </member>
                <member>
                  <name>salesperson</name>
                  <value>
                    <string>none</string>
                  </value>
                </member>
                <member>
                  <name>territory</name>
                  <value>
                    <string>none</string>
                  </value>
                </member>
                <member>
                  <name>lastChanged</name>
                  <value>

<dateTime.iso8601>20031128T12:17:25</dateTime.iso8601>
                  </value>
                </member>
                <member>
                  <name>job_title</name>
                  <value>
                    <string>System and Network Administrator</string>
                  </value>
                </member>
              </struct>
            </value>
          </member>
          <member>
            <name>phones</name>
            <value>
              <struct>
                <member>
                  <name>03_tel_funk</name>
                  <value>
                    <struct>
                      <member>
                        <name>telephoneId</name>
                        <value>
                          <i4>10180</i4>
                        </value>
                      </member>
                      <member>
                        <name>info</name>
                        <value>
                          <string />
                        </value>
                      </member>
                      <member>
                        <name>number</name>
                        <value>
                          <string>****************</string>
                        </value>
                      </member>
                      <member>
                        <name>type</name>
                        <value>
                          <string>03_tel_funk</string>
                        </value>
                      </member>
                    </struct>
                  </value>
                </member>
                <member>
                  <name>01_tel</name>
                  <value>
                    <struct>
                      <member>
                        <name>telephoneId</name>
                        <value>
                          <i4>10160</i4>
                        </value>
                      </member>
                      <member>
                        <name>info</name>
                        <value>
                          <string />
                        </value>
                      </member>
                      <member>
                        <name>number</name>
                        <value>
                          <string>****************</string>
                        </value>
                      </member>
                      <member>
                        <name>type</name>
                        <value>
                          <string>01_tel</string>
                        </value>
                      </member>
                    </struct>
                  </value>
                </member>
                <member>
                  <name>15_fax_private</name>
                  <value>
                    <struct>
                      <member>
                        <name>telephoneId</name>
                        <value>
                          <i4>10210</i4>
                        </value>
                      </member>
                      <member>
                        <name>info</name>
                        <value>
                          <string />
                        </value>
                      </member>
                      <member>
                        <name>number</name>
                        <value>
                          <string />
                        </value>
                      </member>
                      <member>
                        <name>type</name>
                        <value>
                          <string>15_fax_private</string>
                        </value>
                      </member>
                    </struct>
                  </value>
                </member>
                <member>
                  <name>10_fax</name>
                  <value>
                    <struct>
                      <member>
                        <name>telephoneId</name>
                        <value>
                          <i4>10200</i4>
                        </value>
                      </member>
                      <member>
                        <name>info</name>
                        <value>
                          <string />
                        </value>
                      </member>
                      <member>
                        <name>number</name>
                        <value>
                          <string>****************</string>
                        </value>
                      </member>
                      <member>
                        <name>type</name>
                        <value>
                          <string>10_fax</string>
                        </value>
                      </member>
                    </struct>
                  </value>
                </member>
                <member>
                  <name>02_tel</name>
                  <value>
                    <struct>
                      <member>
                        <name>telephoneId</name>
                        <value>
                          <i4>10170</i4>
                        </value>
                      </member>
                      <member>
                        <name>info</name>
                        <value>
                          <string />
                        </value>
                      </member>
                      <member>
                        <name>number</name>
                        <value>
                          <string />
                        </value>
                      </member>
                      <member>
                        <name>type</name>
                        <value>
                          <string>02_tel</string>
                        </value>
                      </member>
                    </struct>
                  </value>
                </member>
                <member>
                  <name>05_tel_private</name>
                  <value>
                    <struct>
                      <member>
                        <name>telephoneId</name>
                        <value>
                          <i4>10190</i4>
                        </value>
                      </member>
                      <member>
                        <name>info</name>
                        <value>
                          <string />
                        </value>
                      </member>
                      <member>
                        <name>number</name>
                        <value>
                          <string />
                        </value>
                      </member>
                      <member>
                        <name>type</name>
                        <value>
                          <string>05_tel_private</string>
                        </value>
                      </member>
                    </struct>
                  </value>
                </member>
              </struct>
            </value>
          </member>
          <member>
            <name>isPrivate</name>
            <value>
              <boolean>0</boolean>
            </value>
          </member>
          <member>
            <name>name</name>
            <value>
              <string>Williams</string>
            </value>
          </member>
          <member>
            <name>degree</name>
            <value>
              <string>UNIX System Administration</string>
            </value>
          </member>
          <member>
            <name>nickname</name>
            <value>
              <string>ATW</string>
            </value>
          </member>
          <member>
            <name>middlename</name>
            <value>
              <string>Tauno</string>
            </value>
          </member>
        </struct>
      </value>
    </param>
    <param>
      <value>
        <struct>
          <member>
            <name>associatedContacts</name>
            <value>
              <string>Associated Contacts</string>
            </value>
          </member>
          <member>
            <name>totalWork</name>
            <value>
              <i4>75</i4>
            </value>
          </member>
          <member>
            <name>actualWork</name>
            <value>
              <i4>50</i4>
            </value>
          </member>
          <member>
            <name>executor</name>
            <value>
              <struct>
                <member>
                  <name>id</name>
                  <value>

<string>skyrix://gourd-amber.morrison.iserv.net/morrisonOGo/10100</string>
                  </value>
                </member>
                <member>
                  <name>login</name>
                  <value>
                    <string>adam</string>
                  </value>
                </member>
              </struct>
            </value>
          </member>
          <member>
            <name>creator</name>
            <value>
              <struct>
                <member>
                  <name>id</name>
                  <value>

<string>skyrix://gourd-amber.morrison.iserv.net/morrisonOGo/10100</string>
                  </value>
                </member>
                <member>
                  <name>login</name>
                  <value>
                    <string>adam</string>
                  </value>
                </member>
              </struct>
            </value>
          </member>
          <member>
            <name>priority</name>
            <value>
              <i4>1</i4>
            </value>
          </member>
          <member>
            <name>percentComplete</name>
            <value>
              <i4>25</i4>
            </value>
          </member>
          <member>
            <name>keywords</name>
            <value>
              <string>mogi insertJob</string>
            </value>
          </member>
          <member>
            <name>sensitivity</name>
            <value>
              <i4>3</i4>
            </value>
          </member>
          <member>
            <name>associatedCompanies</name>
            <value>
              <string>Associated Companies</string>
            </value>
          </member>
          <member>
            <name>accountingInfo</name>
            <value>
              <string>Accounting Info</string>
            </value>
          </member>
          <member>
            <name>startDate</name>
            <value>
              <dateTime.iso8601>20060627T00:00:00</dateTime.iso8601>
            </value>
          </member>
          <member>
            <name>name</name>
            <value>
              <string>TEST JOB</string>
            </value>
          </member>
          <member>
            <name>endDate</name>
            <value>
              <dateTime.iso8601>20060704T00:00:00</dateTime.iso8601>
            </value>
          </member>
        </struct>
      </value>
    </param>
  </params>
</methodCall>