⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cconnection.class

📁 Gambas is a graphical development environment based on a Basic interpreter, like Visual Basic. It us
💻 CLASS
字号:
' Gambas class fileSTATIC PUBLIC All AS NEW CollectionPUBLIC Server AS CServerPUBLIC Handle AS ConnectionPUBLIC SystemTables AS String[]PUBLIC Tables AS String[]PUBLIC Name AS StringPUBLIC Key AS StringPUBLIC ShowSystemTables AS BooleanPROPERTY UseEncoding AS BooleanPROPERTY READ Charset AS StringPRIVATE $bUseEncoding AS BooleanSTATIC PUBLIC FUNCTION Get(hServer AS CServer, sName AS String) AS CConnection  DIM sKey AS String  DIM hConn AS CConnection  sKey = hServer.Key &/ sName  hConn = All[sKey]  IF NOT hConn THEN    hConn = NEW CConnection(hServer, sName)  ENDIF  RETURN hConnENDSTATIC PUBLIC SUB CloseAll()  DIM hConn AS CConnection  FOR EACH hConn IN All    hConn.Close  NEXTENDSTATIC PUBLIC SUB Remove(hConn AS CConnection)  IF hConn THEN    hConn.Close    hConn.Server = NULL    All.Remove(hConn.Key)  ENDIFENDSTATIC PUBLIC FUNCTION RemoveAll(OPTIONAL hServer AS CServer) AS Boolean  DIM hConn AS CConnection  FOR EACH hConn IN All    IF hServer THEN      IF hConn.Server <> hServer THEN CONTINUE    ENDIF    IF hConn.Close() THEN RETURN TRUE    Remove(hConn)  NEXTENDPUBLIC SUB _new(hServer AS CServer, sName AS String, OPTIONAL bTemp AS Boolean)  Server = hServer  Name = sName  Key = hServer.Key &/ sName  IF NOT bTemp THEN All[Key] = ME  $bUseEncoding = TRUEENDPRIVATE SUB Refresh()  DIM hTable AS Table  Tables = NEW String[]  SystemTables = NEW String[]  'Handle.Tables.Refresh  FOR EACH hTable IN Handle.Tables    IF hTable.System THEN      SystemTables.Add(hTable.Name)    ELSE      Tables.Add(hTable.Name)    ENDIF  NEXT  Tables.Sort  SystemTables.SortENDPUBLIC FUNCTION Open() AS String  IF Handle THEN RETURN  Handle = NEW Connection  Handle.Type = Server.Handle.Type  Handle.Host = Server.Handle.Host  Handle.Login = Server.Handle.Login  Handle.Password = Server.Handle.Password  Handle.Name = Name  Handle.Open  RefreshCATCH  Handle = NULL  RETURN Error.TextENDPUBLIC FUNCTION Close() AS Boolean  DIM hForm AS Object  DIM hConn AS CConnection  DIM sType AS String  DIM aDelete AS NEW Object[]  IF NOT Handle THEN RETURN  FOR EACH hForm IN FMain.Container.Children    SELECT CASE Object.Type(hForm)      CASE "FTable", "FData", "FRequest"        IF hForm.Connection = ME THEN aDelete.Add(hForm)    END SELECT  NEXT  FOR EACH hForm IN aDelete    IF hForm.Close() THEN RETURN TRUE  NEXT  'IF FMain.Config.ReadBoolean("/CodeGeneration" &/ File.Name(FMain.Project) &/ Server.Key &/ Name &/ "AutoUpdate") THEN  IF Settings["/CodeGeneration" &/ File.Name(FMain.Project) &/ Server.Key &/ Name &/ "AutoUpdate", FALSE] THEN    FCode.GenerateCode(Server, Name)  ENDIF  TRY Handle.Close  Handle = NULLENDPUBLIC FUNCTION IsOpened() AS Boolean  RETURN HandleENDPRIVATE FUNCTION FindForm(sType AS String, OPTIONAL sTable AS String) AS Form  DIM hForm AS Object  FOR EACH hForm IN FMain.Container.Children    IF Object.Type(hForm) = sType THEN      IF hForm.Connection = ME THEN        IF Len(sTable) THEN          IF hForm.Table = sTable THEN RETURN hForm        ELSE          RETURN hForm        ENDIF      ENDIF    ENDIF  NEXTENDPUBLIC SUB OpenTable(sTable AS String, bData AS Boolean)  DIM hForm AS Object  bData = FALSE  hForm = FindForm(If(bData, "FData", "FTable"), sTable)  IF NOT hForm THEN    IF bData THEN      hForm = NEW FData(ME, sTable, SystemTables.Find(sTable) >= 0, FMain.Container)    ELSE      hForm = NEW FTable(ME, sTable, SystemTables.Find(sTable) >= 0, FMain.Container)    ENDIF  ENDIF  hForm.Show  'hForm.RaiseENDPUBLIC SUB OpenRequest()  DIM hForm AS Object  hForm = FindForm("FRequest")  IF NOT hForm THEN    hForm = NEW FRequest(ME, FMain.Container)  ENDIF  hForm.ShowENDPUBLIC FUNCTION CreateTable(sTable AS String, sType AS String) AS Boolean  DIM hTable AS Table  IF Handle.Tables.Exist(sTable) THEN    Message.Warning(("Table already exists."))    RETURN  ENDIF  hTable = Handle.Tables.Add(sTable, sType)  WITH hTable    .Fields.Add("id", gb.Integer)    .PrimaryKey = ["id"]    .Update  END WITH  Refresh  OpenTable(sTable, FALSE)CATCH  Message(Subst(("Cannot create table '&1'."), sTable) & "\n\n" & Error.Text)  RETURN TRUEENDPUBLIC FUNCTION DeleteTable(sTable AS String) AS Boolean  DIM hForm AS Form  hForm = FindForm("FTable", sTable)  IF hForm THEN hForm.Delete  hForm = FindForm("FData", sTable)  IF hForm THEN hForm.Close  Handle.Tables.Remove(sTable)  RefreshCATCH  Message(Subst(("Cannot delete table '&1'."), sTable) & "\n\n" & Error.Text)  RETURN TRUEENDPUBLIC FUNCTION GetTempTableName() AS String  DIM iInd AS Integer  DIM sTemp AS String  FOR iInd = 0 TO 99    sTemp = "_gdbmgr_table"    IF iInd THEN sTemp = sTemp & "_" & iInd    IF NOT Handle.Tables.Exist(sTemp) THEN BREAK    INC iInd    sTemp = ""  NEXT  IF NOT sTemp THEN Error.Raise("Cannot find a free temporary table name")  RETURN sTempENDPUBLIC FUNCTION CopyTableData(sTable AS String) AS String  DIM sTemp AS String  DIM iInd AS Integer  DIM sReq AS String  DIM hSrc AS Table  DIM hDst AS Table  DIM rSrc AS Result  DIM rDst AS Result  DIM sField AS String  DIM hField AS Field  DIM sError AS String  sTemp = GetTempTableName()  SELECT CASE Handle.Type    CASE "postgresql"      sReq = "SELECT * INTO TABLE " & sTemp & " FROM \"" & sTable & "\""      Handle.Exec(sReq)    CASE "mysql"      sReq = "CREATE TABLE " & sTemp & " SELECT * FROM `" & sTable & "`"      Handle.Exec(sReq)    'CASE "sqlite"    '  sReq = "INSERT INTO " & sTemp & " SELECT * FROM " & sTable    DEFAULT      hSrc = Handle.Tables[sTable]      hDst = Handle.Tables.Add(sTemp, hSrc.Type)      'IF NOT hSrc.PrimaryKey THEN Error.Raise("No primary key")      FOR EACH hField IN hSrc.Fields        WITH hField          hDst.Fields.Add(.Name, .Type, .Length, .Default)        END WITH      NEXT      hDst.PrimaryKey = hSrc.PrimaryKey      hDst.Update      Handle.Begin      rSrc = Handle.Find(sTable)      rDst = Handle.Create(sTemp)      FOR EACH rSrc'         FOR EACH hField IN rSrc.Fields'           sField = hField.Name'           rDst[sField] = rSrc[sField]'         NEXT        FOR iInd = 0 TO rSrc.Fields.Count - 1          rDst[iInd] = rSrc[iInd]        NEXT        rDst.Update      NEXT      Handle.Commit  END SELECT  RETURN sTempCATCH  sError = Error.Text  SELECT CASE Handle.Type    CASE "postgresql"    CASE "mysql"      TRY Handle.Rollback      IF Handle.Tables.Exist(sTable) THEN         TRY Handle.Tables.Remove(sTemp)      ELSE         IF Handle.Tables.Exist(sTemp) THEN            sReq = "RENAME TABLE " & sTemp & " TO " & sTable            TRY Handle.Exec(sReq)         ELSE            Error.Raise("Severe Error: Table has been lost!!")         ENDIF      ENDIF    DEFAULT      TRY Handle.Rollback      IF Handle.Tables.Exist(sTable) THEN         TRY Handle.Tables.Remove(sTemp)      ELSE         IF Handle.Tables.Exist(sTable) THEN            Error.Raise("Severe Error: Table " & sTable & " has not been recreated. Data held in " & sTemp)         ENDIF      ENDIF  END SELECT  Error.Raise("Cannot copy table data: " & sError)ENDPUBLIC FUNCTION CountTableData(sTable AS String) AS Integer  DIM rResult AS Result  rResult = Handle.Exec("SELECT COUNT(*) AS nRecord FROM " & Handle.Quote(sTable))  RETURN rResult!nRecordENDSTATIC PUBLIC FUNCTION WidthFromType(hCtrl AS control, iType AS Integer, iLength AS Integer, sTitle AS String) AS Integer  DIM iWidth AS Integer  SELECT CASE iType    CASE gb.Boolean      iWidth = hCtrl.Font.Width(Str(FALSE)) + 32    CASE gb.Integer      iWidth = hCtrl.Font.Width("1234567890") + 8    CASE gb.Float      iWidth = hCtrl.Font.Width(CStr(Pi) & "E+999") + 8    CASE gb.Date      iWidth = hCtrl.Font.Width(Str(Now)) + 8    CASE gb.String      IF iLength = 0 THEN iLength = 255      iLength = Min(32, iLength)      iWidth = hCtrl.Font.Width("X") * iLength + 8  END SELECT  iWidth = Max(iWidth, hCtrl.Font.Width(sTitle) + 8)  RETURN iWidthENDPUBLIC SUB RefreshTree()  Refresh  FMain.RefreshTable("D" & Key)ENDPUBLIC FUNCTION GetCharset() AS String  IF $bUseEncoding THEN RETURN Handle.CharsetENDPRIVATE FUNCTION UseEncoding_Read() AS Boolean  RETURN $bUseEncodingENDPRIVATE SUB UseEncoding_Write(bEncoding AS Boolean)  DIM hWin AS Object  DIM hConn AS CConnection  IF bEncoding = $bUseEncoding THEN RETURN  $bUseEncoding = bEncoding  FOR EACH hWin IN FMain.Container.Children    hConn = NULL    TRY hConn = hWin.Connection    IF hConn THEN      TRY hWin.EncodingChange()    ENDIF  NEXTENDPRIVATE FUNCTION Charset_Read() AS String  IF $bUseEncoding THEN    RETURN Handle.Charset  ELSE    RETURN "UTF-8"  ENDIFEND

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -