[NTLUG:Discuss] Decipher C++ source

Michael Barnes barnmichael at gmail.com
Mon Jun 8 16:45:47 CDT 2009


On Mon, Jun 8, 2009 at 4:36 PM, Preston Hagar<prestonh at gmail.com> wrote:
> On Mon, Jun 8, 2009 at 2:49 PM, Michael Barnes<barnmichael at gmail.com> wrote:
>> I have a MySQL database that logs telephone calls.  A module puts the
>> CallerID number into a variable.  Then, this database query is
>> supposed to return the last date and time that number called.  The
>> database table has fields for NUMBER, NAME, CALL_DATE and CALL_TIME.
>> (There are others, but I don't care about them for this purpose.)
>>
>> Anyhow, it appears that the query is giving me the first time the
>> number called, not the latest time.
>>
>> I'm hoping some good programmer out there could take a peek at this
>> and answer some questions.
>> First I need to know why I get the first call instead of the last call.
> The desc in the order by clause is only applying to CALL_TIME, not CALL_DATE
>
> (here is a reference link:
> http://dev.mysql.com/doc/refman/5.0/en/sorting-rows.html)
>
> Try changing the order by line to the following:
>
> order by CALL_DATE desc, CALL_TIME desc",
>
>
>> Then some curiosity questions.
>> What is the significance of the '!' after the NAME field?
> The !  is for not.  What it is saying here is that it wants only call
> records where the NAME column is not equal to "" or basically where
> NAME is not empty.
>
>> Is the value \"\"  for NAME some type of a variable or wildcard?
>>
>
> \"\"  is evaluated as "" when the query is run.  The \ are to escape
> the " so that the C++ interpreter doesn't thing the sprintf string has
> ended, but instead actually includes a "
>
>> What line(s) actually select the proper data (last call) from the list
>> returned by the query?
>>
> I added a few comments to the code below that might clarify things.
>
>> Once it gets the right data, it puts it into an element in the
>> BusDriver module.  It also increments the call counter, which is
>> working correctly.
>>
>> Here's the code.
>>
> //  Construct SQL query
>>  sql=QString().sprintf("select CALL_DATE,CALL_TIME from DETAILS_GAL \
>>                         where (NUMBER=\"%s\")&&(NAME!=\"\") \
>>                         order by CALL_DATE,CALL_TIME desc",
>>                        (const char *)mon->showCode(),
>>                        (const char *)pnum);
>
> //  Query the database
>>  q=new QSqlQuery(sql);
> //  If the first record is valid (not null) then proceed
>>  if(q->first()) {
>>    mon->metaData(line)->
> // Set the Bus Driver using the first column returned (value(0) which
> is CALL_DATE) and the second
> // value returned (value(1) which is CALL_TIME)
>>      setElement(BusDriver::LastCallDatetimeElement,
>>                 QString().sprintf("%d",QDateTime(q->value(0).toDate(),
>>                                                  q->value(1).toTime()).
>>                                   toTime_t()));
>>  }
>>  mon->metaData(line)->setElement(BusDriver::CounterElement,q->size());
>>  delete q;
>>
>>
>
> Hope this helps out.
>
> Preston
>



Hey, you guys are GREAT!  Thanks for the fast and very useful help.  I
actually understand it now.

Michael



More information about the Discuss mailing list