📄 sqlrelay.c
字号:
// Copyright (c) 2001 David Muse// See the file COPYING for more information.#include <ruby.h>#include "../c++/include/sqlrelay/sqlrclient.h"#include "rubyincludes.h"extern "C" {// sqlrconnection methodsstatic void sqlrcon_free(void *sqlrcon) { delete (sqlrconnection *)sqlrcon;}static VALUE sqlrcon_new(VALUE self, VALUE host, VALUE port, VALUE socket, VALUE user, VALUE password, VALUE retrytime, VALUE tries) { const char *socketstr; if (socket==Qnil) { socketstr=""; } else { socketstr=STR2CSTR(socket); } sqlrconnection *sqlrcon=new sqlrconnection(STR2CSTR(host), NUM2INT(port), socketstr, STR2CSTR(user), STR2CSTR(password), NUM2INT(retrytime), NUM2INT(tries)); sqlrcon->copyReferences(); return Data_Wrap_Struct(self,0,sqlrcon_free,(void *)sqlrcon);}static VALUE sqlrcon_endSession(VALUE self) { sqlrconnection *sqlrcon; Data_Get_Struct(self,sqlrconnection,sqlrcon); sqlrcon->endSession(); return Qnil;}static VALUE sqlrcon_suspendSession(VALUE self) { sqlrconnection *sqlrcon; Data_Get_Struct(self,sqlrconnection,sqlrcon); return INT2NUM(sqlrcon->suspendSession());}static VALUE sqlrcon_getConnectionPort(VALUE self) { sqlrconnection *sqlrcon; Data_Get_Struct(self,sqlrconnection,sqlrcon); return INT2NUM(sqlrcon->getConnectionPort());}static VALUE sqlrcon_getConnectionSocket(VALUE self) { sqlrconnection *sqlrcon; Data_Get_Struct(self,sqlrconnection,sqlrcon); const char *result=sqlrcon->getConnectionSocket(); if (result) { return rb_str_new2(result); } else { return Qnil; }}static VALUE sqlrcon_resumeSession(VALUE self, VALUE port, VALUE socket) { sqlrconnection *sqlrcon; Data_Get_Struct(self,sqlrconnection,sqlrcon); return INT2NUM(sqlrcon->resumeSession(NUM2INT(port), STR2CSTR(socket)));}static VALUE sqlrcon_ping(VALUE self) { sqlrconnection *sqlrcon; Data_Get_Struct(self,sqlrconnection,sqlrcon); return INT2NUM(sqlrcon->ping());}static VALUE sqlrcon_identify(VALUE self) { sqlrconnection *sqlrcon; Data_Get_Struct(self,sqlrconnection,sqlrcon); const char *result=sqlrcon->identify(); if (result) { return rb_str_new2(result); } else { return Qnil; }}static VALUE sqlrcon_dbVersion(VALUE self) { sqlrconnection *sqlrcon; Data_Get_Struct(self,sqlrconnection,sqlrcon); const char *result=sqlrcon->dbVersion(); if (result) { return rb_str_new2(result); } else { return Qnil; }}static VALUE sqlrcon_bindFormat(VALUE self) { sqlrconnection *sqlrcon; Data_Get_Struct(self,sqlrconnection,sqlrcon); const char *result=sqlrcon->bindFormat(); if (result) { return rb_str_new2(result); } else { return Qnil; }}static VALUE sqlrcon_autoCommitOn(VALUE self) { sqlrconnection *sqlrcon; Data_Get_Struct(self,sqlrconnection,sqlrcon); return INT2NUM(sqlrcon->autoCommitOn());}static VALUE sqlrcon_autoCommitOff(VALUE self) { sqlrconnection *sqlrcon; Data_Get_Struct(self,sqlrconnection,sqlrcon); return INT2NUM(sqlrcon->autoCommitOff());}static VALUE sqlrcon_commit(VALUE self) { sqlrconnection *sqlrcon; Data_Get_Struct(self,sqlrconnection,sqlrcon); return INT2NUM(sqlrcon->commit());}static VALUE sqlrcon_rollback(VALUE self) { sqlrconnection *sqlrcon; Data_Get_Struct(self,sqlrconnection,sqlrcon); return INT2NUM(sqlrcon->rollback());}static VALUE sqlrcon_debugOn(VALUE self) { sqlrconnection *sqlrcon; Data_Get_Struct(self,sqlrconnection,sqlrcon); sqlrcon->debugOn(); return Qnil;}static VALUE sqlrcon_debugOff(VALUE self) { sqlrconnection *sqlrcon; Data_Get_Struct(self,sqlrconnection,sqlrcon); sqlrcon->debugOff(); return Qnil;}static VALUE sqlrcon_getDebug(VALUE self) { sqlrconnection *sqlrcon; Data_Get_Struct(self,sqlrconnection,sqlrcon); return INT2NUM(sqlrcon->getDebug());}VALUE csqlrconnection;void Init_SQLRConnection() { csqlrconnection=rb_define_class("SQLRConnection", rb_cObject); rb_define_singleton_method(csqlrconnection,"new", (CAST)sqlrcon_new,7); rb_define_method(csqlrconnection,"endSession", (CAST)sqlrcon_endSession,0); rb_define_method(csqlrconnection,"suspendSession", (CAST)sqlrcon_suspendSession,0); rb_define_method(csqlrconnection,"getConnectionPort", (CAST)sqlrcon_getConnectionPort,0); rb_define_method(csqlrconnection,"getConnectionSocket", (CAST)sqlrcon_getConnectionSocket,0); rb_define_method(csqlrconnection,"resumeSession", (CAST)sqlrcon_resumeSession,2); rb_define_method(csqlrconnection,"ping", (CAST)sqlrcon_ping,0); rb_define_method(csqlrconnection,"identify", (CAST)sqlrcon_identify,0); rb_define_method(csqlrconnection,"dbVersion", (CAST)sqlrcon_dbVersion,0); rb_define_method(csqlrconnection,"bindFormat", (CAST)sqlrcon_bindFormat,0); rb_define_method(csqlrconnection,"autoCommitOn", (CAST)sqlrcon_autoCommitOn,0); rb_define_method(csqlrconnection,"autoCommitOff", (CAST)sqlrcon_autoCommitOff,0); rb_define_method(csqlrconnection,"commit", (CAST)sqlrcon_commit,0); rb_define_method(csqlrconnection,"rollback", (CAST)sqlrcon_rollback,0); rb_define_method(csqlrconnection,"debugOn", (CAST)sqlrcon_debugOn,0); rb_define_method(csqlrconnection,"debugOff", (CAST)sqlrcon_debugOff,0); rb_define_method(csqlrconnection,"getDebug", (CAST)sqlrcon_getDebug,0);}// sqlrcursor methodsVALUE csqlrcursor;static void sqlrcur_free(void *sqlrcur) { delete (sqlrcursor *)sqlrcur;}static VALUE sqlrcur_new(VALUE self, VALUE connection) { sqlrconnection *sqlrcon; Data_Get_Struct(connection,sqlrconnection,sqlrcon); sqlrcursor *sqlrcur=new sqlrcursor(sqlrcon); sqlrcur->copyReferences(); return Data_Wrap_Struct(self,0,sqlrcur_free,(void *)sqlrcur);}static VALUE sqlrcur_setResultSetBufferSize(VALUE self, VALUE rows) { sqlrcursor *sqlrcur; Data_Get_Struct(self,sqlrcursor,sqlrcur); sqlrcur->setResultSetBufferSize(NUM2INT(rows)); return Qnil;}static VALUE sqlrcur_getResultSetBufferSize(VALUE self) { sqlrcursor *sqlrcur; Data_Get_Struct(self,sqlrcursor,sqlrcur); return INT2NUM(sqlrcur->getResultSetBufferSize());}static VALUE sqlrcur_dontGetColumnInfo(VALUE self) { sqlrcursor *sqlrcur; Data_Get_Struct(self,sqlrcursor,sqlrcur); sqlrcur->dontGetColumnInfo(); return Qnil;}static VALUE sqlrcur_getColumnInfo(VALUE self) { sqlrcursor *sqlrcur; Data_Get_Struct(self,sqlrcursor,sqlrcur); sqlrcur->getColumnInfo(); return Qnil;}static VALUE sqlrcur_mixedCaseColumnNames(VALUE self) { sqlrcursor *sqlrcur; Data_Get_Struct(self,sqlrcursor,sqlrcur); sqlrcur->mixedCaseColumnNames(); return Qnil;}static VALUE sqlrcur_upperCaseColumnNames(VALUE self) { sqlrcursor *sqlrcur; Data_Get_Struct(self,sqlrcursor,sqlrcur); sqlrcur->upperCaseColumnNames(); return Qnil;}static VALUE sqlrcur_lowerCaseColumnNames(VALUE self) { sqlrcursor *sqlrcur; Data_Get_Struct(self,sqlrcursor,sqlrcur); sqlrcur->lowerCaseColumnNames(); return Qnil;}static VALUE sqlrcur_cacheToFile(VALUE self, VALUE filename) { sqlrcursor *sqlrcur; Data_Get_Struct(self,sqlrcursor,sqlrcur); sqlrcur->cacheToFile(STR2CSTR(filename)); return Qnil;}static VALUE sqlrcur_setCacheTtl(VALUE self, VALUE ttl) { sqlrcursor *sqlrcur; Data_Get_Struct(self,sqlrcursor,sqlrcur); sqlrcur->setCacheTtl(NUM2INT(ttl)); return Qnil;}static VALUE sqlrcur_getCacheFileName(VALUE self) { sqlrcursor *sqlrcur; Data_Get_Struct(self,sqlrcursor,sqlrcur); const char *result=sqlrcur->getCacheFileName(); if (result) { return rb_str_new2(result); } else { return Qnil; }}static VALUE sqlrcur_cacheOff(VALUE self) { sqlrcursor *sqlrcur; Data_Get_Struct(self,sqlrcursor,sqlrcur); sqlrcur->cacheOff(); return Qnil;}static VALUE sqlrcur_sendQuery(VALUE self, VALUE query) { sqlrcursor *sqlrcur; Data_Get_Struct(self,sqlrcursor,sqlrcur); return INT2NUM(sqlrcur->sendQuery(STR2CSTR(query)));}static VALUE sqlrcur_sendQueryWithLength(VALUE self, VALUE query, VALUE length) { sqlrcursor *sqlrcur; Data_Get_Struct(self,sqlrcursor,sqlrcur); return INT2NUM(sqlrcur->sendQuery(STR2CSTR(query),NUM2INT(length)));}static VALUE sqlrcur_sendFileQuery(VALUE self, VALUE path, VALUE filename) { sqlrcursor *sqlrcur; Data_Get_Struct(self,sqlrcursor,sqlrcur); return INT2NUM(sqlrcur->sendFileQuery(STR2CSTR(path), STR2CSTR(filename))); }static VALUE sqlrcur_prepareQuery(VALUE self, VALUE query) { sqlrcursor *sqlrcur; Data_Get_Struct(self,sqlrcursor,sqlrcur); sqlrcur->prepareQuery(STR2CSTR(query)); return Qnil;}static VALUE sqlrcur_prepareQueryWithLength(VALUE self, VALUE query, VALUE length) { sqlrcursor *sqlrcur; Data_Get_Struct(self,sqlrcursor,sqlrcur); sqlrcur->prepareQuery(STR2CSTR(query),NUM2INT(length)); return Qnil;}static VALUE sqlrcur_prepareFileQuery(VALUE self, VALUE path, VALUE filename) { sqlrcursor *sqlrcur; Data_Get_Struct(self,sqlrcursor,sqlrcur); return INT2NUM(sqlrcur->prepareFileQuery(STR2CSTR(path), STR2CSTR(filename)));}static VALUE sqlrcur_clearBinds(VALUE self) { sqlrcursor *sqlrcur; Data_Get_Struct(self,sqlrcursor,sqlrcur); sqlrcur->clearBinds(); return Qnil;}static VALUE sqlrcur_countBindVariables(VALUE self) { sqlrcursor *sqlrcur; Data_Get_Struct(self,sqlrcursor,sqlrcur); return INT2NUM(sqlrcur->countBindVariables());}static VALUE sqlrcur_substitution(int argc, VALUE *argv, VALUE self) { sqlrcursor *sqlrcur; VALUE variable; VALUE value; VALUE precision; VALUE scale; bool result=true; rb_scan_args(argc,argv,"22",&variable,&value,&precision,&scale); Data_Get_Struct(self,sqlrcursor,sqlrcur); if (rb_obj_is_instance_of(value,rb_cString)==Qtrue) { sqlrcur->substitution(STR2CSTR(variable),STR2CSTR(value)); } else if (rb_obj_is_instance_of(value,rb_cBignum)==Qtrue || rb_obj_is_instance_of(value,rb_cFixnum)==Qtrue || rb_obj_is_instance_of(value,rb_cInteger)==Qtrue || rb_obj_is_instance_of(value,rb_cNumeric)==Qtrue) { sqlrcur->substitution(STR2CSTR(variable),NUM2INT(value)); } else if (rb_obj_is_instance_of(value,rb_cFloat)==Qtrue) { sqlrcur->substitution(STR2CSTR(variable),NUM2DBL(value), (unsigned short)NUM2INT(precision), (unsigned short)NUM2INT(scale)); } else if (rb_obj_is_instance_of(value,rb_cNilClass)==Qtrue) { sqlrcur->substitution(STR2CSTR(variable),(const char *)NULL); } else { result=false; } return INT2NUM(result);}static VALUE sqlrcur_inputBind(int argc, VALUE *argv, VALUE self) { sqlrcursor *sqlrcur; VALUE variable; VALUE value; VALUE precision; VALUE scale; bool success=true; rb_scan_args(argc,argv,"22",&variable,&value,&precision,&scale); Data_Get_Struct(self,sqlrcursor,sqlrcur); if (rb_obj_is_instance_of(value,rb_cString)==Qtrue) { sqlrcur->inputBind(STR2CSTR(variable),STR2CSTR(value)); } else if (rb_obj_is_instance_of(value,rb_cBignum)==Qtrue || rb_obj_is_instance_of(value,rb_cFixnum)==Qtrue || rb_obj_is_instance_of(value,rb_cInteger)==Qtrue || rb_obj_is_instance_of(value,rb_cNumeric)==Qtrue) { sqlrcur->inputBind(STR2CSTR(variable),NUM2INT(value)); } else if (rb_obj_is_instance_of(value,rb_cFloat)==Qtrue) { sqlrcur->inputBind(STR2CSTR(variable),NUM2DBL(value), (unsigned short)NUM2INT(precision), (unsigned short)NUM2INT(scale)); } else if (rb_obj_is_instance_of(value,rb_cNilClass)==Qtrue) { sqlrcur->inputBind(STR2CSTR(variable),(const char *)NULL); } else { success=false; } return INT2NUM(success);}static VALUE sqlrcur_inputBindBlob(VALUE self, VALUE variable, VALUE value, VALUE size) { sqlrcursor *sqlrcur; Data_Get_Struct(self,sqlrcursor,sqlrcur);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -