Versuch von CatchSQLite Database funktioniert nicht

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Versuch von CatchSQLite Database funktioniert nicht

Beitrag von ts-soft »

Hier mal mein Versuchscode:

Code: Alles auswählen

EnableExplicit

UseSQLiteDatabase()

DataSection
  db_start:
  IncludeBinary "test.sqlite"
  db_end:
EndDataSection

Procedure CatchSQLiteFromMemory(*mem, size)
  Protected PName.s = "\\.\pipe\SQLiteMemData"
  Protected hPipe, hFile, pBytes
  
  hPipe = CreateNamedPipe_(PName, #PIPE_ACCESS_DUPLEX, #PIPE_TYPE_BYTE, 1, size,size, #NMPWAIT_USE_DEFAULT_WAIT, #Null)
  If hPipe = #INVALID_HANDLE_VALUE : ProcedureReturn #False : EndIf
  hFile  = CreateFile_(PName, #GENERIC_READ |#GENERIC_WRITE, 0, #Null, #OPEN_EXISTING, 0, #Null)
  If Not hFile : CloseHandle_(hPipe) : ProcedureReturn #False : EndIf
  WriteFile_(hFile, *mem, size, @pBytes, 0)
  Debug pBytes
  
  CloseHandle_(hFile)
  Debug OpenDatabase(0, PName, "", "")
  CloseHandle_(hPipe)
EndProcedure

CatchSQLiteFromMemory(?db_start, ?db_end - ?db_start)
Die Anzahl geschriebener Bytes in pBytes stimmt bei mir, aber OpenDatabase schlägt fehl.

Frage 1: Kann das öffnen einer Datenbank (zum lesen würde reichen) per NamedPipe funktionieren?
Frage 2: Oder nutze ich falsche Parameter, bzw. fehlt in meinem Code noch etwas?

Zum testen einfach irgendeine SQLite-Datenbank includieren.

Gruß

Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
mk-soft
Beiträge: 3902
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Versuch von CatchSQLite Database funktioniert nicht

Beitrag von mk-soft »

So einfach mit den Pipes geht es nicht. Habe auch lange gebraucht bis da mit den Pipes hin gehauen hat.
Es braucht immer eine gegenstelle als Programm.

Habe es mal mit PB OpenFile(0, PName) versucht und dieser schlägt auch fehl.

Auszug aus ein Programm mit Pipe von mir.

Code: Alles auswählen

; ***************************************************************************************

#PIPEMODE = #PIPE_TYPE_MESSAGE | #PIPE_READMODE_MESSAGE | #PIPE_WAIT

; ***************************************************************************************

; Pipe server for command

Procedure ThreadPipeServerCommand(id)

  Protected modul.s = "Modul PipeServerCommand: "
  
  Protected pipename.s , hPipe, fConnected, error
  
  LogEvent(modul + "Start Thread.", 1)
  
  pipename = "\\.\pipe\" + pipe_prefix_name + "Send"
  
  Repeat
    ; Create Pipe
    hPipe = CreateNamedPipe_(pipename, #PIPE_ACCESS_DUPLEX, #PIPEMODE, #PIPE_UNLIMITED_INSTANCES, $FFFF, $FFFF, #NMPWAIT_USE_DEFAULT_WAIT, #Null)
    If hPipe = #INVALID_HANDLE_VALUE
      LogEvent(modul + "CreateNamedPipe failed - " + FormatMessage(error), 128)
      ProcedureReturn 0
    EndIf
    ; Connect Pipe
    fConnected = ConnectNamedPipe_(hPipe, 0);lpOverlapped)
    If fConnected
      ; Exit Program -> Exit Thread
      If exit
        CloseHandle_(hPipe)
        Break
      EndIf
      CreateThread(@ThreadPipeCommand(), hPipe)
    Else
      error = GetLastError_()
      LogEvent(modul + "ConnectNamedPipe failed - " + FormatMessage(error), 128)
      CloseHandle_(hPipe)
      Delay(1000)
    EndIf
   
  ForEver 
  
  LogEvent(modul + "Exit Thread.", 1)
  
EndProcedure

; ***************************************************************************************

; ***************************************************************************************

Procedure ThreadPipeCommand(hPipe)

  Protected modul.s = "Modul PipeCommand: "
  
  Protected *chRequest 
  Protected cbBytesRead 
  Protected fSuccess; 
  Protected text.s
  
  
  LogEvent(modul + "Start Thread.", 2)
  
  *chRequest = AllocateMemory(10000)
  
  Repeat 
   ; Read client requests from the pipe. 
    fSuccess = ReadFile_(hPipe, *chRequest, 10000, @cbBytesRead, #Null);
    
    If (fSuccess = 0); Or cbBytesRead = 0) 
      Break;
    EndIf
    
    text = PeekS(*chRequest)
    AddCommand(text)
    LogEvent(modul + "Receive - " + text, 4)
  
  ForEver
    
  ; Flush the pipe To allow the client To Read the pipe's contents 
  ; before disconnecting. Then disconnect the pipe, And close the 
  ; handle To this pipe instance. 
   
  DisconnectNamedPipe_(hPipe); 
  CloseHandle_(hPipe); 
  
  FreeMemory(*chRequest)
  
  LogEvent(modul + "Exit Thread.", 2)
  
EndProcedure

; ***************************************************************************************

Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Versuch von CatchSQLite Database funktioniert nicht

Beitrag von ts-soft »

Danke Dir erst mal.

Als Vorbild hatte ich die ImageToMem Routine genommen, aber SQLite nimmt anscheinend nur Dateien, die physikalisch auf
Datenträger existieren.

Werde ich den Plan erst mal add acta legen.

Gruß

Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten