weil ich es gerade brauche habe ich eine DEMO von MAX2 verbessert

Achtung Update 18.01.2011 auf PureBasic 4.51 unter Ubuntu 10.04
Code: Alles auswählen
; Orginal : Code by Max2 + Fangbeast English Forum Aug 23, 2004
; Update : 18.01.2011 PureBasic 4.51 by Dristar ; 30.08.2008 PureBasic 4.2 by Dristar
; OS Test : Linux Ubuntu 10.04 ; Linux Ubuntu 8.04 und WindowsXP
;
;-DEMO PureBasic 4.51 by Dristar
EnableExplicit
Global libPath.s , SQL.s , row.s , content.s , rowstring.s , outString.s , currentField.s , outString.s , DumpList.s
Global Query.s , host.s , user.s , passwd.s , db.s , port.l , dbHnd.l
Global affRows.l , fieldNum.l , rowsNum.l
Global coladd.l , fieldNum.l , i.l , j.l , length.l , Lines.l , ListItems.l , Lines.l , totalFields.l , fieldptr.l , Connect.l , colremove.l , Result.l
Global *mysqlResult.l , *mysqlRow.l , *mysqlLen.l
Global libOpened
Global quitmysqltest
Global EventID
;==============================================================================================================================
; Any global variables my programs need, particularly the aliases MySQL library functions
;==============================================================================================================================
Global CFF_MySQL_Init.l, CFF_MySQL_ERRNO.l
Global CFF_MySQL_ERROR.l, CFF_MySQL_Real_Connect.l
Global CFF_MySQL_Real_Query.l, CFF_MySQL_Store_Result.l
Global CFF_MySQL_Field_Count.l, CFF_MySQL_Use_Result.l
Global CFF_MySQL_Fetch_Row.l, CFF_MySQL_Fetch_Lengths.l
Global CFF_MySQL_Free_Result.l, CFF_MySQL_Close.l
Global Yellow, Green, Blue
;==============================================================================================================================
; Searching and setting the libmysql.dll Path in Current Directory, Windows, Windows\system and Windows\system32
;==============================================================================================================================
;- OS Check
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Windows
Global libPath.s = "libmysql.dll"
Macro MacroCallFunction
CallFunctionFast
EndMacro
CompilerCase #PB_OS_Linux
Global libPath.s = "libmysqlclient.so.16"
Macro MacroCallFunction
CallCFunctionFast
EndMacro
CompilerEndSelect
;==============================================================================================================================
; Specific constans for the MySQL functions
;==============================================================================================================================
#libmysql = 1
#MySQL_CLIENT_COMPRESS = 32
;============================================================================================================================
; Main window title which we will overwrite with other information
;============================================================================================================================
#MainTitle = "MySQL - "
;============================================================================================================================
; Constants
;============================================================================================================================
Enumeration 1
#Window_mysqltest=0
EndEnumeration
#WindowIndex = #PB_Compiler_EnumerationValue
Enumeration 1
#Gadget_mysqltest_mainframe
#Gadget_mysqltest_datalist
#Gadget_mysqltest_controlframe
#Gadget_mysqltest_querylabel
#Gadget_mysqltest_querybox
#Gadget_mysqltest_loginframe
#Gadget_mysqltest_hostlabel
#Gadget_mysqltest_hostbox
#Gadget_mysqltest_userlabel
#Gadget_mysqltest_userbox
#Gadget_mysqltest_passwordlabel
#Gadget_mysqltest_passwordbox
#Gadget_mysqltest_databaselabel
#Gadget_mysqltest_databasebox
#Gadget_mysqltest_portlabel
#Gadget_mysqltest_portbox
#Gadget_mysqltest_savelogin
#Gadget_mysqltest_dumpbutton
#Gadget_mysqltest_otherframe
#Gadget_mysqltest_helpbutton
#Gadget_mysqltest_exitbutton
#Gadget_mysqltest_select
#Gadget_mysqltest_return
EndEnumeration
#GadgetIndex = #PB_Compiler_EnumerationValue
;==============================================================================================================================
; Program window
;==============================================================================================================================
Procedure.l Window_mysqltest()
If OpenWindow(#Window_mysqltest,175,0,815,600,"Test Programm")
AddKeyboardShortcut(#Window_mysqltest, #PB_Shortcut_Return, #Gadget_mysqltest_return)
Frame3DGadget(#Gadget_mysqltest_mainframe,3,0,640,510,"")
ListIconGadget(#Gadget_mysqltest_datalist,5,10,630,495,"itemslist",100,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
Frame3DGadget(#Gadget_mysqltest_controlframe,3,510,640,80,"")
TextGadget(#Gadget_mysqltest_querylabel,10,530,70,20,"SQL Query")
StringGadget(#Gadget_mysqltest_querybox,90,525,548,25,"")
Frame3DGadget(#Gadget_mysqltest_loginframe,645,0,170,510,"")
TextGadget(#Gadget_mysqltest_hostlabel,655,15,150,20,"Host IP or host name")
StringGadget(#Gadget_mysqltest_hostbox,655,30,135,25,"")
TextGadget(#Gadget_mysqltest_userlabel,655,55,135,20,"User name")
StringGadget(#Gadget_mysqltest_userbox,655,70,135,25,"")
TextGadget(#Gadget_mysqltest_passwordlabel,655,95,135,20,"Password")
StringGadget(#Gadget_mysqltest_passwordbox,655,110,135,25,"",#PB_String_Password)
TextGadget(#Gadget_mysqltest_databaselabel,655,135,135,20,"Database name")
StringGadget(#Gadget_mysqltest_databasebox,655,150,135,25,"")
TextGadget(#Gadget_mysqltest_portlabel,655,175,135,15,"Port number")
StringGadget(#Gadget_mysqltest_portbox,655,190,135,25,"3306",#PB_String_Numeric)
CheckBoxGadget(#Gadget_mysqltest_savelogin,655,220,150,20,"Save current login")
ButtonGadget(#Gadget_mysqltest_dumpbutton,655,480,135,25,"Dump list to disk")
Frame3DGadget(#Gadget_mysqltest_otherframe,645,510,155,45,"")
ButtonGadget(#Gadget_mysqltest_exitbutton,690,522,60,25,"Exit")
ButtonGadget(#Gadget_mysqltest_select,575,560,60,25,"Enter")
HideWindow(#Window_mysqltest,0)
ProcedureReturn WindowID(0)
EndIf
EndProcedure
;==============================================================================================================================
; All of the aliased MySQL library routines and the library loader
;==============================================================================================================================
Procedure MySQL_Init(libPath.s)
Global CurrentDir.s
If OpenLibrary(#libmysql, libPath)
CFF_MySQL_Init = GetFunction(#libmysql, "mysql_init")
CFF_MySQL_ERRNO = GetFunction(#libmysql, "mysql_errno")
CFF_MySQL_ERROR = GetFunction(#libmysql, "mysql_error")
CFF_MySQL_Real_Connect = GetFunction(#libmysql, "mysql_real_connect")
CFF_MySQL_Real_Query = GetFunction(#libmysql, "mysql_real_query")
CFF_MySQL_Store_Result =GetFunction(#libmysql, "mysql_store_result")
CFF_MySQL_Field_Count = GetFunction(#libmysql, "mysql_field_count")
CFF_MySQL_Use_Result = GetFunction(#libmysql, "mysql_use_result")
CFF_MySQL_Fetch_Row = GetFunction(#libmysql, "mysql_fetch_row")
CFF_MySQL_Fetch_Lengths = GetFunction(#libmysql, "mysql_fetch_lengths")
CFF_MySQL_Free_Result = GetFunction(#libmysql, "mysql_free_result")
CFF_MySQL_Close = GetFunction(#libmysql, "mysql_close")
ProcedureReturn MacroCallFunction (CFF_MySQL_Init, dbHnd)
EndIf
EndProcedure
Procedure.s MySQL_GetError(db_ID, requester)
Protected Errormsg.s, i.l, *Error.l
If MacroCallFunction(CFF_MySQL_ERRNO, db_ID) > 0
*Error = MacroCallFunction(CFF_MySQL_ERROR, db_ID)
Errormsg = PeekS(*Error)
If requester
SetWindowTitle(#Window_mysqltest, #MainTitle + Errormsg)
EndIf
EndIf
ProcedureReturn Errormsg
EndProcedure
Procedure MySQL_Real_Connect(dbHnd, host, user, password, db, port, options)
ProcedureReturn MacroCallFunction(CFF_MySQL_Real_Connect, dbHnd, host, user, password, db, port, 0, options)
EndProcedure
Procedure MySQL_Real_Query(dbHnd, Query.s)
ProcedureReturn MacroCallFunction(CFF_MySQL_Real_Query, dbHnd, @Query, Len(Query))
EndProcedure
Procedure MySQL_Store_Result(dbHnd)
ProcedureReturn MacroCallFunction(CFF_MySQL_Store_Result, dbHnd)
EndProcedure
Procedure MySQL_Field_Count(dbHnd)
ProcedureReturn MacroCallFunction(CFF_MySQL_Field_Count, dbHnd)
EndProcedure
Procedure MySQL_Use_Result(dbHnd)
ProcedureReturn MacroCallFunction(CFF_MySQL_Use_Result, dbHnd)
EndProcedure
Procedure MySQL_Fetch_Row (*mysqlResult)
ProcedureReturn MacroCallFunction(CFF_MySQL_Fetch_Row, *mysqlResult)
EndProcedure
Procedure MySQL_Fetch_Lengths (*mysqlResult)
ProcedureReturn MacroCallFunction (CFF_MySQL_Fetch_Lengths, *mysqlResult)
EndProcedure
Procedure MySQL_Free_Result (*mysqlResult)
ProcedureReturn MacroCallFunction(CFF_MySQL_Free_Result, *mysqlResult)
EndProcedure
Procedure MySQL_Close (dbHnd)
MacroCallFunction(CFF_MySQL_Close, dbHnd)
EndProcedure
;============================================================================================================================
; Try to initialise the database environment (Procedure MySQL_Init())
;============================================================================================================================
dbHnd = MySQL_Init(libPath)
If dbHnd
libOpened = 1
Else
libOpened = 0
MessageRequester("Critical Error", "libmysqlclient.so oder libmysql.dll nicht gefunden !")
End
EndIf
;============================================================================================================================
; Main Program Loop
;============================================================================================================================
If Window_mysqltest()
quitmysqltest = 0
Gosub LoadLastLogin
SetActiveGadget(#Gadget_mysqltest_querybox)
Repeat
EventID = WaitWindowEvent()
Select EventID
Case #PB_Event_CloseWindow
If EventWindow() = #Window_mysqltest
quitmysqltest = 1
EndIf
Case #PB_Event_Gadget
Select EventGadget()
Case #Gadget_mysqltest_select :Gosub CheckEnter
Case #Gadget_mysqltest_dumpbutton : Gosub DumpListToDisk
Case #Gadget_mysqltest_helpbutton
Case #Gadget_mysqltest_exitbutton : quitmysqltest = 1
EndSelect
EndSelect
Until quitmysqltest
Gosub SaveCurrentLogin
CloseWindow(#Window_mysqltest)
EndIf
End
;============================================================================================================================
; Load the last login saved by the user if there was one
;============================================================================================================================
LoadLastLogin:
If ReadFile(0, "LastLogin.txt")
SetGadgetText(#Gadget_mysqltest_hostbox, ReadString(0))
SetGadgetText(#Gadget_mysqltest_userbox, ReadString(0))
SetGadgetText(#Gadget_mysqltest_passwordbox, ReadString(0))
SetGadgetText(#Gadget_mysqltest_databasebox, ReadString(0))
SetGadgetText(#Gadget_mysqltest_portbox, ReadString(0))
If ReadString(0) = "1"
SetGadgetState(#Gadget_mysqltest_savelogin, 1)
EndIf
CloseFile(0)
SetWindowTitle(#Window_mysqltest, #MainTitle + "Last saved login loaded")
Else
SetWindowTitle(#Window_mysqltest, #MainTitle + "Couldn't find last login file")
EndIf
Return
;============================================================================================================================
; Save the current login details if the user has selected the checkbox
;============================================================================================================================
SaveCurrentLogin:
If GetGadgetState(#Gadget_mysqltest_savelogin) = 1
If CreateFile(0, "LastLogin.txt") <> 1
WriteStringN(0,GetGadgetText(#Gadget_mysqltest_hostbox))
WriteStringN(0,GetGadgetText(#Gadget_mysqltest_userbox))
WriteStringN(0,GetGadgetText(#Gadget_mysqltest_passwordbox))
WriteStringN(0,GetGadgetText(#Gadget_mysqltest_databasebox))
WriteStringN(0,GetGadgetText(#Gadget_mysqltest_portbox))
WriteStringN(0,"1")
CloseFile(0)
EndIf
EndIf
Return
;============================================================================================================================
; Check if the ENTER key was pressed in the SQL query box
;============================================================================================================================
CheckEnter:
Query = GetGadgetText(#Gadget_mysqltest_querybox)
Gosub ConnectToDatabase
Return
;============================================================================================================================
; Try to connect to the database
;============================================================================================================================
ConnectToDatabase:
If libOpened
host = GetGadgetText(#Gadget_mysqltest_hostbox)
user = GetGadgetText(#Gadget_mysqltest_userbox)
passwd = GetGadgetText(#Gadget_mysqltest_passwordbox)
db = GetGadgetText(#Gadget_mysqltest_databasebox)
port = Val(GetGadgetText(#Gadget_mysqltest_portbox))
If MySQL_Real_Connect(dbHnd, @host, @user, @passwd, @db, port, 32) <> 0
SetWindowTitle(#Window_mysqltest, #MainTitle + "Connected and getting your data, please wait")
Gosub GetSqlData
Else
MySQL_GetError(dbHnd, 1)
Connect= 0
EndIf
Else
SetWindowTitle(#Window_mysqltest, #MainTitle + "SQL library was never loaded so we cannot connect to the database!!")
EndIf
Return
;============================================================================================================================
; Retrieve and display the data to the user now
;============================================================================================================================
GetSqlData:
If fieldNum <> 0
For colremove = 1 To fieldNum - 1
RemoveGadgetColumn(#Gadget_mysqltest_datalist, 1)
Next colremove
fieldNum = 0
EndIf
Result = MySQL_Real_Query (dbHnd, Query)
If Result
MySQL_GetError(dbHnd, 1)
Else
*mysqlResult = MySQL_Use_Result(dbHnd)
If *mysqlResult = 0
If MySQL_Field_Count(dbHnd)
MySQL_GetError(dbHnd, 1)
Else
MySQL_GetError(dbHnd, 1)
EndIf
Else
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Windows
affRows = CallFunction(#libmysql,"mysql_affected_rows",dbHnd)
fieldNum = CallFunction(#libmysql,"mysql_num_fields", *mysqlResult)
rowsNum = CallFunction(#libmysql,"mysql_num_rows", *mysqlResult)
CompilerCase #PB_OS_Linux
affRows = CallCFunction(#libmysql,"mysql_affected_rows",dbHnd)
fieldNum = CallCFunction(#libmysql,"mysql_num_fields", *mysqlResult)
rowsNum = CallCFunction(#libmysql,"mysql_num_rows", *mysqlResult)
CompilerEndSelect
For coladd = 1 To fieldNum - 1
AddGadgetColumn(#Gadget_mysqltest_datalist, 1, "Data", 100)
Next coladd
Repeat
*mysqlRow = MySQL_Fetch_Row(*mysqlResult)
If *mysqlRow <> 0
*mysqlLen = MySQL_Fetch_Lengths(*mysqlResult)
row = ""
For j = 1 To fieldNum
length = PeekL(*mysqlLen + 4 * (j - 1))
fieldptr = PeekL(*mysqlRow + 4 * (j - 1))
If fieldptr > 0
content = PeekS(fieldptr, length)
Else
content = "NULL"
EndIf
row = row + content + ";"
Next j
rowstring = ReplaceString(row, ";", Chr(10), 1,1)
AddGadgetItem(#Gadget_mysqltest_datalist, -1, rowstring)
EndIf
Until *mysqlRow = 0
Result.l = MySQL_Free_Result(*mysqlResult)
EndIf
EndIf
SetWindowTitle(#Window_mysqltest, #MainTitle + "Found all matching data, nothing left to do.")
Return
;============================================================================================================================
; Dump the list to disk at the users' request
;============================================================================================================================
DumpListToDisk:
Lines = CountGadgetItems(#Gadget_mysqltest_datalist)
DumpList = SaveFileRequester("Save returned query", "QueryDump.txt", "Text (*.txt)|*.txt|All files (*.*)|*.*", 0)
If CreateFile(0, DumpList.s) <> 0
For ListItems = 0 To Lines - 1
For totalFields = 0 To fieldNum - 1
currentField = GetGadgetItemText(#Gadget_mysqltest_datalist, ListItems, totalFields)
outString + currentField + ";"
Next totalFields
WriteStringN(0,outString)
outString = ""
Next ListItems
CloseFile(0)
Else
SetWindowTitle(#Window_mysqltest, #MainTitle + "Cannot save the list to disk, something went wrong")
EndIf
Return