This program is free softwareyou can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundationeither version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTYwithout even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this programif not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#ifndef _mysql_h
#define _mysql_h
#ifdef __CYGWIN__ /* CYGWIN implements a UNIX API */
#undef WIN
#undef _WIN
#undef _WIN32
#undef _WIN64
#undef __WIN__
#endif
#ifdef __cplusplus
extern "C" {
#endif
#ifndef _global_h /* If not standard header */
#include <sys/types.h>
#ifdef __LCC__
#include <winsock.h> /* For windows */
#endif
typedef char my_bool
#if (defined(_WIN32) || defined(_WIN64)) &&!defined(__WIN__)
#define __WIN__
#endif
#if !defined(__WIN__)
#define STDCALL
#else
#define STDCALL __stdcall
#endif
typedef char * gptr
#ifndef my_socket_defined
#ifdef __WIN__
#define my_socket SOCKET
#else
typedef int my_socket
#endif /* __WIN__ */
#endif /* my_socket_defined */
#endif /* _global_h */
#include "mysql_com.h"
#include "mysql_time.h"
#include "mysql_version.h"
#include "typelib.h"
#include "my_list.h" /* for LISTs used in 'MYSQL' and 'MYSQL_STMT' */
extern unsigned int mysql_port
extern char *mysql_unix_port
#define CLIENT_NET_READ_TIMEOUT 365*24*3600 /* Timeout on read */
#define CLIENT_NET_WRITE_TIMEOUT 365*24*3600 /* Timeout on write */
#ifdef __NETWARE__
#pragma pack(push, 8) /* 8 byte alignment */
#endif
#define IS_PRI_KEY(n) ((n) &PRI_KEY_FLAG)
#define IS_NOT_NULL(n) ((n) &NOT_NULL_FLAG)
#define IS_BLOB(n) ((n) &BLOB_FLAG)
#define IS_NUM(t) ((t) <= FIELD_TYPE_INT24 || (t) == FIELD_TYPE_YEAR || (t) == FIELD_TYPE_NEWDECIMAL)
#define IS_NUM_FIELD(f) ((f)->flags &NUM_FLAG)
#define INTERNAL_NUM_FIELD(f) (((f)->type <= FIELD_TYPE_INT24 &&((f)->type != FIELD_TYPE_TIMESTAMP || (f)->length == 14 || (f)->length == 8)) || (f)->type == FIELD_TYPE_YEAR)
typedef struct st_mysql_field {
char *name/* Name of column */
char *org_name/* Original column name, if an alias */
char *table /* Table of column if column was a field */
char *org_table /* Org table name, if table was an alias */
char *db /* Database for table */
char *catalog /* Catalog for table */
char *def /* Default value (set by mysql_list_fields) */
unsigned long length /* Width of column (create length) */
unsigned long max_length /* Max width for selected set */
unsigned int name_length
unsigned int org_name_length
unsigned int table_length
unsigned int org_table_length
unsigned int db_length
unsigned int catalog_length
unsigned int def_length
unsigned int flags/* Div flags */
unsigned int decimals /* Number of decimals in field */
unsigned int charsetnr/* Character set */
enum enum_field_types type/* Type of field. See mysql_com.h for types */
} MYSQL_FIELD
typedef char **MYSQL_ROW /* return data as array of strings */
typedef unsigned int MYSQL_FIELD_OFFSET/* offset to current field */
#ifndef _global_h
#if defined(NO_CLIENT_LONG_LONG)
typedef unsigned long my_ulonglong
#elif defined (__WIN__)
typedef unsigned __int64 my_ulonglong
#else
typedef unsigned long long my_ulonglong
#endif
#endif
#define MYSQL_COUNT_ERROR (~(my_ulonglong) 0)
/* backward compatibility define - to be removed eventually */
#define ER_WARN_DATA_TRUNCATED WARN_DATA_TRUNCATED
typedef struct st_mysql_rows {
struct st_mysql_rows *next /* list of rows */
MYSQL_ROW data
unsigned long length
} MYSQL_ROWS
typedef MYSQL_ROWS *MYSQL_ROW_OFFSET /* offset to current row */
#include "my_alloc.h"
typedef struct embedded_query_result EMBEDDED_QUERY_RESULT
typedef struct st_mysql_data {
my_ulonglong rows
unsigned int fields
MYSQL_ROWS *data
MEM_ROOT alloc
/* extra info for embedded library */
struct embedded_query_result *embedded_info
} MYSQL_DATA
enum mysql_option
{
MYSQL_OPT_CONNECT_TIMEOUT, MYSQL_OPT_COMPRESS, MYSQL_OPT_NAMED_PIPE,
MYSQL_INIT_COMMAND, MYSQL_READ_DEFAULT_FILE, MYSQL_READ_DEFAULT_GROUP,
MYSQL_SET_CHARSET_DIR, MYSQL_SET_CHARSET_NAME, MYSQL_OPT_LOCAL_INFILE,
MYSQL_OPT_PROTOCOL, MYSQL_SHARED_MEMORY_BASE_NAME, MYSQL_OPT_READ_TIMEOUT,
MYSQL_OPT_WRITE_TIMEOUT, MYSQL_OPT_USE_RESULT,
MYSQL_OPT_USE_REMOTE_CONNECTION, MYSQL_OPT_USE_EMBEDDED_CONNECTION,
MYSQL_OPT_GUESS_CONNECTION, MYSQL_SET_CLIENT_IP, MYSQL_SECURE_AUTH,
MYSQL_REPORT_DATA_TRUNCATION, MYSQL_OPT_RECONNECT,
MYSQL_OPT_SSL_VERIFY_SERVER_CERT
}
struct st_mysql_options {
unsigned int connect_timeout, read_timeout, write_timeout
unsigned int port, protocol
unsigned long client_flag
char *host,*user,*password,*unix_socket,*db
struct st_dynamic_array *init_commands
char *my_cnf_file,*my_cnf_group, *charset_dir, *charset_name
char *ssl_key /* PEM key file */
char *ssl_cert /* PEM cert file */
char *ssl_ca /* PEM CA file */
char *ssl_capath /* PEM directory of CA-s? */
char *ssl_cipher /* cipher to use */
char *shared_memory_base_name
unsigned long max_allowed_packet
my_bool use_ssl /* if to use SSL or not */
my_bool compress,named_pipe
/*
On connect, find out the replication role of the server, and
establish connections to all the peers
*/
my_bool rpl_probe
/*
Each call to mysql_real_query() will parse it to tell if it is a read
or a write, and direct it to the slave or the master
*/
my_bool rpl_parse
/*
If set, never read from a master, only from slave, when doing
a read that is replication-aware
*/
my_bool no_master_reads
#if !defined(CHECK_EMBEDDED_DIFFERENCES) || defined(EMBEDDED_LIBRARY)
my_bool separate_thread
#endif
enum mysql_option methods_to_use
char *client_ip
/* Refuse client connecting to server if it uses old (pre-4.1.1) protocol */
my_bool secure_auth
/* 0 - never report, 1 - always report (default) */
my_bool report_data_truncation
select A.name,A.sum,B.zong from (select name, sum(xiaoshou) as sum from shujv group by name) Ainner join (select name,zong from shujv order by month desc Limit 1) B
on A.name=B.name
the importance is the latest mysql not yet support the SSL in windows platform.This means its SSL just support unix platform.Note my source is verbose as following while you feel free:
#include<string.h>
#include<my_global.h>
#include<mysql.h>
#include<my_getopt.h>
static char *opt_host_name=NULL
static char *opt_user_name=NULL
static char *opt_password=NULL
static unsigned int opt_port_num=0
static char *opt_socket_name=NULL
static char *opt_db_name=NULL
static unsigned int opt_flags=0
static MYSQL *conn
static const char *client_groups[]={"client',NULL}
static struct my_option my_opts[]={
{"help",'?',"Display this help and exit",NULL,NULL,NULL,GET_NO_ARG,NO_ARG,0,0,0,0,0,0},
{"host",'h',"Host to connect to",(gptr *) &opt_host_name,NULL,NULL,GET_STR_ALLOC,REQUIRED_ARG,0,0,0,0,0,0}'
{"password",'p',"Password",(gptr *) &opt_password,NULL,NULL,GET_STR_ALLOC,OPT_ARG,0,0,0,0,0,0},
{"port",'P',"Port number",(gptr *) &opt_port_num,NULL,NULL,GET_UINT,REQUIRED_ARG,0,0,0,0,0,0},
{"SOCKET",'S',"Socket path",(gptr *) &opt_socket_name,NULL,NULL,GET_UINT,REQUIRED_ARG,0,0,0,0,0,0},
{"user",'u',"User name",(gptr *) &opt_user_name,NULL,NULL,GET_UINT,REQUIRED_ARG,0,0,0,0,0,0}
}
void
print_error(MYSQL *conn,char *message)
{
fprintf(stderr,"%s\n",message)
if (conn!=NULL)
{
fprintf(stderr,"Error %u (%s)\n"'mysql_errno(conn),mysql_error(conn))
}
}
my_bool
get_one_option(int optid,const struct my_option *opt, char *argument)
{
switch(optid)
{
case'?':
my_print_help(my_opt)
exit(0)
case'p':
if(!argument)
ask_password=1
else
{
opt_password=strdup(argument)
if(opt_password==NULL)
{
print_error(NULL,"could not allocate password buffer")
exit(1)
}
while(*argument)
*argument++='x'
}
break
#include <sslopt-case.h>
}
return(0)
}
int
main(int argc,char *argv[])
{
int opt_err
my_init()
load_defaults("my",client_groups,&argc,&argv)
if((opt_err=handle_options(&argc,&argv,my_opts,get_one_option)))
exit(opt_err)
if(ask_password)
opt_password=get_tty_password(NULL)
if(argc>0)
{
opt_db_name=argv[0]
--argc==argv
}
conn=mysql_init(NULL)
if(conn==NULL)
{
print_error(NULL,"mysql_init() dailed(probably out of memory)")
exit(1)
}
if(mysql_real_connect(conn,opt_host_name,opt_user_name,opt_password,opt_db_name,opt_port_num,opt_socket_name,opt_flags)==NULL)
{
print_error(conn,"mysql_real_connect() failed")
mysql_close(conn)
exit(1)
}
mysql_close(conn)
exit(0)
}
#include<sslopt-longopts.h>
{NULL,0,NULL,NULL,NULL,NULL,GET_NO_ARG,NO_ARG,0,0,0,0,0,0}
}
#ifdef HAVE_OPENSSL
{"ssl",OPT_SLL_SLL,"Enable SSL for connection.Disable with --skip-sll",(gptr*) &opt_use_ssl,NULL,0,GET_BOOL,NO_ARG,0,0,0,0,0,0},
{"ssl-key",OPT_SSL_CERT,"X509 key in PEM format(implies --ssl)",(gptr*) &opt_ssl_key,NULL,0,GET_STR,REQUIRED_ARG,0,0,0,0,0,0},
{"ssl-cert",OPT_SSL_CERT,"X509 cert in PEM format(implies --ssl)",(gptr*) &opt_ssl_cert,NULL,0,GET_STR,REQUIRED_ARG,0,0,0,0,0,0},
{"ssl-ca",OPT_SSL_CA,"CA file in PEM format(check openSSL docs,implies --sl)",(gptr*) &opt_ssl_ca,NULL,0,GET_STR,REQUIRED_ARG,0,0,0,0,0,0},
{"ssl-capath",OPT_SSL_CAPATH,"CA direcory(check openSSL docs,implies --sl)",(gptr*) &opt_ssl_capath,NULL,0,GET_STR,REQUIRED_ARG,0,0,0,0,0,0},
{"ssl-cipher",OPT_SSL_CIPHER,"SSLcipher to use(implies --ssl)",(gptr*) &opt_ssl_cipher,NULL,0,GET_STR,REQUIRED_ARG,0,0,0,0,0,0},
#endif
#ifdef HAVE_OPENSSL
eum options
{
OPT_SSL_SSL=256,
OPT_SSL_KEY'
OPT_SSL_CERT,
OPT_SSL_CA,
OPT_SSL_CAPATH,
OPT_SSL_CIPHER
}
#endif
#ifdef HAVE_OPENSSL
static my bool opt_use_ssl=0
static char *opt_ssl_key=0
static char *opt_ssl_cert=0
static char *opt_ssl_ca=0
static char *opt_ssl_capath=0
static char *opt_ssl_cipher=0
#endif
#ifdef HAVE_OPENSSL
case OPT_SSL_KEY:
case OPT_SSL_CERT:
case OPT_SSL_CA:
case OPT_SSL_CAPATH:
case OPT_SSL_CIPHER:
opt_use_ssl=1
break
#endif
Now put following source to the program sslclient:
conn=mysql_init(NULL)
if(conn==NULL)
{
print_error(NULL,"mysql_init() failed(probably out of memory)")
exit(1)
}
#ifdef HAVE_OPENSSL
if(opt_use_ssl)
mysql_ssl_set(conn,opt_ssl_key,opt_ssl_cert,opt_ssl_ca,opt_ssl_capath,opt_ssl_cipher)
#endif
if(mysql_real_connect(conn,opt_host_name,opt_user_name,_opt_password,opt_db_name,opt_port_num,opt_socket_name,opt_flags)==NULL)
{
print_error(conn,"mysql_real_connect() failed")
mysql_close(conn)
exit(1)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)