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 :)
Related
I am writing a program where the user is giving random 10 bytes which I am storing in a buffer. Then search the hexadecimal string in a MySql database.
unsigned char buffer[10]; //Example:- {23, 181, 185, 192, 101, 156, 61, 247, 206, 204}
//convert each byte into 2 digit hexadecimal characters and store it in an array.
unsigned char hex_bytes[21];
for(int i = 0, l = 0; i < 10; i++) {
int decimal_num = buffer[i];
int quotient, remainder;
char hex_num[10];
quotient = decimal_num;
int j = 0;
while(quotient != 0) {
remainder = quotient % 16;
if(remainder < 10) {
hex_num[j++] = 48 + remainder;
}
else {
hex_num[j++] = 87 + remainder; //hex_num[j++] = 55 + remainder;
}
quotient = quotient/16;
}
for(int k = j-1; k >=0; k--) {
hex_bytes[l++] = hex_num[k];
}
}
printf("Ticket no. = %s\n", hex_bytes);
//------------------------------------------------------------------//
//Querying the Database
unsigned char query1[256];
uint32_t nos[10000];
MYSQL_RES *result;
//unsigned char* hex_str = "17b5b9c0659c3df7cecc"; <-----
//sprintf(query1, "SELECT sn FROM fixit_log WHERE rn = '%s'", hex_str); <-----
sprintf(query1, "SELECT sn FROM fixit_log WHERE rn = '%s'", hex_bytes);
mysql_query(con, query1);
if(mysql_errno(con) != 0) {
printf("stderr: %s\n", mysql_error(con));
mysql_close(con);
return;
}
result = mysql_store_result(con);
int k = 0;
for(int i =0; i < sr_nos_size; i++) {
MYSQL_ROW row = mysql_fetch_row(result);
printf("--sn: %2s\n", row[0]);
}
}
My Database looks like this:
sn rn
123456 17b5b9c0659c3df7cecc ///hexadecimal string of the given example as stored in the database
123457 17b5b9c0659c3df7cecc
123458 17b5b9c0659c3df7cecc
If I hardcode the hexadecimal string(comment out // part), I am getting the proper output. But if I run the program as above I am don't get any output.
I have written a c program that I hoped would read data from a text file and put it in a database.
The problem is that the code doesn't execute all iterations of a while loop in the main function as I hoped it would
#Explanation of the algorithm#
The program opens the file that contains the records and reads the whole file into a buffer. Then it chops the string
into records seperated by \n. It then gets each record and composes an sql insert statement then writes the record to the database
Here is the code:
#include <stdio.h>
#include <string.h>
#include <mysql.h>
#define MAX_LEN 1000
/*
#Explanation of the algorithm#
The program opens the file that contains the recored and reads the whole file into a buffer. Then it chops the string
into records. it then gets each record and composes an sql insert statement then writes the record to the database
*/
// function to change the date format to the correct database format
const char* date_formater(char date[],char search_for,char new)
{
int i;
for(i = 0; i <= strlen(date); i++)
{
if(date[i] == search_for)
{
date[i] = new;
}
}
return date;
}
// send data to the database
void send_data_to_database(char str[],MYSQL *con)
{
/*Get data to send to the database*/
char data[8][100];
char delimeter[] = "\t";
char *token = strtok(str,delimeter);
int i = 0;
while(token != NULL)
{
strcpy(data[i],token);
token = strtok(NULL,delimeter);
i++;
}
char o_id[] = "0";
strcpy(data[7],o_id);
// generate sql insert statement
char closingbrac[] = ")";
char single_quote[] = "\'";
char comma[] = ",";
char sql[200] = "INSERT INTO patient VALUES(";
for(int j = 0;j<=7;j++)
{
switch(j)
{
case 0:
strcat(sql,data[j]);
strcat(sql,comma);
break;
case 2:
strcat(sql,single_quote);
const char* real_date = date_formater(data[j],'/','-'); // change date to databse required format
strcat(sql,real_date);
strcat(sql,single_quote);
strcat(sql,comma);
break;
case 7:
strcat(sql,data[j]);
strcat(sql,closingbrac);
printf("%s\n",data[j] );
break;
default:
strcat(sql,single_quote);
strcat(sql,data[j]);
strcat(sql,single_quote);
strcat(sql,comma);
}
}
printf("%s\n",sql);
/*Send SQL query*/
if(mysql_query(con,sql))
{
fprintf(stderr, "%s\n",mysql_error(con));
exit(1);
}
}
/*control function*/
int main()
{
MYSQL *conn;
char *server = "localhost";
char *user = "root";
char *password = "MasterY";
char *database = "covid";
conn = mysql_init(NULL);
/*Connect to database*/
if(!mysql_real_connect(conn,server,user,password,database,0,NULL,0))
{
fprintf(stderr, "%s\n",mysql_error(conn));
exit(1);
}
// open the file containing the patient records
FILE *fptr;
fptr = fopen("/home/elijah/Desktop/plan.txt","r");
if(fptr == NULL)
{
printf("Error!");
exit(1);
}
//open the file containing records for reading
char string[MAX_LEN + 1];
// get all the file contents and store them in a string
fscanf(fptr,"%[^$]",string);
printf("Text file contents:\n%s\n",string);
//puts(string);
printf("String: \n%s\n",string);
char delim[] = "\n";
char *ptr = strtok(string,delim);
while(ptr != NULL)
{
// function call to send data to the database
send_data_to_database(ptr,conn);
ptr = strtok(NULL,delim);
}
/*close connection*/
mysql_close(conn);
//closing the file and clearing it
fclose(fptr);
FILE *file;
file = fopen("/home/elijah/Desktop/plan.txt","w");
fclose(file);
printf("Execution\n");
return 0;
}
The compiler executes the main function up to the while loop. And funnily it only executes one iteration and stops after the first iteration.
Yet I hoped it would continue and finish all the different lines in the text file
It executes the send_data_to_database(ptr,conn); completely.
Here is the text file. Every line is a record that has to be inserted into a database
6 Okello Ivan 2020/10/11 False Positive Assymptomatic M John
7 Leku Davis 2020/02/03 Positive Assymptomatic M Malik Berry
8 Okello Ivan 2020/10/11 False Positive Assymptomatic M John
9 Leku Davis 2020/02/03 Positive Assymptomatic M Malik Berr
Here is a copy of the output:
It only inputs one record into the db. Yet I hoped that it would insert all. I don't know what the problem is but I know something isn't right. That's why I am here.
elijah#elijah-HP-255-G6-Notebook-PC:~/Desktop$ ./mysql
Text file contents:
6 Okello Ivan 2020/10/11 False Positive Assymptomatic M John
7 Leku Davis 2020/02/03 Positive Assymptomatic M Malik Berry
8 Okello Ivan 2020/10/11 False Positive Assymptomatic M John
9 Leku Davis 2020/02/03 Positive Assymptomatic M Malik Berry
String:
6 Okello Ivan 2020/10/11 False Positive Assymptomatic M John
7 Leku Davis 2020/02/03 Positive Assymptomatic M Malik Berry
8 Okello Ivan 2020/10/11 False Positive Assymptomatic M John
9 Leku Davis 2020/02/03 Positive Assymptomatic M Malik Berry
0
INSERT INTO patient VALUES(6,'Okello Ivan ','2020-10-11 ','False Positive ','Assymptomatic ','M ','John',0)
Execution
This is the database table SQL CREATE statement for a MYSQL Database.
CREATE TABLE `patient` (
`idpatient` int(11) NOT NULL AUTO_INCREMENT,
`fullname` varchar(255) NOT NULL,
`date-of-id` date DEFAULT NULL,
`covid-status` varchar(45) DEFAULT NULL,
`nature` varchar(45) DEFAULT NULL,
`gender` varchar(30) DEFAULT NULL,
`officer_name` varchar(45) DEFAULT NULL,
`o-id` varchar(45) DEFAULT NULL,
PRIMARY KEY (`idpatient`,`fullname`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;
I compile the source code using this command:
gcc -o mysql -I/usr/include/mysql addtodatabase.c -L/usr/lib/x86_64-linux-gnu -lmysqlclient -lpthread -lz -lm -lrt -latomic -lssl -lcrypto -ldl
Because I used #include <mysql.h>
Someone please help me.
#UPDATE
I found out that I could use a csv file to push that data to the database since it's already in tabular format. But I am finding trouble using the LOAD DATA statement.
Here is the updated code
#include <stdio.h>
#include <string.h>
#include <mysql.h>
#define MAX_LEN 1000
/*
#Explanation of the algorithm#
The program opens the file that contains the recored and reads the whole file into a buffer. Then it chops the string
into records. it then gets each record and composes an sql insert statement then writes the record to the database
*/
// function to change the date format to the correct database format
const char* formater(char date[],char search_for,char new)
{
int i;
for(i = 0; i <= strlen(date); i++)
{
if(date[i] == search_for)
{
date[i] = new;
}
}
return date;
}
// send data to the database
void send_data_to_database(MYSQL *con)
{
// SQL QUERY
char sql[] = "LOAD DATA LOCAL INFILE '/home/elijah/Desktop/cron_job/patients.csv' INTO TABLE patient COLUMNS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 LINES (`idpatient`,`fullname`,`date-of-id`,`covid-status`,`nature`,`gender`,`officer_name`,`o-id`)";
/*Send SQL query*/
if(mysql_query(con,sql))
{
fprintf(stderr, "%s\n",mysql_error(con));
exit(1);
}
else
{
printf("Data Sent\n");
}
}
/*control function*/
int main()
{
MYSQL *conn;
char *server = "localhost";
char *user = "root";
char *password = "MasterY";
char *database = "covid";
conn = mysql_init(NULL);
/*Connect to database*/
if(!mysql_real_connect(conn,server,user,password,database,0,NULL,0))
{
fprintf(stderr, "%s\n",mysql_error(conn));
exit(1);
}
// open the file containing the patient records
FILE *fptr;
fptr = fopen("/home/elijah/Desktop/cron_job/patients.txt","r");
if(fptr == NULL)
{
printf("Error!");
exit(1);
}
//open the file containing records for reading
char string[MAX_LEN + 1];
// get all the file contents and store them in a string
fscanf(fptr,"%[^$]",string);
printf("Text file contents:\n%s\n",string);
//puts(string);
printf("String: \n%s\n",string);
// put the data into csv file format and write it
const char *formated_csv_string = formater(string,'\t',',');
char csv_string[] = "idpatient,fullname,date-of-id,covid-status,nature,gender,officer_name,o-id\n";
strcat(csv_string,formated_csv_string);
printf("%s\n",csv_string);
FILE *csv_file;
csv_file = fopen("/home/elijah/Desktop/cron_job/patients.csv","w");
if(csv_file == NULL)
{
printf("Crap\n");
}
else
{
printf("Yayyyyy\n");
fprintf(csv_file, "%s",csv_string);
}
send_data_to_database(conn);
/*close connection*/
mysql_close(conn);
//closing the file and clearing it
fclose(fptr);
// FILE *file;
// file = fopen("/home/elijah/Desktop/cron_job/patients.txt","w");
// fclose(file);
printf("Execution\n");
return 0;
}
The LOAD DATA SQL statement does not work. What could be the problem.
Here is the output
elijah#elijah-HP-255-G6-Notebook-PC:~/Desktop$ ./mysql
Text file contents:
1 Okello Ivan 2020/08/13 False Positive Assymptomatic M Mary 0
String:
1 Okello Ivan 2020/08/13 False Positive Assymptomatic M Mary 0
idpatient,fullname,date-of-id,covid-status,nature,gender,officer_name,o-id
1,Okello Ivan ,2020/08/13 ,False Positive ,Assymptomatic ,M ,Mary,0
Yayyyyy
Data Sent
Execution
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.
I'm in the phase of developing a C project which interacts with mysql. So i planned to use mysql stored procedure and found a sample program in this link
I just changed the program according to the requirements of my project. Here is the table structure
id | int(10) unsigned | NO | PRI | NULL | auto_increment |
username | varchar(64) | NO | MUL | NULL | |
password | varchar(25) | NO | | NULL | |
And here is my program.
int main()
{
MYSQL_RES *result;
MYSQL *mysql=mysql_init(NULL);
/* connect to server with the CLIENT_MULTI_STATEMENTS option */
if (mysql_real_connect (mysql, "localhost", "root", "root123","DONT_USE", 0, NULL , CLIENT_MULTI_STATEMENTS) == NULL)
{
printf("mysql_real_connect() failed\n");
mysql_close(mysql);
}
MYSQL_STMT *stmt;
MYSQL_BIND ps_params[1]; /* input parameter buffers */
long int int_data[3]; /* input/output values */
my_bool is_null[3]; /* output value nullability */
int status;
char own_buf[25],input_buf[64];
memset(own_buf, 0, 25);
memset(input_buf, 0, 64);
/* set up stored procedure */
status = mysql_query(mysql, "DROP PROCEDURE IF EXISTS p1");
test_error(mysql, status);
status = mysql_query(mysql,
"CREATE PROCEDURE p1("
" IN p_in VARCHAR(64)) "
"BEGIN "
" SELECT password from data where username=p_in; "
"END");
test_error(mysql, status);
/* initialize and prepare CALL statement with parameter placeholders */
stmt = mysql_stmt_init(mysql);
if (!stmt)
{
printf("Could not initialize statement\n");
}
status = mysql_stmt_prepare(stmt, "CALL p1(?)", 10);
test_stmt_error(stmt, status);
/* initialize parameters: p_in, p_out, p_inout (all INT) */
memset(ps_params, 0, sizeof (ps_params));
ps_params[0].buffer_type = MYSQL_TYPE_STRING;
ps_params[0].buffer = (void *) &input_buf;
ps_params[0].buffer_length = sizeof(input_buf);
ps_params[0].is_null = 0;
/* bind parameters */
status = mysql_stmt_bind_param(stmt, ps_params);
test_stmt_error(stmt, status);
/* assign values to parameters and execute statement */
int_data[0]= 2; /* p_in */
int_data[1]= 20; /* p_out */
strcpy(input_buf,"'6666600222'");
int_data[0] = strlen(input_buf);
input_buf[int_data[0]] = '\0';
ps_params[0].length = &int_data[0];
status = mysql_stmt_execute(stmt);
test_stmt_error(stmt, status);
/* process results until there are no more */
do {
int i;
int num_fields; /* number of columns in result */
MYSQL_FIELD *fields; /* for result set metadata */
MYSQL_BIND *rs_bind; /* for output buffers */
/* the column count is > 0 if there is a result set */
/* 0 if the result is only the final status packet */
num_fields = mysql_stmt_field_count(stmt);
if (num_fields > 0)
{
/* there is a result set to fetch */
printf("Number of columns in result: %d\n", (int) num_fields);
/* what kind of result set is this? */
printf("Data: ");
if(mysql->server_status & SERVER_PS_OUT_PARAMS)
printf("this result set contains OUT/INOUT parameters\n");
else
printf("this result set is produced by the procedure\n");
MYSQL_RES *rs_metadata = mysql_stmt_result_metadata(stmt);
test_stmt_error(stmt, rs_metadata == NULL);
fields = mysql_fetch_fields(rs_metadata);
rs_bind = (MYSQL_BIND *) malloc(sizeof (MYSQL_BIND) * num_fields);
if (!rs_bind)
{
printf("Cannot allocate output buffers\n");
}
memset(rs_bind, 0, sizeof (MYSQL_BIND) * num_fields);
/* set up and bind result set output buffers */
for (i = 0; i < num_fields; ++i)
{
rs_bind[i].buffer_type = fields[i].type;
rs_bind[i].is_null = &is_null[i];
switch (fields[i].type)
{
case MYSQL_TYPE_LONG:
rs_bind[i].buffer = (char *) &(int_data[i]);
rs_bind[i].buffer_length = sizeof (int_data);
break;
case MYSQL_TYPE_VAR_STRING:
rs_bind[i].buffer = (char *) own_buf;
rs_bind[i].buffer_length = sizeof(own_buf);
rs_bind[i].length = &int_data[1];
break;
default:
fprintf(stderr, "ERROR: unexpected type: %d.\n", fields[i].type);
}
}
status = mysql_stmt_bind_result(stmt, rs_bind);
test_stmt_error(stmt, status);
/* fetch and display result set rows */
while (1)
{
status = mysql_stmt_fetch(stmt);
if (status == 1 || status == MYSQL_NO_DATA)
break;
for (i = 0; i < num_fields; ++i)
{
switch (rs_bind[i].buffer_type)
{
case MYSQL_TYPE_LONG:
if (*rs_bind[i].is_null)
printf(" val[%d] = NULL;", i);
else
printf(" val[%d] = %ld;",
i, (long) *((int *) rs_bind[i].buffer));
break;
case MYSQL_TYPE_VAR_STRING:
printf(" val[%d] = %s;",i,(char*)rs_bind[i].buffer);
break;
default:
printf(" unexpected type (%d)\n",
rs_bind[i].buffer_type);
}
}
printf("\n");
}
mysql_free_result(rs_metadata); /* free metadata */
free(rs_bind); /* free output buffers */
}
else
{
/* no columns = final status packet */
printf("End of procedure output\n");
}
/* more results? -1 = no, >0 = error, 0 = yes (keep looking) */
status = mysql_stmt_next_result(stmt);
if (status > 0)
test_stmt_error(stmt, status);
} while (status == 0);
mysql_stmt_close(stmt);
}
OUTPUT:
Number of columns in result: 1
Data: this result set is produced by the procedure
End of procedure output
Above code works fine in case of integer argument like CREATE PROCEDURE p1(IN p_in INT) but not for varchar arguments.
link as mentioned in the link for varchar input parameter type is MYSQL_TYPE_STRING and output parameter type is MYSQL_TYPE_VAR_STRING
Problem:
Getting empty result.
As far my analysis, status = mysql_stmt_fetch(stmt); function returns 100(MYSQL_NO_DATA) though the entry present in the table.
NOTE: I tried calling the procedure manually into mysql like call p1('6666600222'); which results
mysql> call p1('6666600222');
+----------+
| password |
+----------+
| 1234 |
+----------+
1 row in set (0.00 sec)
Anyone help me to short out this?
In order to set a varchar param, ps_params should take pointer to char not pointer to pointer to char.
Try change:
ps_params[0].buffer = (void *) &input_buf;
to:
ps_params[0].buffer = (void *)&(input_buf[0]); // or just (void *)input_buf
And after set string value to input_buf set ps_params[0].buffer_length as below:
ps_params[0].buffer_length = strlen(input_buf);
Hope this helps
I have a temperature sensor hooked up to a Raspberry Pi, I am able to read and printf the temperature. What I am trying to do next is to get the values from the sensor and have them get logged into a MySQL database.
Everything works, except, I can not figure out how to format the MySQL insert Query to use the f variable and the h variable that is generated by the read_dht_data() function and pass it to the MIA_temp_insert(float f, float h).
#include <stdio.h>
#include <stdlib.h>
#include <mysql/mysql.h>
#include <wiringPi.h>
#include <stdint.h>
#define MAX_TIMINGS 85
#define DHT_PIN 3 /* GPIO-22 */
int data[5] = { 0, 0, 0, 0, 0 };
float temp_f;
static char *host = "XXX.XXX.XXX.XXX";
static char *user = "XXX";
static char *password = "XXX";
static char *dbname = "XXX";
unsigned int port = 3306;
static char *unix_socket = NULL;
unsigned int flag = 0;
static MYSQL *conn; //Needed to be static so all of the functions can draw from it
void MIA_mysql_connection()
{
// Connecting to the Database
conn = mysql_init(NULL);
if (!(mysql_real_connect(conn, host, user, password, dbname, port, unix_socket, flag)))
{
fprintf(stderr, "\n Error: %s [%d] \n", mysql_error(conn),mysql_errno(conn));
exit (1);
}
//Connected
printf ("We Are Connected \n");
}
void MIA_mysql_close()
{
//Closing Connection
mysql_close(conn);
}
void MIA_temp_insert(float f, float h)
{
//Inserting into MySQL Table
if(mysql_query(conn, "INSERT INTO `temperature` (`id`, `Date`,`Time`, `Temperature`, `Humidity`) VALUES (NULL, CURRENT_DATE(), CURRENT_TIME(), '%f' , '%f')") !=0)
{
fprintf(stderr, "%s\n", mysql_error(conn));
exit (-1);
} else {
printf("Rows were insert \n");
}
}
void read_dht_data()
{
uint8_t laststate = HIGH;
uint8_t counter = 0;
uint8_t j = 0, i;
data[0] = data[1] = data[2] = data[3] = data[4] = 0;
/* pull pin down for 18 milliseconds */
pinMode( DHT_PIN, OUTPUT );
digitalWrite( DHT_PIN, LOW );
delay( 18 );
/* prepare to read the pin */
pinMode( DHT_PIN, INPUT );
/* detect change and read data */
for ( i = 0; i < MAX_TIMINGS; i++ )
{
counter = 0;
while ( digitalRead( DHT_PIN ) == laststate )
{
counter++;
delayMicroseconds( 1 );
if ( counter == 255 )
{
break;
}
}
laststate = digitalRead( DHT_PIN );
if ( counter == 255 )
break;
/* ignore first 3 transitions */
if ( (i >= 4) && (i % 2 == 0) )
{
/* shove each bit into the storage bytes */
data[j / 8] <<= 1;
if ( counter > 16 )
data[j / 8] |= 1;
j++;
}
}
/*
* check we read 40 bits (8bit x 5 ) + verify checksum in the last byte
* print it out if data is good
*/
if ( (j >= 40) &&
(data[4] == ( (data[0] + data[1] + data[2] + data[3]) & 0xFF) ) )
{
float h = (float)((data[0] << 8) + data[1]) / 10;
if ( h > 100 )
{
h = data[0]; // for DHT11
}
float c = (float)(((data[2] & 0x7F) << 8) + data[3]) / 10;
if ( c > 125 )
{
c = data[2]; // for DHT11
}
if ( data[2] & 0x80 )
{
c = -c;
}
float f = c * 1.8f + 32;
//printf( "Humidity = %.1f %% Temperature = %.1f *C (%.1f *F)\n", h, c, f );
printf ("Temp of the room is : %.1f \n",f);
//Insert Data into MIA Temperature Table
MIA_temp_insert(10.0,11.1);
}else {
//printf( "Data not good, skip\n" );
}
}
int main ()
{
printf( "Raspberry Pi DHT11/DHT22 temperature/humidity test\n" );
if ( wiringPiSetup() == -1 )
exit( 1 );
while ( 1 )
{
MIA_mysql_connection();
read_dht_data();
delay (1000);
MIA_mysql_close();
printf("End of program \n");
}
return(0);
}
You cannot use printf()-style format specifiers in mysql_query() directly as you have above. Instead, you can use sprintf() or snprintf() to write the format string -- with the formatted numbers instead of format specifiers -- into a buffer... then pass that as your query string.
So in MIA_temp_insert(), instead of the following:
if(mysql_query(conn, "INSERT INTO `temperature` (`id`, `Date`,`Time`, `Temperature`, `Humidity`) VALUES (NULL, CURRENT_DATE(), CURRENT_TIME(), '%f' , '%f')") !=0)
{
fprintf(stderr, "%s\n", mysql_error(conn));
exit (-1);
/* ...etc... */
...you could try this:
/* Your original query string, with the %f specifiers */
const char *formatstring = "INSERT INTO `temperature` (`id`, `Date`,`Time`, `Temperature`, `Humidity`) VALUES (NULL, CURRENT_DATE(), CURRENT_TIME(), '%f' , '%f')";
/* snprintf() the query into a buffer, to fill in the numbers */
char buf[256]; // should be large enough for the query with the numbers filled in
if (snprintf(buf, sizeof(buf), formatstring, f, h) >= sizeof(buf))
{
exit(-1); // if snprintf() returned sizeof(buf) or more, buf was too short
}
/* call mysql_query() with the formatted query from the buffer */
if (mysql_query(conn, buf) != 0)
{
fprintf(stderr, "%s\n", mysql_error(conn));
exit (-1);
/* ...etc... */