<div dir="ltr"><div><div><div><div>thank you very much!<br></div>indeed rrd_update_r() takes its arguments in a fairly different way compared to rrd_update().<br></div>In fact calling the 3rd and 4th arguments of rrd_update_r() is misleading. <br><br></div>One more question that is unclear to be. Is rrd_update_r() actually an async call to rrd_update? or is it simple a thread-safe call to rrd_update and I am the one who should spawn a thread and execute rrd_update_r() in it?<br><br></div>thank you<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Dec 21, 2015 at 3:22 PM, Tony Mountifield <span dir="ltr"><<a href="mailto:tony@mountifield.org" target="_blank">tony@mountifield.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div link="blue" vlink="purple" lang="EN-GB"><div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Hi there,<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">You might find this page useful: <a href="http://stackoverflow.com/questions/6681090/how-to-call-threadsafe-rrd-update-r-round-robin-database-function-with-c-api" target="_blank">http://stackoverflow.com/questions/6681090/how-to-call-threadsafe-rrd-update-r-round-robin-database-function-with-c-api</a><u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">In particular, I think you need to give the template separately as the second arg to rrd_update_r().<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Try something that ends up like this:<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">char *argv[] = { "1450694776:1015:1000:123:20.63:38.48:987" };<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">int ret = rrd_update_r("sensors.rrd", "CO2unf:CO2fil:O2pp:O2pct:O2temp:O2pres", 1, argv);<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Regards<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d">Tony<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1f497d"><u></u> <u></u></span></p><p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"" lang="EN-US">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"" lang="EN-US"> Athanasios Silis [mailto:<a href="mailto:athanasios.silis@gmail.com" target="_blank">athanasios.silis@gmail.com</a>] <br><b>Sent:</b> 21 December 2015 12:12<br><b>To:</b> Tony Mountifield<br><b>Subject:</b> Re: [rrd-users] rrd_update_r() error : expected timestamp not found in data source from update<u></u><u></u></span></p><div><div class="h5"><p class="MsoNormal"><u></u> <u></u></p><div><div><div><p class="MsoNormal" style="margin-bottom:12.0pt">mind you the examples are not very helpful, because the only relevant section is in rrd_daemon.c , where<u></u><u></u></p></div><p class="MsoNormal" style="margin-bottom:12.0pt">a "cache_item_t" structure is "fed" into rrd_update_r().<u></u><u></u></p></div><p class="MsoNormal" style="margin-bottom:12.0pt">The "cache_item_t" structure is a typedef of "cache_item_s"  and no parent declaration is visible anywhere in the rrdtool1.x/* folder!<br><br><u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p><div><p class="MsoNormal">On Mon, Dec 21, 2015 at 12:47 PM, Athanasios Silis <<a href="mailto:athanasios.silis@gmail.com" target="_blank">athanasios.silis@gmail.com</a>> wrote:<u></u><u></u></p><div><div><div><p class="MsoNormal">Hi there,<u></u><u></u></p></div><p class="MsoNormal" style="margin-bottom:12.0pt">thank you for taking the time. This is only a proof of concept to verify how it works. so it all in main.cpp<u></u><u></u></p><div style="margin-left:30.0pt"><p class="MsoNormal"><span style="font-family:"Courier New"">#include <iostream></span><br><span style="font-family:"Courier New"">#include <errno.h>   // Error number definitions</span><br><span style="font-family:"Courier New"">#include <rrd.h></span><br><span style="font-family:"Courier New"">#include <wordexp.h></span><br><span style="font-family:"Courier New"">#include <time.h></span><br><br><span style="font-family:"Courier New"">using namespace std;</span><br><br><span style="font-family:"Courier New"">void splitToArgs(string& str);</span><br><br><span style="font-family:"Courier New"">int main(int argc, char* argv[])</span><br><span style="font-family:"Courier New"">{</span><br><span style="font-family:"Courier New"">        time_t tm = time(NULL);</span><br><span style="font-family:"Courier New"">        stringstream ss;</span><br><span style="font-family:"Courier New"">        ss << tm;</span><br><span style="font-family:"Courier New"">        cout << "ss=" << ss.str() << endl;</span><br><br><span style="font-family:"Courier New"">        string updstr = string("update sensors.rrd --template CO2unf:CO2fil:O2pp:O2pct:O2temp:O2pres ")\</span><br><span style="font-family:"Courier New"">                + ss.str() + string(":1015:1000:123:20.63:38.48:987");</span><br><span style="font-family:"Courier New"">        cout << "updstr=" << updstr << endl;</span><br><br><span style="font-family:"Courier New"">        splitToArgs(updstr);</span><br><span style="font-family:"Courier New"">        return 0;</span><br><span style="font-family:"Courier New"">}</span><br><br><span style="font-family:"Courier New"">void splitToArgs(string& str)</span><br><span style="font-family:"Courier New"">{</span><br><span style="font-family:"Courier New"">        wordexp_t we;</span><br><span style="font-family:"Courier New"">        int er = 0;</span><br><br><span style="font-family:"Courier New"">        if ( (er=wordexp(str.c_str() , &we, 0)) != 0)</span><br><span style="font-family:"Courier New"">        {</span><br><span style="font-family:"Courier New"">                cout << "error in word expansion " <<  er << endl;</span><br><span style="font-family:"Courier New"">        }</span><br><span style="font-family:"Courier New"">        else</span><br><span style="font-family:"Courier New"">        {</span><br><span style="font-family:"Courier New"">                if (we.we_wordc>0)</span><br><span style="font-family:"Courier New"">                {</span><br><span style="font-family:"Courier New"">                        char * filename = we.we_wordv[1];</span><br><span style="font-family:"Courier New"">                        rrd_clear_error();</span><br><span style="font-family:"Courier New"">                        //int ret = rrd_update( we.we_wordc, we.we_wordv );</span><br><span style="font-family:"Courier New"">                        const char **w = const_cast<const char**>(we.we_wordv); //hell yeah!</span><br><span style="font-family:"Courier New"">                        int ret = rrd_update_r( filename , NULL , we.we_wordc, w );</span><br><span style="font-family:"Courier New"">                        if ( ret != 0 )</span><br><span style="font-family:"Courier New"">                        {</span><br><span style="font-family:"Courier New"">                                cout << "rrd_update error # = " << ret << " error get= "</span><br><span style="font-family:"Courier New"">                                         << rrd_get_error() << " rrd_strerror(errno) = " << endl;</span><br><span style="font-family:"Courier New"">                        }</span><br><span style="font-family:"Courier New"">                }</span><br><span style="font-family:"Courier New"">        }</span><br><span style="font-family:"Courier New"">        wordfree(&we);</span><br><span style="font-family:"Courier New"">}</span><u></u><u></u></p></div><p class="MsoNormal"><u></u> <u></u></p></div><p class="MsoNormal" style="margin-bottom:12.0pt">The about produces the following output:<u></u><u></u></p><div style="margin-left:30.0pt"><p class="MsoNormal"><span style="font-family:"Courier New"">ss=1450694776<br><br>updstr=update sensors.rrd --template CO2unf:CO2fil:O2pp:O2pct:O2temp:O2pres 1450694776:1015:1000:123:20.63:38.48:987<br><br>rrd_update error # = -1 error get= sensors.rrd: expected timestamp not found in data source from update</span><u></u><u></u></p></div><p class="MsoNormal" style="margin-bottom:12.0pt"><u></u> <u></u></p></div><div><div><div><p class="MsoNormal"><u></u> <u></u></p><div><p class="MsoNormal">On Mon, Dec 21, 2015 at 12:22 PM, Tony Mountifield <<a href="mailto:tony@mountifield.org" target="_blank">tony@mountifield.org</a>> wrote:<u></u><u></u></p><p class="MsoNormal">In article <CADgchnuMGkA=tQdMtACMWPYX2TgDUwKfbf3g=<a href="mailto:d%2BFa3V5BP%2BWDA@mail.gmail.com" target="_blank">d+Fa3V5BP+WDA@mail.gmail.com</a>>,<br>Athanasios Silis <<a href="mailto:athanasios.silis@gmail.com" target="_blank">athanasios.silis@gmail.com</a>> wrote:<br>> Hello there,<br>> I am trying to use rrd_update_r() to update a rrdb through a c++ program.<br>> So I am generating the argc/argv on the fly to pass into the function.<br>><br>> The originating string is the following:<br>><br>>         time_t tm = time(NULL);<br>>         stringstream ss;<br>>         ss << tm;<br>>         string updstr = string("update sensors.rrd \<br>>                 --template CO2unf:CO2fil:O2pp:O2pct:O2temp:O2pres ")\<br>>                 + ss.str() + string(":1015:1000:123:20.63:38.48:987");<br>><br>> I get this error  from rrd_get_error():<br>> sensors.rrd: expected timestamp not found in data source from update<br>><br>> Is timestamp not accepted in seconds from EPOCH?<br><br>Can you show your code all the way from the above until the call to rrd_update_r()?<br><br>Also, show the value of updstr, to make sure it is what you think it is?<br><br>Cheers<br><span style="color:#888888">Tony<br>--<br>Tony Mountifield<br>Work: <a href="mailto:tony@softins.co.uk" target="_blank">tony@softins.co.uk</a> - <a href="http://www.softins.co.uk" target="_blank">http://www.softins.co.uk</a><br>Play: <a href="mailto:tony@mountifield.org" target="_blank">tony@mountifield.org</a> - <a href="http://tony.mountifield.org" target="_blank">http://tony.mountifield.org</a><br><br>_______________________________________________<br>rrd-users mailing list<br><a href="mailto:rrd-users@lists.oetiker.ch" target="_blank">rrd-users@lists.oetiker.ch</a><br><a href="https://lists.oetiker.ch/cgi-bin/listinfo/rrd-users" target="_blank">https://lists.oetiker.ch/cgi-bin/listinfo/rrd-users</a></span><u></u><u></u></p></div><p class="MsoNormal"><u></u> <u></u></p></div></div></div></div><p class="MsoNormal"><u></u> <u></u></p></div></div></div></div></div></blockquote></div><br></div>