201 lines
3.6 KiB
AutoHotkey
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)
|
|
}
|
|
|
|
}
|