Seite 2 von 2

Verfasst: 05.10.2005 12:34
von PAMKKKKK
Vielleicht versteh ich hier was nicht....
Aber erfindest du das Rad gerade neu ??

Funktionsfähige libmysql.dll Wrapper funktionen gibt es doch schon:
http://forums.purebasic.com/german/viewtopic.php?t=4964

Verfasst: 05.10.2005 12:36
von Beforegod
ARg, sollte der Pointer sein allerdings an der falschen stelle. ;)

Geht aber leider auch net :(

Verfasst: 05.10.2005 12:41
von Beforegod
PAMKKKKK hat geschrieben:Vielleicht versteh ich hier was nicht....
Aber erfindest du das Rad gerade neu ??

Funktionsfähige libmysql.dll Wrapper funktionen gibt es doch schon:
http://forums.purebasic.com/german/viewtopic.php?t=4964
Nun dort habe ich das Problem wie überall.

Ich kann keine Binären Daten abfragen (habe Bilder in der DB). Deswegen muss ich mir eine eigene kleine Wrapper Lib zusammenschustern.
Anscheinend nutzt hier keiner BLOBs und LONGBLOBS in MySQL Datenbanken :(

Verfasst: 05.10.2005 13:33
von edel
Beforegod hat geschrieben: Nun dort habe ich das Problem wie überall.
Ich kann keine Binären Daten abfragen (habe Bilder in der DB). Deswegen muss ich mir eine eigene kleine Wrapper Lib zusammenschustern.
Anscheinend nutzt hier keiner BLOBs und LONGBLOBS in MySQL Datenbanken :(
Wenn du das schaffst unbedingt posten , ich habe es gestern nicht wirklich
geschafft , dummes array *g* .Mal abgesehen davon das es eh keinen Sinn macht Bilder in die
Datenbank zu schreiben. :-)

edit :

In meinem Beispiel wuerde es , wenn der Tabellen aufbau bekannt ist, so gehen

Code: Alles auswählen

  *sql.mysql = db("localhost","root", "","bubi",3306)
   
    *sql\Query("SELECT * FROM test3")
    
    Structure test_table
      id.s 
      *Pic_data.l
      Pic_Name.s
    EndStructure
    
    test.test_table
     
    While *sql\fetchrow(@test)
       
      
      CatchImage(0,test\Pic_data)
      SaveImage(0,test\Pic_Name)
      
    Wend
  
    CallDebugger
  
  *sql\close()
PAMKKKKK hat geschrieben:Vielleicht versteh ich hier was nicht....
Aber erfindest du das Rad gerade neu ??

Funktionsfähige libmysql.dll Wrapper funktionen gibt es doch schon:
http://forums.purebasic.com/german/viewtopic.php?t=4964
Weil das Rad eiert . Deine lib ist sehr langsam. Und irgendwie kann
man mit den Daten nicht wirklich viel anfangen.

Verfasst: 05.10.2005 19:43
von Beforegod
Arbeite gerade an einer Prozedur wo das mit hilfe der Mysql bibliothek ausgeführt wird.

Funktioniert auch schon ganz gut, allerdings arschlahm :(

Sobald das teil mal richtig strukturiert ist, werde ich es hier reinstellen

Lange Zeit Pause

Verfasst: 23.10.2005 14:28
von Beforegod
soo..
hier der code für das Auslesen eines BLOBs.

Beschränkungen :

- Query darf nur EXAKT einen BLOB zurückgeben
- ist sehr langsam
- nicht sehr sauber programmiert :(

Code: Alles auswählen

    Global host.s
    Global user.s
    Global passwd.s
    Global udb.s
    Global port.l
    Global dbHnd.l
    Global SQL.s
    Global row.s

    #libmysql = 1
    #File = 1

    host = "localhost"
    user = "root"
    passwd = "root"
    udb = "purebasic"
    port = 3306

    Procedure.s GetError(db_ID,requester)

      Protected Errormsg.s, i.l, Error.l

      If CallFunction(#libmysql,"mysql_errno",db_ID) > 0
        *Error =CallFunction(#libmysql,"mysql_error",db_ID)
        i=-1
      Repeat
        i=i+1
        Errormsg=Errormsg+PeekS(*Error+i,1)
      Until PeekB(*Error+i)=0
        If requester
          Result= MessageRequester("MySQL error", Errormsg, #PB_MessageRequester_Ok)
        EndIf
      EndIf

    ProcedureReturn Errormsg

    EndProcedure

    Procedure sql_connect()
    If OpenLibrary(#libmysql,"libmysql.dll")
      Result=CallFunction(#libmysql,"mysql_init",dbHnd)
      If Result
        dbHnd = Result
        If CallFunction(#libmysql,"mysql_real_connect",dbHnd, host, user, passwd, udb, port, "", 0) = 0
          GetError(dbHnd,1)
        EndIf
      EndIf
    EndIf
    EndProcedure

    Procedure WriteSQLData(query.s)
      Static *mysqlRows
      Static *mysqlLen
      Static numRows
      Static numFields

      If CallFunction(#libmysql, "mysql_real_query", dbHnd, query, Len(query))
        GetError(udbHnd, 1)
        Else
          *mysqlData = CallFunction(#libmysql, "mysql_store_result", dbHnd)

        If *mysqlData = 0

        Else
          numRows = CallFunction(#libmysql, "mysql_num_rows", dbHnd)
          ;numFields = CallFunction(#libmysql, "mysql_num_fields", dbHnd)
        EndIf
      EndIf

      If numRows > 0
        *mysqlRows = CallFunction(#libmysql, "mysql_fetch_row", *mysqlData)
        CreateFile(#File, "D:\temp\tester.mpg")

      For i = 1 To *mysqlData

       *mysqlRows + 1
       WriteByte(PeekB(*mysqlRows))

      Next i

      ; Hier wird die neue MEthode ausprobiert
      
      ;*bloblength.l = CallFunction(#libmysql, "mysql_fetch_lengths", *mysqlData)
      ;PrintN(Str(*bloblength))
      ;PrintN(Str(PeekB(*mysqlRows)))
      ;WriteData(PeekB(*mysqlRows), Int(*bloblength))
      ;Input()


      CloseFile(#File)
      CallFunction(#libmysql, "mysql_free_result", *mysqlData)

      EndIf
    EndProcedure
Meistens mecker er rum wenns um das free_Result geht.. manchmal gehts ohne zu meckern, öfters hängt er sich daran auf.
Die Datei muss man selber mit angeben, wie man sie haben will.

Hier noch eine kleine Testdatei wie man die Daten auslesen kann:

Code: Alles auswählen

IncludeFile("blob_mysqldll.pb")

OpenConsole()
query.s = "SELECT data FROM blobtest"
Print("Starte MySQL Test mit " + query)
sql_connect()
WriteSQLData(query)
Für Verbesserungsvorschläge usw. bin ich dankbar ;)

--

Kommentare habe ich mal dringelassen.. sind überreste von anderen Versuchen und anderen Aufbaustrukturen-