Page 1 of 4
					
				wrapper - dll translation
				Posted: Thu Mar 14, 2013 11:47 am
				by t57042
				Hello,
Following code is part of a "universal wrapper"  to use sqlitening with other languages then Powerbasic.
Just enough to start testing.
Can  anyone translate this in  purebasix syntax?
Thanks
Richard
Code: Select all
;  ====================================================================
;  |                                                                  |
;  | SQLitening Universal Include                                     |
;=============================<[ Close ]>==============================
Declare Sub      sluClose lib "SQLitening.Dll" alias "slClose"
;   Calls SQLitening.Dll directly.
;========================<[ Get Column Count ]>========================
Declare Function sluGetColumnCount lib "SQLitening.Dll" alias "slGetColumnCount" ( _
                                 byval SetNumber As Long) As Long
;   Calls SQLitening.Dll directly.
;==============================<[ Open ]>==============================
Declare Function sluOpen lib "SQLiteningU.Dll" alias "sluOpen" ( _
                                 byval FileName As Long, _
                                 byval ModChars As Long) As Long
;   FileName is a pointer to a null-terminated string. If not needed you
;            may pass a zero.
;   ModChars is a pointer to a null-terminated string. If not needed you
;            may pass a zero.
;;;==============================<[ Sel ]>===============================
Declare Function sluSel lib "SQLiteningU.Dll" alias "sluSel" ( _
                                 byval Statement As Long, _
                                 byval SetNumber As Long, _
                                 byval ModChars As Long) As Long
;   Statement is a pointer to a null-terminated string.
;   ModChars is a pointer to a null-terminated string. If not needed you
;            may pass a zero.
;
;===========================<[ Field Get ]>============================
Declare Sub      sluF lib "SQLiteningU.Dll" alias "sluF" ( _
                                 byval ColumnNumber As Long, _
                                 byval FieldValue As Long, _
                                 byref SizeOfFieldValue As Long, _
                                 byval SetNumber As Long)
;   FieldValue is a pointer to the memory which will receive the field value.
;              A Null (hex ;00') will be added to end.
;   SizeOfFieldValue is both passed and returned. Pass the size of FieldValue.
;                    It must be at least the size of the returning field value + 1.
;                    The actual length of the returing field value is returned.
;                    If the passed size is too small then error -13 will be raised
;                    and the returning length will be set to -1.
;============================<[ Get Row ]>=============================
Declare Function sluGetRow lib "SQLiteningU.Dll" alias "sluGetRow" ( _
                                 byval SetNumber As Long, _
                                 byval ModChars As Long) As Long
;   ModChars is a pointer to a null-terminated string. If not needed you
;            may pass a zero.
 
			 
			
					
				Re: wrapper - dll translation
				Posted: Thu Mar 14, 2013 12:10 pm
				by ts-soft
				Code: Select all
;==========================================================================
; Generated with PureDLLHelper, Copyright ©2012 by Thomas <ts-soft> Schulz
;==========================================================================
Prototype   slClose()
Prototype   slF(*FieldValue, *SizeOfFieldValue.long)
Prototype.l slGetColumnCount(SetNumer.l)
Prototype.l slGetRow(SetNumber.l, ModChars.s = "")
Prototype.l slOpen(FileName.s = "", ModChars.s = "")
Prototype.l slSel(Statement.l, SetNumber.l, ModChars.s = "")
Global slClose.slClose
Global slF.slF
Global slGetColumnCount.slGetColumnCount
Global slGetRow.slGetRow
Global slOpen.slOpen
Global slSel.slSel
Procedure.i SQLitening_LoadDLL()
  Protected hDLL.i
  hDLL = OpenLibrary(#PB_Any, "SQLitening.dll")
  If hDLL <> 0
    slClose = GetFunction(hDLL, "slClose")
    slF = GetFunction(hDLL, "slF")
    slGetColumnCount = GetFunction(hDLL, "slGetColumnCount")
    slGetRow = GetFunction(hDLL, "slGetRow")
    slOpen = GetFunction(hDLL, "slOpen")
    slSel = GetFunction(hDLL, "slSel")
    ProcedureReturn hDLL
  EndIf
  ProcedureReturn #False
EndProcedure
 
			 
			
					
				Re: wrapper - dll translation
				Posted: Thu Mar 14, 2013 1:07 pm
				by t57042
				I get an incorrect number of parameters trying to execute the slSel function.
You translated the functions using the Sqlitening.dll.
There are 3 DLL's ;depending on the programming language used.
Could you check the sqlitening docs?
This is the small test I use to try Sqlitening.
Thanks
Richard
Code: Select all
    XIncludeFile "SQLiteningU.inc"
   slOpen ("sample.db3")
  
   slSel ("Select * from Parts where rowid < 11") 
   While slGetRow()
     
           Rec$ = ""
           For i = 1 To  4 ;slGetColumnCount()                               
              Rec$ = Rec$ + sluF(i) + " - "
           Next
           Debug rec$
   Wend
   CloseLibrary(0)
   End
 
			 
			
					
				Re: wrapper - dll translation
				Posted: Thu Mar 14, 2013 1:38 pm
				by ts-soft
				You can create your wrapper by simple using this: 
http://www.purebasic.fr/english/viewtop ... 56#p345256
Code: Select all
;==========================================================================
; Generated with PureDLLHelper, Copyright ©2012 by Thomas <ts-soft> Schulz
;==========================================================================
Prototype  sluF(ColumNumber.l, FieldValue.l, SizeOfField.l, SetNumber.l)
Prototype  sluGetRow(SetNumber.l, ModChars.s = "")
Prototype  sluOpen(FileName.s = "", ModChars.s = "")
Prototype  sluSel(Statement.s, SetNumber.l, ModChars.s = "")
Global sluF.sluF
Global sluGetRow.sluGetRow
Global sluOpen.sluOpen
Global sluSel.sluSel
Procedure.i SQLiteningU_LoadDLL()
  Protected hDLL.i
  hDLL = OpenLibrary(#PB_Any, "SQLiteningU.dll")
  If hDLL <> 0
    sluF = GetFunction(hDLL, "sluF")
    sluGetRow = GetFunction(hDLL, "sluGetRow")
    sluOpen = GetFunction(hDLL, "sluOpen")
    sluSel = GetFunction(hDLL, "sluSel")
    ProcedureReturn hDLL
  EndIf
  ProcedureReturn #False
EndProcedure
 
			 
			
					
				Re: wrapper - dll translation
				Posted: Thu Mar 14, 2013 5:42 pm
				by t57042
				Thanks,
I tried again with the SQlitenigU.dll angd get the same error for this line:
 
Code: Select all
sluSel ("Select * from Parts where rowid < 11")
   
incorrect number of parameters
Richard
 
			 
			
					
				Re: wrapper - dll translation
				Posted: Thu Mar 14, 2013 6:00 pm
				by ts-soft
				I have changed the first parameter to string:
Code: Select all
sluSel(Statement.s, SetNumber.l, ModChars.s = "")
The declaration says, the minimum of parameters a two parameter!
 
			 
			
					
				Re: wrapper - dll translation
				Posted: Thu Mar 14, 2013 7:38 pm
				by t57042
				Still get the same error.
This is the calling program derived from exampleA in SQlitening download.
Code: Select all
XIncludeFile "SQLiteningU.inc"
   sluOpen ("sample.db3")
  
   sluSel ("Select * from Parts where rowid < 11") 
   While sluGetRow()
     
           Rec$ = ""
           For i = 1 To  4                           
              Rec$ = Rec$ + sluF(i) + " - "
           Next
           Debug rec$
   Wend
   CloseLibrary(0)
   End
This is the wrapper (first commented part is coming form 'universal wrapper')
Code: Select all
;sqliteningU.inc
;  |                                                                  |
;  | SQLitening Universal Include                                     |
;==============================<[ Open ]>==============================
;Declare Function sluOpen lib "SQLiteningU.Dll" alias "sluOpen" ( _
                                ; byval FileName As Long, _
                                ; byval ModChars As Long) As Long
;   FileName is a pointer to a null-terminated string. If not needed you
;            may pass a zero.
;   ModChars is a pointer to a null-terminated string. If not needed you
;            may pass a zero.
;;;==============================<[ Sel ]>===============================
;Declare Function sluSel lib "SQLiteningU.Dll" alias "sluSel" ( _
                                ; byval Statement As Long, _
                                ; byval SetNumber As Long, _
                                ; byval ModChars As Long) As Long
;   Statement is a pointer to a null-terminated string.
;   ModChars is a pointer to a null-terminated string. If not needed you
;            may pass a zero.
;
;===========================<[ Field Get ]>============================
;Declare Sub      sluF lib "SQLiteningU.Dll" alias "sluF" ( _
                                ; byval ColumnNumber As Long, _
                                ; byval FieldValue As Long, _
                                ; byref SizeOfFieldValue As Long, _
                                ; byval SetNumber As Long)
;   FieldValue is a pointer to the memory which will receive the field value.
;              A Null (hex ;00') will be added to end.
;   SizeOfFieldValue is both passed and returned. Pass the size of FieldValue.
;                    It must be at least the size of the returning field value + 1.
;                    The actual length of the returing field value is returned.
;                    If the passed size is too small then error -13 will be raised
;                    and the returning length will be set to -1.
;============================<[ Get Row ]>=============================
;Declare Function sluGetRow lib "SQLiteningU.Dll" alias "sluGetRow" ( _
                                 ;byval SetNumber As Long, _
                                ; byval ModChars As Long) As Long
;   ModChars is a pointer to a null-terminated string. If not needed you
;            may pass a zero.
       ;==========================================================================
    ; Generated with PureDLLHelper, Copyright ©2012 by Thomas <ts-soft> Schulz
    ;==========================================================================
       ;==========================================================================
    ; Generated with PureDLLHelper, Copyright ©2012 by Thomas <ts-soft> Schulz
    ;==========================================================================
    Prototype  sluF(ColumNumber.l, FieldValue.l, SizeOfField.l, SetNumber.l)
    Prototype  sluGetRow(SetNumber.l, ModChars.s = "")
    Prototype  sluOpen(FileName.s = "", ModChars.s = "")
    Prototype  sluSel(Statement.s, SetNumber.l, ModChars.s = "")
   
    Global sluF.sluF
    Global sluGetRow.sluGetRow
    Global sluOpen.sluOpen
    Global sluSel.sluSel
    Procedure.i SQLiteningU_LoadDLL()
      Protected hDLL.i
      hDLL = OpenLibrary(#PB_Any, "SQLiteningU.dll")
      If hDLL <> 0
        sluF = GetFunction(hDLL, "sluF")
        sluGetRow = GetFunction(hDLL, "sluGetRow")
        sluOpen = GetFunction(hDLL, "sluOpen")
        sluSel = GetFunction(hDLL, "sluSel")
        ProcedureReturn hDLL
      EndIf
      ProcedureReturn #False
    EndProcedure
I have very little (nearly none) experience with DLL's.
The SQlitening DLL can imho be a very good addition to use SQLite in Server/Client applications.
I want to test it out completely, but first it has to run under Purebasic.
Alternative could be to switch to Powerbasic 
 
Many thanks 
Richard
 
			 
			
					
				Re: wrapper - dll translation
				Posted: Thu Mar 14, 2013 8:23 pm
				by Danilo
				t57042 wrote:Still get the same error.
This is the calling program derived from exampleA in SQlitening download.
Code: Select all
XIncludeFile "SQLiteningU.inc"
   sluOpen ("sample.db3")
  
   sluSel ("Select * from Parts where rowid < 11") 
   While sluGetRow()
     
           Rec$ = ""
           For i = 1 To  4                           
              Rec$ = Rec$ + sluF(i) + " - "
           Next
           Debug rec$
   Wend
   CloseLibrary(0)
   End
 
How many arguments did you give to the function sluSel() in your example above?
How many parameters do you see in the following declaration of sluSel()?
Code: Select all
;;;==============================<[ Sel ]>===============================
;Declare Function sluSel lib "SQLiteningU.Dll" alias "sluSel" ( _
;                                 byval Statement As Long, _
;                                 byval SetNumber As Long, _
;                                 byval ModChars As Long) As Long
;   Statement is a pointer to a null-terminated string.
;   ModChars is a pointer to a null-terminated string. If not needed you
;            may pass a zero.
;
[...]
    Prototype  sluSel(Statement.s, SetNumber.l, ModChars.s = "")
Hint:
t57042 wrote:I get an incorrect number of parameters trying to execute the slSel function.
 
			 
			
					
				Re: wrapper - dll translation
				Posted: Thu Mar 14, 2013 9:31 pm
				by t57042
				Well I know the number of parameters is not correct, but I don't know what parameter I should give as the second (thirth) one.
Richard
			 
			
					
				Re: wrapper - dll translation
				Posted: Fri Mar 15, 2013 9:15 am
				by Danilo
				t57042 wrote:Well I know the number of parameters is not correct, but I don't know what parameter I should give as the second (thirth) one.
According to the manual second parameter is the SetNumber:
SetNumber can be omitted or be any value from 0 to 32767. If omitted then will use zero.
So, 0 = default = omitted. Edit the prototype to:
Code: Select all
Prototype  sluSel(Statement.s, SetNumber.l = 0, ModChars.s = "")
 
			 
			
					
				Re: wrapper - dll translation
				Posted: Fri Mar 15, 2013 10:39 am
				by t57042
				I edited the parameters of the prototypes, according to the docs (see beginning code)
Something is still wrong because they want: 
 pointers to a null-terminated string
How do you indicate that?
The sluOpen function gives me: 
bad parameter number expected instead of string
Richard
Code: Select all
;sqliteningU.inc
                        |
;==============================<[ Open ]>==============================
;Declare Function sluOpen lib "SQLiteningU.Dll" alias "sluOpen" ( _
                                ; byval FileName As Long, _
                                ; byval ModChars As Long) As Long
;   FileName is a pointer to a null-terminated string. If not needed you
;            may pass a zero.
;   ModChars is a pointer to a null-terminated string. If not needed you
;            may pass a zero.
;;;==============================<[ Sel ]>===============================
;Declare Function sluSel lib "SQLiteningU.Dll" alias "sluSel" ( _
                                ; byval Statement As Long, _
                                ; byval SetNumber As Long, _
                                ; byval ModChars As Long) As Long
;   Statement is a pointer to a null-terminated string.
;   ModChars is a pointer to a null-terminated string. If not needed you
;            may pass a zero.
;
;===========================<[ Field Get ]>============================
;Declare Sub      sluF lib "SQLiteningU.Dll" alias "sluF" ( _
                                ; byval ColumnNumber As Long, _
                                ; byval FieldValue As Long, _
                                ; byref SizeOfFieldValue As Long, _
                                ; byval SetNumber As Long)
;   FieldValue is a pointer to the memory which will receive the field value.
;              A Null (hex ;00') will be added to end.
;   SizeOfFieldValue is both passed and returned. Pass the size of FieldValue.
;                    It must be at least the size of the returning field value + 1.
;                    The actual length of the returing field value is returned.
;                    If the passed size is too small then error -13 will be raised
;                    and the returning length will be set to -1.
;============================<[ Get Row ]>=============================
;Declare Function sluGetRow lib "SQLiteningU.Dll" alias "sluGetRow" ( _
                                 ;byval SetNumber As Long, _
                                ; byval ModChars As Long) As Long
;   ModChars is a pointer to a null-terminated string. If not needed you
;            may pass a zero.
       ;==========================================================================
    ; Generated with PureDLLHelper, Copyright ©2012 by Thomas <ts-soft> Schulz
    ;==========================================================================
       ;==========================================================================
    ; Generated with PureDLLHelper, Copyright ©2012 by Thomas <ts-soft> Schulz
    ;==========================================================================
    Prototype  sluF(ColumNumber.l, FieldValue.l, SizeOfField.l, SetNumber.l)
    Prototype  sluGetRow(SetNumber.l, ModChars.l =0)
    Prototype  sluOpen(FileName.l =0, ModChars.l= 0)
    Prototype  sluSel(Statement.l, SetNumber.l = 0, ModChars.l =0)
   
    Global sluF.sluF
    Global sluGetRow.sluGetRow
    Global sluOpen.sluOpen
    Global sluSel.sluSel
    Procedure.i SQLiteningU_LoadDLL()
      Protected hDLL.i
      hDLL = OpenLibrary(#PB_Any, "SQLiteningU.dll")
      If hDLL <> 0
        sluF = GetFunction(hDLL, "sluF")
        sluGetRow = GetFunction(hDLL, "sluGetRow")
        sluOpen = GetFunction(hDLL, "sluOpen")
        sluSel = GetFunction(hDLL, "sluSel")
        ProcedureReturn hDLL
      EndIf
      ProcedureReturn #False
    EndProcedure
 
Code: Select all
XIncludeFile "SQLiteningU.inc"
   sluOpen ("sample.db3")
  
   sluSel ("Select * from Parts where rowid < 11") 
   While sluGetRow()
     
           Rec$ = ""
           For i = 1 To  4                           
              Rec$ = Rec$ + sluF(i) + " - "
           Next
           Debug rec$
   Wend
   CloseLibrary(0)
   End
 
			 
			
					
				Re: wrapper - dll translation
				Posted: Fri Mar 15, 2013 10:54 am
				by Danilo
				t57042 wrote:I edited the parameters of the prototypes, according to the docs (see beginning code)
Something is still wrong because they want: 
 pointers to a null-terminated string
How do you indicate that?
The sluOpen function gives me: 
bad parameter number expected instead of string
Richard
 
You defined the strings as type .l, so you have to use an '@' character in front of all strings now (@"abc" gives the address of that string).
(side note: for pointers use type .i or *pointers generally. Use of .l is OK here because it is a 32bit only DLL, but better use .i anyway for pointer-size-types)
You could declare the string types with .s = "" (FileName and ModChars)
But then it would give ASCII strings if compiled with ASCII, and UNICODE strings when compiled in UNICODE mode.
That does not look right, as you call the same functions in both modes.
If you know what string encoding the DLL uses, you could use types .p-ascii = 0 or .p-utf8 = 0 or .p-unicode = 0
If the DLL uses ASCII only (please check it to make sure), try this for the include:
Code: Select all
    Prototype  sluF(ColumNumber.l, *FieldValue, *SizeOfField, SetNumber.l = 0)
    Prototype  sluGetRow(SetNumber.l = 0, ModChars.p-ascii = 0)
    Prototype  sluOpen(FileName.p-ascii = 0, ModChars.p-ascii = 0)
    Prototype  sluSel(Statement.p-ascii, SetNumber.l = 0, ModChars.p-ascii = 0)
   
    Global sluF.sluF
    Global sluGetRow.sluGetRow
    Global sluOpen.sluOpen
    Global sluSel.sluSel
    Procedure.i SQLiteningU_LoadDLL()
      Protected hDLL.i
      hDLL = OpenLibrary(#PB_Any, "SQLiteningU.dll")
      If hDLL <> 0
        sluF = GetFunction(hDLL, "sluF")
        sluGetRow = GetFunction(hDLL, "sluGetRow")
        sluOpen = GetFunction(hDLL, "sluOpen")
        sluSel = GetFunction(hDLL, "sluSel")
        ProcedureReturn hDLL
      EndIf
      ProcedureReturn #False
    EndProcedure
EDIT: changed it little bit, please try again. 
And for the code:
Code: Select all
XIncludeFile "SQLiteningU.inc"
dll = SQLiteningU_LoadDLL()
if dll
   if sluOpen ("sample.db3")
  
       sluSel ("Select * from Parts where rowid < 11") 
       
       
       While sluGetRow()
       
               Rec$ = ""
               For i = 1 To  4
                  buffer$ = Space(100)
                  len = len(buffer$)
                  sluF(i, @buffer$, @len)
                  Rec$ + PeekS(@buffer$,-1,#PB_ASCII) + " - "
               Next
               Debug rec$
       Wend
   endif
   CloseLibrary(dll)
   End
endif
 
			 
			
					
				Re: wrapper - dll translation
				Posted: Fri Mar 15, 2013 11:38 am
				by t57042
				Thanks, part is working. This is the calling part:
Code: Select all
; 
XIncludeFile "SQLiteningU.inc"
SQLiteningU_LoadDLL()
sluOpen ("sample.db3")
  
   sluSel ("Select * from Parts where rowid < 11") 
   While sluGetRow()
     
           Rec$ = ""
           For i = 1 To  4                           
              Rec$ = Rec$ + sluF(i) + " - "
           Next
           Debug rec$
   Wend
   CloseLibrary(0)
   End
Runs exept the sluF() function
the sluF() function says: incorrect number of parameters.
This is what is expected.But  How?
===========================<[ Field Get ]>============================
;Declare Sub      sluF lib "SQLiteningU.Dll" alias "sluF" ( _
                                ; byval ColumnNumber As Long, _
                                ; byval FieldValue As Long, _
                                ; byref SizeOfFieldValue As Long, _
                                ; byval SetNumber As Long)
;   FieldValue is a pointer to the memory which will receive the field value.
;              A Null (hex ;00') will be added to end.
;   SizeOfFieldValue is both passed and returned. Pass the size of FieldValue.
;                    It must be at least the size of the returning field value + 1.
;                    The actual length of the returing field value is returned.
;                    If the passed size is too small then error -13 will be raised
;                    and the returning length will be set to -1.
This is the slightly adapted include:
Code: Select all
 Prototype  sluF(ColumNumber.l, FieldValue.l, SizeOfField.l, SetNumber.l)
    Prototype  sluGetRow(SetNumber.l=0, ModChars.p-ascii = 0)
    Prototype  sluOpen(FileName.p-ascii = 0, ModChars.p-ascii = 0)
    Prototype  sluSel(Statement.p-ascii, SetNumber.l = 0, ModChars.p-ascii = 0)
   
    Global sluF.sluF
    Global sluGetRow.sluGetRow
    Global sluOpen.sluOpen
    Global sluSel.sluSel
    Procedure.i SQLiteningU_LoadDLL()
      Protected hDLL.i
      hDLL = OpenLibrary(#PB_Any, "SQLiteningU.dll")
      If hDLL <> 0
        sluF = GetFunction(hDLL, "sluF")
        sluGetRow = GetFunction(hDLL, "sluGetRow")
        sluOpen = GetFunction(hDLL, "sluOpen")
        sluSel = GetFunction(hDLL, "sluSel")
        ProcedureReturn hDLL
      EndIf
      ProcedureReturn #False
    EndProcedure
Tks - Richard
 
			 
			
					
				Re: wrapper - dll translation
				Posted: Fri Mar 15, 2013 11:54 am
				by Danilo
				See again my last posting (include + code).
			 
			
					
				Re: wrapper - dll translation
				Posted: Fri Mar 15, 2013 12:06 pm
				by t57042
				This runs, but no rows are returned - so nothing is displayed.
Richard