MySQL C API: check if a field exists - mysql

I'm new to mysql programming on c. I need to check if a certain user exists in a table. How can I do this using the C API?
Here's what I've got, but it isn't working:
if (mysql_query(con, "SELECT * FROM Users WHERE UserName='user3'"))
{
finish_with_error(con);
}
MYSQL_RES *result = mysql_store_result(con);
if (result == NULL)
{
finish_with_error(con);
}
int count = mysql_field_count(con);
printf("%d\n", count );

For anyone interested, this is something I wrote using the comments, and finally ended up using.
if (mysql_query(con, "SELECT field FROM table WHERE userName='user1'"))
{
finish_with_error(con);
}
MYSQL_RES *result = mysql_store_result(con);
if (result == NULL)
{
finish_with_error(con);
}
MYSQL_ROW row;
MYSQL_FIELD *field;
if (row = mysql_fetch_row(result))
{
printf("%s\n", row[0]);
db_pwd = row[0];
}

Related

MySQL: Insert values to column using C

I have put the value coming out of the the packet[i] from the for loops in variables d,e f,j. but when I am trying to put the values of these variables in a column of mysql I get an error
Unknown column 'd' in 'field list'
My code:
printf("\nResponse Code: ");
for(i = 54; i<=56; i++)
{
d = packet[i];
printf("%c", packet[i]);
}
printf("\nCommand: ");
for(i = 54; i<=57; i++)
{
e = packet[i];
printf("%c", packet[i]);
}
printf("\nResponse Parameter: ");
for(i = 58; i<=104; i++)
{
f = packet[i];
printf("%c", packet[i]);
}
printf("\nTime to live:");
j = packet[22];
printf("%c", packet[i]);
if (mysql_query(con, "CREATE TABLE SMTP(Response_Code CHAR(250) , Command CHAR(250), Response_Parameter CHAR(250), Time_to_live CHAR(250))")) {
finish_with_error(con);
}
printf("here");
if (mysql_query(con, "INSERT INTO SMTP VALUES(d,e,f,j)")) {
finish_with_error(con);
}
I want the values of d e f and j to be printed in these columns but I am getting error Unknown column 'd' in 'field list'
You can use snprintf or sprintf to form the query, before to that extract the complete data instead of single char from the packet.
char d[100], e[100], f[100];
printf("\nResponse Code: ");
for(i = 54; i<=56; i++)
{
d[i-54] = packet[i]; //Copy the individual char
printf("%c", packet[i]);
}
d[i-54] = '\0'; //null terminate the array
printf("\nCommand: ");
for(i = 54; i<=57; i++)
{
e[i-54] = packet[i];
printf("%c", packet[i]);
}
e[i-54] = '\0';
printf("\nResponse Parameter: ");
for(i = 58; i<=104; i++)
{
f[i-58] = packet[i];
printf("%c", packet[i]);
}
f[i-58] = '\0';
//do the same for even "Time to live"
Then form the prepared statement and execute it,
char query[300];
sprintf(query, "INSERT INTO SMTP VALUES (?,?,?)");
MYSQL_STMT *stmt;
MYSQL_BIND bind[3];
stmt = mysql_stmt_init(con);
if (!stmt)
{
return;//error
}
if (mysql_stmt_prepare(con, query, strlen(query)))
{
return;//error
}
int dLen = strlen(d);
bind[0].buffer_type= MYSQL_TYPE_STRING;
bind[0].buffer= (char *)d;
bind[0].buffer_length= STRING_SIZE;
bind[0].is_null= 0;
bind[0].length= &dLen;
int eLen = strlen(e);
bind[1].buffer_type= MYSQL_TYPE_STRING;
bind[1].buffer= (char *)e;
bind[1].buffer_length= STRING_SIZE;
bind[1].is_null= 0;
bind[1].length= &eLen ;
int fLen = strlen(f);
bind[2].buffer_type= MYSQL_TYPE_STRING;
bind[2].buffer= (char *)f;
bind[2].buffer_length= STRING_SIZE;
bind[2].is_null= 0;
bind[2].length= &fLen;
/* Execute the INSERT statement - 1*/
if (mysql_stmt_execute(stmt))
{
return; //error
}
mysql_stmt_close(stmt

Storing data from mysql

I need an advice from community. I need to store somewhere data from mysql so later I could compare data. I tried to put everything to struct, but I realized that struct was gone after loop, and that i cannot create that struct name would be variable. Like this:
struct Columns (variable);
So basically I need to store columns information like field, type, key etc.. I don't know how much there will be tables.
My struct:
struct Columns {
char field[1000];
char type[50];
char null[10];
char key[20];
char defaul[50];
char extra[50];
};
Code part:
if (mysql_query(conn, "Show tables;")){
fprintf(stderr, "%s\n", mysql_error(conn));
exit(1);
}
res = mysql_store_result(conn);
printf("MySQL Tables in mysql database:\n");
while ((row = mysql_fetch_row(res)) != NULL){
printf("%s\n", row[0]);
sprintf(str, "Show columns from %s;", row[0]); //row[0]-is table names
sprintf(str1, "lentele_%s", row[0]);
printf("%s\n", str1);
struct Columns str1;
if (mysql_query(conn, str)){
fprintf(stderr, "%s\n", mysql_error(conn));
exit(1);
}
res2 = mysql_use_result(conn);
while ((row2 = mysql_fetch_row(res2)) != NULL){
strcpy(str1.field, row2[0]);
printf("Belekas Column field %s\n", str1.field);
}
There are 6 columns on each table: field || type || null || key || default || extra
As I said, i will need that data for later comparison.

outof sync after execute mysql procedure

i met a issue during my development on mysql and linux C.
as the procedure use temporary params, so I think it will not affect following sql query. but my test is failed and report errno:2014.
the procedure I used is :
delimiter //
drop procedure if exists pbx_r_eid_svcid;
CREATE PROCEDURE `pbx_r_eid_svcid`(IN input_eid varchar(16))
begin
declare exe_result int default -1;
declare out_svcip varchar(64) default "";
declare out_svcport varchar(64) default "";
select exe_result,out_svcip,out_svcport;
end;//
delimiter;
C code:
#include <mysql/mysql.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
MYSQL *mysql;
int timeout=atoi(argv[1]);
char escape[64] = "";
char orig[64] = "";
char buf[128] = "";
int rc = 0;
MYSQL_RES *res;
mysql = mysql_init(NULL);
mysql_options(mysql, MYSQL_OPT_READ_TIMEOUT, &timeout);
mysql_options(mysql, MYSQL_OPT_WRITE_TIMEOUT, &timeout);
mysql_real_connect(mysql, "127.0.0.1", "root", "123456", "center_distribute", 3306,"/var/run/mysqld/mysqld.sock", CLIENT_FOUND_ROWS | CLIENT_MULTI_STATEMENTS);
snprintf(buf,128, "call pbx_r_eid_svcid('00000002')", "11");
if (mysql_real_query(mysql,buf,strlen(buf)))
{
int err_no = mysql_errno(mysql);
fprintf(stderr, "Failed to insert row, Error: %d %s\n", err_no,
mysql_error(mysql));
}
res = mysql_store_result(mysql);
if(0 == mysql_affected_rows(mysql) || res == NULL)
{
rc = 6;
goto end;
}
mysql_free_result(res);
snprintf(buf,128,"select * from enterprise_info;");
/******************************/
/*wrong query return out of sync*/
if (mysql_real_query(mysql,buf,strlen(buf)))
{
int err_no = mysql_errno(mysql);
fprintf(stderr, "Failed to insert row, Error: %d %s\n", err_no,
mysql_error(mysql));
}
res = mysql_store_result(mysql);
if(0 == mysql_affected_rows(mysql) || res == NULL)
{
rc = 7;
goto end;
}
mysql_free_result(res);
end:
printf("%d\n",rc);
mysql_close(mysql);
return 0;
}
second mysql select will repsonse out of sync error
test reult:
./mt 5
Failed to insert row, Error: 2014 Commands out of sync; you can't run this
command now
7
any comment should be helpful.
Thanks.

C API : Using Variables In mysql query

Im trying to call my str date variable in this function:
int main(int argc, char **argv)
{
int status = 0;
char query[300], data[15], hora[10];
strDataHora(data, hora);
printf("Date: %s\n", data);
MYSQL *con = mysql_init(NULL);
if (con == NULL)
{
fprintf(stderr, "mysql_init() failed\n");
exit(1);
}
if (mysql_real_connect(con, "localhost", "root", "ufmg3duc",
"stream_net", 0, NULL, CLIENT_MULTI_STATEMENTS) == NULL)
{
finish_with_error(con);
}
if (mysql_query(con, "SELECT Id FROM audiencia WHERE data LIKE ('%s') AND (hora LIKE ('%:00:%') OR hora LIKE ('%:30:%')) AND hora > '03:01'",data))
{
finish_with_error(con);
}
But I dont know how to call 'date' in mysql_query:
if (mysql_query(con, "SELECT Id FROM audiencia WHERE data LIKE ('%s') AND (hora LIKE ('%:00:%') OR hora LIKE ('%:30:%')) AND hora > '03:01'",data))
How can i select Id when my actual date is a str variable type?
You have to store this query in a variable (eg. with sprintf or snprintf) and escape all those %using %%
char query[300];
...
sprintf(query, "SELECT Id FROM audiencia WHERE data LIKE ('%s') ...", data);
mysql_query(con, query);

How to separate result values in different rows using Mysql query

I created this table (results) in my sql database (test)
CREATE DATABASE `test`;
USE `test`;
CREATE TABLE `results` (
`number` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`id_machine` int(10) unsigned NOT NULL,
`value` float NOT NULL,
`datetime` datetime NOT NULL,
PRIMARY KEY (`number`),
UNIQUE KEY `indice_UNIQUE` (`number`)
) ENGINE=InnoDB AUTO_INCREMENT=100;
My external device gives me these results:
+DATA: 43 BYTES FROM 0000:0000 (045)
Machine_8: (T=22.22, HR=42.56, Dw=8.95, VCC=3.64V)
and with the usage of strtok I get some values of these results to save them in the database:
Results: 8, 22.22, 42.56, 8.95, 3.64
I would like to save my data in my table in this way:
101, 8, 22.22, 2013-06-05 14:03:00
102, 8, 42.56, 2013-06-05 14:03:00
103, 8, 8.95, 2013-06-05 14:03:00
104, 8, 3.64, 2013-06-05 14:03:00
This is my code in my function until now
int learn_port2(int fd)
{
MYSQL *conn;
MYSQL_RES *res;
MYSQL_RES *res1;
MYSQL_ROW row;
char *server = "127.0.0.1";
char *user = "root";
char *password = "***"; // got tot keep my data secret
char *database = "test";
conn = mysql_init(NULL);
if(!mysql_real_connect(conn, server, user, password, database, 0, NULL, 0))
{
fprintf(stderr, "%s\n", mysql_error(conn));
return -1;
//finish_with_error(conn);
}
int n, i;
char buff[300];
memset(buff, 0, sizeof(buff));
for (int x = 0; x<1; x++)
//for (;;)
{
char id_machine[35] = "";
char temp[35] = "";
char hum[35] = "";
char dw[35] = "";
char vol[45] = "";
char* ptr;
int i,nodo,nodo1;
float temp, hum, dw, vcc;
n=read(fd,buff,sizeof(buff));
sleep(1);
printf("%s", buff);
printf("\n");
if (buff[37] == 'N' || buff[38] == 'N' || buff[39] == 'N' || buff[40] == 'N' )
{
ptr = strtok(buff, "Machine_,=T:HR:DW:Vcc()");
i = 0;
while (ptr != NULL)
{
if (i == 9)
strcat(id_machine, ptr); // copies Nodo
if (i == 10)
strcat(temp, ptr); // copies T
if (i == 11)
strcat(hum, ptr); // copies HR
if (i == 13)
strcat(dw, ptr); // copies DW
if (i == 15)
strcat(vol, ptr); // copies Vcc
ptr = strtok(NULL, "Machine_,=T:HR:DW:Vcc()");
i++;
}
printf("Results: %s, %s, %s, %s, %s\n", id_machine, temp, hum, dw, vol);
}
char query[]="INSERT INTO results(`id_machine`,`value`,`valor`) VALUES(id_machine,'14',value)";
if(mysql_query(conn, query))
{
fprintf(stderr, "%s\n", mysql_error(conn));
return -1;
}
res = mysql_use_result(conn);
}
}
How can I modify the char query[] to have the results which I want? Or if there are some examples like this.
To make a parameterized query you could use something like the following...
The example uses vsnprintf() to take a printf like format string and a variable number of arguments after it to print the query into a temporary buffer and then pass the buffer to the MYSQL query. In this way you can get a paramaterized query...
vsnprintf() accepts a variable parameter list, va_list and also is buffer-overflow safe.
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#define BUFSTRLEN 255
/* Returns -1 if the internal buffer was not large enough to hold the formatted
* string, or a format error occurred. If neither condition occurred then the
* result of the MYSQL query is returned... */
int DoMysqlQuery(MYSQL *conn, char const *printfstring, ...)
{
int len;
va_list args;
char buffer[BUFSTRLEN + 1];
memset(buffer, '\0', sizeof(buffer));
va_start(args, printfstring);
len = vsnprintf(buffer, BUFSTRLEN, printfstring, args);
va_end(args);
/* Did the buffer print work ? */
if( len < 0 || len >= BUFSTRLEN + 1 )
return -1;
return mysql_query(conn, buffer);
}
int main(int argc, char const *argv[])
{
int result;
MYSQL mysqlConn = ...;
/* Example stuff to send to the function.... */
char *id_machine= "8";
char *value= "1234";
char *valor= "1";
/* Send the query */
result = DoMysqlQuery(
&mysqlConn,
"INSERT INTO results(`id_machine`,`value`,`valor`) VALUES(%s,'%s',%s);",
id_machine, value, valor);
if( result )
{
/* handle error etc... *.
}
}
In this example, the query string that will be sent to mysql_query() is:
INSERT INTO results(id_machine,value,valor) VALUES(8,'1234',1);
Hope this helps :)