📄 dbdriver.cpp
字号:
#include "dbdriver.h"
// In the comments below is the skeleton for a new
// ShortHand database driver:
/**
class MyDriver : public ShhDbDriver
{
public:
MyDriver()
{
}
void throwSQL(const char* format, ...)
{
va_list args; va_start(args, format);
throw new ShhObjectException(format, args);
}
bool spi_RecognizeDriverName(const char* driverName)
{
string name(driverName);
return name.ieq("SAMPLE");
}
const char* spi_GetDriverPrefix()
{
return "SAMPLE";
}
int spi_GetDriverDescription(string& driverDescription)
{
driverDescription = "MySQL Native Driver";
return driverDescription.length();
}
virtual ShhDbHandle spi_Connect(const char* connString)
{
// connection string has the following format:
// "driver={mysql}; database=yourdatabase;server=server;uid=username;pwd=password;option=16386;"
// and is stored in the "STRING" property
if (!g_mysql_initialized)
{
mysql_init(&g_mysql);
g_mysql_initialized = true;
}
string host, user, passwd, db, port, flags;
char* tok_start = (char*)(connString);
char* tok_end = NULL;
while((tok_end = strchr(tok_start, ';')) != NULL)
{
*tok_end = '\0';
char* name = tok_start;
while(*name && isspace(*name)) name++;
char* eq = strchr(tok_start, '=');
if (eq != NULL)
{
*eq = '\0';
char* value = eq + 1;
while(*value && isspace(*value)) value++;
if (stricmp(name, "server") == 0)
host = value;
else if (stricmp(name, "database") == 0)
db = value;
else if (stricmp(name, "uid") == 0)
user = value;
else if (stricmp(name, "pwd") == 0)
passwd = value;
else if (stricmp(name, "port") == 0)
port = value;
else if (stricmp(name, "option") == 0)
flags = value;
}
tok_start = tok_end+1;
}
if (host.is_empty()) host = ".";
MYSQL* session = mysql_real_connect(&g_mysql,
host.nv(), user.nv(), passwd.nv(), db.nv(), atoi(port), NULL, 0
);
if (session == NULL)
throw new ShhObjectException("MySQL connection to '%s' failed: %s", host.cstr(), mysql_error(&g_mysql));
if (mysql_select_db(session, db) != 0)
{
char* e = mysql_error(session);
mysql_close(session);
throw new ShhObjectException("MySQL connection to '%s' (database '%s') failed: %s", host.cstr(), db.cstr(), e);
}
TRACE((5, "connected to MySQL\n"));
return (ShhDbHandle) session;
}
virtual int spi_GetLastError(ShhDbHandle conn, string& message)
{
int code = mysql_errno((MYSQL*) conn);
message = mysql_error((MYSQL*) conn);
return code;
}
virtual void spi_Disconnect(ShhDbHandle conn)
{
mysql_close((MYSQL*) conn);
}
virtual ShhCursorHandle spi_PrepareSQL(ShhDbHandle conn, const char* sql)
{
return NULL; // "prepare" is not supported for MySQL
}
virtual void spi_CloseCursor(ShhCursorHandle cursor)
{
// TODO
}
virtual void spi_CloseResult(ShhResultHandle resultSet)
{
if (resultSet != 0)
{
mysql_free_result((MYSQL_RES*) resultSet);
}
}
virtual int spi_ExecuteImmediate(ShhDbHandle dbHandle, const char* sql)
{
if (mysql_real_query((MYSQL*)dbHandle, sql, strlen(sql)) != 0)
{
int code = mysql_errno((MYSQL*)dbHandle);
const char* msg = mysql_error((MYSQL*)dbHandle);
throwSQL("SQL Query failed: MySQL error %d: %s", code, msg);
}
return 0;
}
virtual ShhResultHandle spi_ExecuteCursor(ShhDbHandle dbHandle, ShhCursorHandle cursor, const char* sql)
{
MYSQL* session = (MYSQL*) dbHandle;
if (mysql_real_query(session, sql, strlen(sql)) != 0)
{
int code = mysql_errno(session);
const char* msg = mysql_error(session);
throwSQL("SQL Query failed: MySQL error %d: %s", code, msg);
}
MYSQL_RES* result = mysql_store_result(session);
if (result == NULL)
{
return 0;
}
else
{
return (ShhResultHandle) result;
}
}
virtual int spi_GetFieldCount(ShhResultHandle resultHandle)
{
if (resultHandle == 0) return 0;
else return mysql_num_fields((MYSQL_RES*) resultHandle);
}
virtual int spi_GetRowCount(ShhResultHandle resultHandle)
{
if (resultHandle == 0) return 0;
else return (int) mysql_num_rows((MYSQL_RES*) resultHandle);
}
virtual int spi_GetFieldName(ShhResultHandle resultHandle, int fieldNumber, string& fieldName)
{
if (resultHandle == 0) { fieldName = ""; return 0; }
MYSQL_FIELD* field = mysql_fetch_field_direct((MYSQL_RES*) resultHandle, fieldNumber);
fieldName = field->name;
return fieldName.length();
}
virtual ShhRowHandle spi_Fetch(ShhResultHandle resultSet)
{
MYSQL_ROW row = mysql_fetch_row((MYSQL_RES*) resultSet);
return (ShhRowHandle) row;
}
virtual int spi_GetStringValue(ShhResultHandle resultHandle, ShhRowHandle rowHandle, int fieldNumber, string& value)
{
MYSQL_ROW row = (MYSQL_ROW) rowHandle;
unsigned long* lengths = mysql_fetch_lengths((MYSQL_RES*) resultHandle);
unsigned int length = lengths[fieldNumber];
if (length > 0)
{
value.set(row[fieldNumber], length);
}
else
{
value.clear();
}
return value.length();
}
virtual int spl_GetAffectedRows(ShhCursorHandle connection)
{
return (int) mysql_affected_rows((MYSQL*) connection);
}
virtual void spi_CloseRow(ShhRowHandle rowHandle)
{
}
};
ShhDbDriver* create_mysql_driver()
{
return new MySQLDriver();
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -