LifeRPG_v2.0/Lib/DataBaseADO.ahk
Jayvant Javier Pujara 3bde7c3d5f Reload
2012-11-01 16:05:12 -04:00

201 lines
3.6 KiB
AutoHotkey

;namespace DBA
/*
Represents a Connection to a ADO Database
*/
class DataBaseADO extends DBA.DataBase
{
_connection := null
_connectionData := ""
__New(connectionString){
this._connectionData := connectionString
this.Connect()
}
/*
(Re) Connects to the db with the given creditals
*/
Connect(){
if(IsObject(this._connection))
{
this.Close()
}
this._connection := ComObjCreate("ADODB.connection")
;connection.Open connectionstring,userID,password,options
this._connection.Open(this._connectionData)
}
Close(){
if(this.IsConnected())
{
this._connection.Close()
this._connection := null
}
}
/*
* Is this connection open?
*/
IsConnected(){
return (IsObject(this._connection) && this._connection.State != ADO.ObjectStateEnum.adStateClosed)
}
IsValid(){
return IsObject(this._connection)
}
GetLastError(){
; todo
}
GetLastErrorMsg(){
errMsg := ""
for objErr in this._connection.Errors
{
errMsg .= objErr.Number " " objErr.Description " Source:" objErr.Source "`n"
}
return errMsg
}
SetTimeout(timeout = 1000){
if(this.IsValid())
this._connection.ConnectionTimeout := (timeout / 1000)
}
Changes() {
/*
ToDo
*/
}
/*
Querys the DB and returns a RecordSet
*/
OpenRecordSet(sql, editable = false){
return new DBA.RecordSetADO(sql, this._connection, editable)
}
/*
Querys the DB and returns a ResultTable or true/false
*/
Query(sql){
ret := false
if(this.IsValid())
{
;Execute( commandtext,ra,options)
affectedRows := 0
rs := this._connection.Execute(sql, affectedRows)
if(IsObject(rs) && rs.State != ADO.ObjectStateEnum.adStateClosed)
{
ret := this.FetchADORecordSet(rs)
rs.Close()
}else{
ret := affectedRows
}
}
return ret
}
EscapeString(str){
return Mysql_escape_string(str)
}
BeginTransaction(){
if(this.IsValid())
this._connection.BeginTrans()
}
EndTransaction(){
if(this.IsValid())
this._connection.CommitTrans()
}
Rollback(){
if(this.IsValid())
this._connection.RollbackTrans()
}
FetchADORecordSet(adoRS){
tbl := null
if(IsObject(adoRS) && !adoRS.EOF)
{
columnNames := new Collection()
myRows := new Collection()
for field in adoRS.Fields
columnNames.add(field.Name)
fetchedArray := adoRS.GetRows() ; returns a COM-SafeArray Wrapper
colSize := fetchedArray.MaxIndex(1) + 1
rowSize := fetchedArray.MaxIndex(2) + 1
loop, % rowSize
{
i := A_index - 1
datafields := new Collection()
loop, % colSize
{
j := A_index - 1
datafields.add(fetchedArray[j,i])
}
myRows.Add(new DBA.Row(columnNames, datafields))
}
tbl := new DBA.Table(myRows, columnNames)
}
return tbl
}
InsertMany(records, tableName){
;objRecordset.Open source,actconn,cursortyp,locktyp,opt
rs := ComObjCreate("ADODB.Recordset")
/* batch
rs.Open(tableName, this._connection, ADO.CursorType.adOpenKeyset, ADO.LockType.adLockBatchOptimistic, ADO.CommandType.adCmdTable)
for each, record in records
{
rs.AddNew()
for column, value in record
{
rs.Fields[column].Value := value
}
}
rs.UpdateBatch()
*/
rs.Open(tableName, this._connection, ADO.CursorType.adOpenKeyset, ADO.LockType.adLockOptimistic, ADO.CommandType.adCmdTable)
for each, record in records
{
rs.AddNew()
for column, value in record
{
rs.Fields[column].Value := value
}
rs.Update()
}
rs.Close()
}
Insert(record, tableName){
records := new Collection()
records.Add(record)
return this.InsertMany(records, tableName)
}
}