├── .gitattributes ├── .gitignore ├── Examples ├── ExampleASP.sb ├── ExampleASPX.sb ├── ExampleMixed.sb ├── ExamplePHP.sb ├── ExamplePbCgi.sb ├── ExamplePbCgiOptionalParameters.sb ├── ExamplePbCgiPublicPrivate.sb └── ExamplePbCgiSQLite.sb ├── LICENSE ├── README.md ├── README_EN.md ├── SpiderBite.pb ├── SpiderBiteAfterCreateApp.pb ├── SpiderBiteConfig.pb ├── includes ├── SpiderBite.sbi ├── SpiderBiteConfigDialogs.xml ├── functions.pbi └── inc.lexer.pbi ├── residents └── SpiderBite.res └── system └── templates ├── asp.asp ├── aspx.aspx ├── cgi.pb ├── php.php └── python.py /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Windows image file caches 2 | Thumbs.db 3 | ehthumbs.db 4 | 5 | # Folder config file 6 | Desktop.ini 7 | 8 | # Recycle Bin used on file shares 9 | $RECYCLE.BIN/ 10 | 11 | # Windows Installer files 12 | *.cab 13 | *.msi 14 | *.msm 15 | *.msp 16 | 17 | # Windows shortcuts 18 | *.lnk 19 | 20 | # ========================= 21 | # Operating System Files 22 | # ========================= 23 | 24 | # OSX 25 | # ========================= 26 | 27 | .DS_Store 28 | .AppleDouble 29 | .LSOverride 30 | 31 | # Thumbnails 32 | ._* 33 | 34 | # Files that might appear in the root of a volume 35 | .DocumentRevisions-V100 36 | .fseventsd 37 | .Spotlight-V100 38 | .TemporaryItems 39 | .Trashes 40 | .VolumeIcon.icns 41 | 42 | # Directories potentially created on remote AFP share 43 | .AppleDB 44 | .AppleDesktop 45 | Network Trash Folder 46 | Temporary Items 47 | Test/ 48 | .apdisk 49 | *.sb.cfg 50 | *.sbi.cfg 51 | *.pb.cfg 52 | *.pbi.cfg 53 | *.exe 54 | *.js 55 | *temp*.* 56 | * - Copy.* 57 | SpiderBasic_Compilation*.html 58 | SpiderBite.cfg 59 | -------------------------------------------------------------------------------- /Examples/ExampleASP.sb: -------------------------------------------------------------------------------- 1 | ; either include "SpiderBite.sbi": 2 | ; XIncludeFile "[YourPathTo]/SpiderBite.sbi" 3 | ; 4 | ; ... or copy "SpiderBite.res" to SpiderBasics Residents-Folder 5 | 6 | #SpiderBite_Profile = "default" 7 | 8 | Procedure myASPProcedure3Callback(Success, Result.s) 9 | 10 | Debug "" 11 | Debug "myASPProcedure3Callback" 12 | Debug "Success: " + Success 13 | Debug "Result: " + Result 14 | 15 | EndProcedure 16 | 17 | Procedure myASPProcedure4Callback(Success, Result.s) 18 | 19 | Debug "" 20 | Debug "myASPProcedure4Callback" 21 | Debug "Success: " + Success 22 | Debug "Result: " + Result 23 | 24 | EndProcedure 25 | 26 | EnableASP 27 | 28 | ProcedureDLL myASPProcedure1() 29 | 30 | ! myASPProcedure1 = "Hello from myASPProcedure1" 31 | 32 | EndProcedure 33 | 34 | ProcedureDLL myASPProcedure2(Message.s) 35 | 36 | ! myASPProcedure2 = "Hello from " & Message 37 | 38 | EndProcedure 39 | 40 | ProcedureDLL myASPProcedure3() 41 | 42 | ! myASPProcedure3 = "Hello from myASPProcedure3" 43 | 44 | EndProcedure 45 | 46 | ProcedureDLL myASPProcedure4(Message.s) 47 | 48 | ! myASPProcedure4 = "Hello from " & Message 49 | 50 | EndProcedure 51 | 52 | DisableASP 53 | 54 | Debug myASPProcedure1() ; without callback, without parameter 55 | Debug myASPProcedure2("myASPProcedure2") ; without callback, with parameter 56 | 57 | myASPProcedure3() ; with callback, without parameter 58 | myASPProcedure4("myASPProcedure4") ; with callback, with parameter 59 | 60 | If 1=2 61 | myASPProcedure3Callback(0, "") 62 | myASPProcedure4Callback(0, "") 63 | EndIf 64 | -------------------------------------------------------------------------------- /Examples/ExampleASPX.sb: -------------------------------------------------------------------------------- 1 | ; either include "SpiderBite.sbi": 2 | ; XIncludeFile "[YourPathTo]/SpiderBite.sbi" 3 | ; 4 | ; ... or copy "SpiderBite.res" to SpiderBasics Residents-Folder 5 | 6 | #SpiderBite_Profile = "default" 7 | 8 | Procedure myASPXProcedure3Callback(Success, Result.s) 9 | 10 | Debug "" 11 | Debug "myASPXProcedure3Callback" 12 | Debug "Success: " + Success 13 | Debug "Result: " + Result 14 | 15 | EndProcedure 16 | 17 | Procedure myASPXProcedure4Callback(Success, Result.s) 18 | 19 | Debug "" 20 | Debug "myASPXProcedure4Callback" 21 | Debug "Success: " + Success 22 | Debug "Result: " + Result 23 | 24 | EndProcedure 25 | 26 | EnableASPX 27 | 28 | ProcedureDLL myASPXProcedure1() 29 | 30 | ! return "Hello from myASPXProcedure1" 31 | 32 | EndProcedure 33 | 34 | ProcedureDLL myASPXProcedure2(Message.s) 35 | 36 | ! return "Hello from " & Message 37 | 38 | EndProcedure 39 | 40 | ProcedureDLL myASPXProcedure3() 41 | 42 | ! return "Hello from myASPXProcedure3" 43 | 44 | EndProcedure 45 | 46 | ProcedureDLL myASPXProcedure4(Message.s) 47 | 48 | ! return "Hello from " & Message 49 | 50 | EndProcedure 51 | 52 | DisableASPX 53 | 54 | Debug myASPXProcedure1() ; without callback, without parameter 55 | Debug myASPXProcedure2("myASPXProcedure2") ; without callback, with parameter 56 | 57 | myASPXProcedure3() ; with callback, without parameter 58 | myASPXProcedure4("myASPXProcedure4") ; with callback, with parameter 59 | 60 | If 1=2 61 | myASPXProcedure3Callback(0, "") 62 | myASPXProcedure4Callback(0, "") 63 | EndIf 64 | -------------------------------------------------------------------------------- /Examples/ExampleMixed.sb: -------------------------------------------------------------------------------- 1 | ; either include "SpiderBite.sbi": 2 | ; XIncludeFile "[YourPathTo]/SpiderBite.sbi" 3 | ; 4 | ; ... or copy "SpiderBite.res" to SpiderBasics Residents-Folder 5 | 6 | #SpiderBite_Profile = "default" 7 | 8 | EnablePbCgi 9 | 10 | Procedure.s myPbCgiProcedure() 11 | ProcedureReturn "Hello from myPbCgiProcedure" 12 | EndProcedure 13 | 14 | DisablePbCgi 15 | 16 | EnablePHP 17 | 18 | Procedure.s myPhpProcedure() 19 | ! return "Hello from myPhpProcedure"; 20 | EndProcedure 21 | 22 | DisablePHP 23 | 24 | Debug myPbCgiProcedure() 25 | Debug myPhpProcedure() 26 | 27 | -------------------------------------------------------------------------------- /Examples/ExamplePHP.sb: -------------------------------------------------------------------------------- 1 | ; either include "SpiderBite.sbi": 2 | ; XIncludeFile "[YourPathTo]/SpiderBite.sbi" 3 | ; 4 | ; ... or copy "SpiderBite.res" to SpiderBasics Residents-Folder 5 | 6 | #SpiderBite_Profile = "default" 7 | 8 | Procedure myPhpProcedure3Callback(Success, Result.s) 9 | 10 | Debug "" 11 | Debug "myPhpProcedure3Callback" 12 | Debug "Success: " + Success 13 | Debug "Result: " + Result 14 | 15 | EndProcedure 16 | 17 | Procedure myPhpProcedure4Callback(Success, Result.s) 18 | 19 | Debug "" 20 | Debug "myPhpProcedure4Callback" 21 | Debug "Success: " + Success 22 | Debug "Result: " + Result 23 | 24 | EndProcedure 25 | 26 | EnablePHP 27 | 28 | ProcedureDLL myPhpProcedure1() 29 | 30 | ! return "Hello from myPhpProcedure1"; 31 | 32 | EndProcedure 33 | 34 | ProcedureDLL myPhpProcedure2(Message.s) 35 | 36 | ! return "Hello from " . $Message ; 37 | 38 | EndProcedure 39 | 40 | ProcedureDLL myPhpProcedure3() 41 | 42 | ! return "Hello from myPhpProcedure3"; 43 | 44 | EndProcedure 45 | 46 | ProcedureDLL myPhpProcedure4(Message.s) 47 | 48 | ! return "Hello from " . $Message ; 49 | 50 | EndProcedure 51 | 52 | DisablePHP 53 | 54 | Debug myPhpProcedure1() ; without callback, without parameter 55 | Debug myPhpProcedure2("myPhpProcedure2") ; without callback, with parameter 56 | 57 | myPhpProcedure3() ; with callback, without parameter 58 | myPhpProcedure4("myPhpProcedure4") ; with callback, with parameter 59 | 60 | If 1=2 61 | myPhpProcedure3Callback(0, "") 62 | myPhpProcedure4Callback(0, "") 63 | EndIf -------------------------------------------------------------------------------- /Examples/ExamplePbCgi.sb: -------------------------------------------------------------------------------- 1 | ; either include "SpiderBite.sbi": 2 | ; XIncludeFile "[YourPathTo]/SpiderBite.sbi" 3 | ; 4 | ; ... or copy "SpiderBite.res" to SpiderBasics Residents-Folder 5 | 6 | #SpiderBite_Profile = "default" 7 | 8 | Procedure myPbCgiProcedure3Callback(Success, Result.s) 9 | 10 | Debug "" 11 | Debug "myPbCgiProcedure3Callback" 12 | Debug "Success: " + Success 13 | Debug "Result: " + Result 14 | 15 | EndProcedure 16 | 17 | Procedure myPbCgiProcedure4Callback(Success, Result.s) 18 | 19 | Debug "" 20 | Debug "myPbCgiProcedure4Callback" 21 | Debug "Success: " + Success 22 | Debug "Result: " + Result 23 | 24 | EndProcedure 25 | 26 | EnablePbCgi 27 | 28 | Procedure.s myPbCgiProcedure1() 29 | ProcedureReturn "Hello from myPbCgiProcedure1" 30 | EndProcedure 31 | 32 | Procedure.s myPbCgiProcedure2(Message.s) 33 | ProcedureReturn "Hello from " + Message 34 | EndProcedure 35 | 36 | Procedure.s myPbCgiProcedure3() 37 | ProcedureReturn "Hello from myPbCgiProcedure3" 38 | EndProcedure 39 | 40 | Procedure.s myPbCgiProcedure4(Message.s) 41 | ProcedureReturn "Hello from " + Message 42 | EndProcedure 43 | 44 | DisablePbCgi 45 | 46 | Debug myPbCgiProcedure1() ; without callback, without parameter 47 | Debug myPbCgiProcedure2("myPbCgiProcedure2") ; without callback, with parameter 48 | 49 | myPbCgiProcedure3() ; with callback, without parameter 50 | myPbCgiProcedure4("myPbCgiProcedure4") ; with callback, with parameter 51 | 52 | If 1=2 53 | myPbCgiProcedure3Callback(0, "") 54 | myPbCgiProcedure4Callback(0, "") 55 | EndIf 56 | -------------------------------------------------------------------------------- /Examples/ExamplePbCgiOptionalParameters.sb: -------------------------------------------------------------------------------- 1 | ; either include "SpiderBite.sbi": 2 | ; XIncludeFile "[YourPathTo]/SpiderBite.sbi" 3 | ; 4 | ; ... or copy "SpiderBite.res" to SpiderBasics Residents-Folder 5 | 6 | #SpiderBite_Profile = "default" 7 | 8 | EnablePbCgi 9 | 10 | ProcedureDLL.s myProcedure1(p1, p2, p3 = 42) 11 | ProcedureReturn Str(p3) 12 | EndProcedure 13 | 14 | ProcedureDLL myProcedure2(p1, p2, p3$ = "42") 15 | ProcedureReturn Val(p3$) 16 | EndProcedure 17 | 18 | DisablePbCgi 19 | 20 | Debug myProcedure1(1, 2) 21 | Debug myProcedure1(1, 2, 23) 22 | 23 | Debug myProcedure2(1, 2) 24 | Debug myProcedure2(1, 2, "23") 25 | -------------------------------------------------------------------------------- /Examples/ExamplePbCgiPublicPrivate.sb: -------------------------------------------------------------------------------- 1 | ; either include "SpiderBite.sbi": 2 | ; XIncludeFile "[YourPathTo]/SpiderBite.sbi" 3 | ; 4 | ; ... or copy "SpiderBite.res" to SpiderBasics Residents-Folder 5 | 6 | #SpiderBite_Profile = "default" 7 | 8 | EnablePbCgi 9 | 10 | Procedure.s myPrivateProcedure() 11 | ProcedureReturn "Hello from myPrivateProcedure" 12 | EndProcedure 13 | 14 | ProcedureDLL.s myPublicProcedure() 15 | ProcedureReturn "Hello from myPublicProcedure" 16 | EndProcedure 17 | 18 | DisablePbCgi 19 | 20 | Debug myPublicProcedure() 21 | 22 | Debug myPrivateProcedure() ; this will generate the error 'myPrivateProcedure() is not a function, array, list, map or macro.' 23 | -------------------------------------------------------------------------------- /Examples/ExamplePbCgiSQLite.sb: -------------------------------------------------------------------------------- 1 | ; either include "SpiderBite.sbi": 2 | ; XIncludeFile "[YourPathTo]/SpiderBite.sbi" 3 | ; 4 | ; ... or copy "SpiderBite.res" to SpiderBasics Residents-Folder 5 | 6 | #SpiderBite_Profile = "default" 7 | 8 | Procedure GetDataCallback(Success, Result.s) 9 | 10 | Debug "Success: " + Success 11 | Debug "Result: " + Result 12 | 13 | EndProcedure 14 | 15 | EnablePbCgi 16 | 17 | UseSQLiteDatabase() 18 | 19 | ProcedureDLL.s GetData() 20 | 21 | Protected ReturnValue.s 22 | Protected DB 23 | 24 | DB = OpenDatabase(#PB_Any, ":memory:", "", "", #PB_Database_SQLite) 25 | 26 | If DB 27 | 28 | DatabaseUpdate(DB, "Create Table SuperHeroes (Prename TEXT, Surname TEXT)") 29 | 30 | DatabaseUpdate(DB, "Insert Into SuperHeroes (Prename, Surname) Values ('Peter', 'Parker')") 31 | DatabaseUpdate(DB, "Insert Into SuperHeroes (Prename, Surname) Values ('Bruce', 'Wayne')") 32 | DatabaseUpdate(DB, "Insert Into SuperHeroes (Prename, Surname) Values ('Clark', 'Kent')") 33 | 34 | If DatabaseQuery(DB, "Select * From SuperHeroes Where Prename = 'Peter'") 35 | 36 | While NextDatabaseRow(DB) 37 | 38 | ReturnValue + GetDatabaseString(DB, 1) + "," + GetDatabaseString(DB, 0) + #CRLF$ 39 | 40 | Wend 41 | 42 | FinishDatabaseQuery(DB) 43 | 44 | EndIf 45 | 46 | CloseDatabase(DB) 47 | 48 | EndIf 49 | 50 | ProcedureReturn ReturnValue 51 | 52 | EndProcedure 53 | 54 | DisablePbCgi 55 | 56 | GetData() 57 | 58 | If 1=2 ; prevent removing the 'unneeded' callback 59 | GetDataCallback(0, "") 60 | EndIf 61 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Peter Tübben 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SpiderBite 2 | 3 | [Click here for the English version of this README](https://github.com/spiderbytes/SpiderBite/blob/master/README_EN.md) 4 | 5 | ## Etwas in eigener Sache 6 | 7 | Wenn Dir meine Arbeit gefällt, würde ich mich freuen, [wenn Du mich mit einer kleinen Spende unterstützen würdest](https://www.paypal.me/ptsw). 8 | 9 | ## Breaking Change 10 | 11 | Ab der Version vom 01.10.2017 wird zwischen öffentlichen und privaten Prozeduren unterschieden. Mehr dazu [hier](#Öffentliche-und-private-prozeduren). 12 | 13 | ## Was ist das hier? 14 | 15 | SpiderBite ist ein Präprozessor für SpiderBasic, der es ermöglicht, in einem Code Bereiche zu markieren, die auf dem WebServer ausgeführt werden (der sogenannte ServerCode (PB2Web-User werden es kennen :wink:)). 16 | 17 | Wie bekannt ist, kann und darf der von SpiderBasic generierte Code nicht direkt auf die Hardware des WebServers zugreifen. Somit ist es nicht möglich, direkte Datenbankabfragen, Filesystemzugriffe oder sonstiges aus SpiderBasic auszuführen. Die bisherige Vorgehensweise ist es, eine serverseitige Komponente zu programmieren (sei es als CGI oder PHP- (ASP-, Python-, ...) Script) und diese Komponente dann in SpiderBasic mittels HttpRequest() aufzurufen. Das funktioniert eigentlich ganz gut, ist aber meines Erachtens nicht besonders komfortabel. Aus diesem Grund habe ich mich entschlossen, SpiderBite zu entwickeln. 18 | 19 | ### Ein simples Beispiel 20 | 21 | ``` 22 | EnablePbCgi 23 | 24 | ; der Code in diesem Block wird auf dem Server ausgeführt 25 | 26 | ProcedureDLL.s myPbCgiProcedure() 27 | ProcedureReturn "Hello from myPbCgiProcedure" 28 | EndProcedure 29 | 30 | DisablePbCgi 31 | 32 | Debug myPbCgiProcedure() 33 | ``` 34 | 35 | Der Code, der oben in dem `EnablePbCgi/DisablePbCgi` - Block notiert ist, wird vor dem eigentlichen Konvertierungsvorgang durch SpiderBite extrahiert und in eine eigene PureBasic-Executable kompiliert (eine sogenannte CGI-EXE), die dann auf dem Server ausgeführt wird. Hierbei steht im ServerCode-Block der gesamte PureBasic-Befehlsvorrat zur Verfügung. 36 | 37 | ![](https://i.imgur.com/20HJMrK.png) 38 | 39 | Neben der Möglichkeit, PureBasic-CGI zu erstellen stehen auch Blockbereiche für PHP, ASP und ASPX zur Verfügung. Ein Beispiel für PHP: 40 | 41 | ``` 42 | EnablePHP 43 | 44 | ProcedureDLL myPhpProcedure() 45 | ! return "Hello from myPhpProcedure"; 46 | EndProcedure 47 | 48 | DisablePHP 49 | 50 | Debug myPhpProcedure() 51 | ``` 52 | Die PHP-Befehle werden hier durch ein führendes Ausrufezeichen markiert. 53 | 54 | Es ist möglich unterschiedliche Blockbereiche in einem Source zu nutzen (hier: PbCgi und PHP): 55 | 56 | ``` 57 | EnablePbCgi 58 | ProcedureDLL.s myPbCgiProcedure() 59 | ProcedureReturn "Hello from myPbCgiProcedure" 60 | EndProcedure 61 | DisablePbCgi 62 | 63 | EnablePHP 64 | ProcedureDLL.s myPhpProcedure() 65 | ! return "Hello from myPhpProcedure"; 66 | EndProcedure 67 | DisablePHP 68 | 69 | Debug myPbCgiProcedure() 70 | Debug myPhpProcedure() 71 | ``` 72 | 73 | Blockbereiche für NodeJs und Python sind in Planung. 74 | 75 | ## Systemvoraussetzungen 76 | 77 | * SpiderBasic 78 | 79 | * PureBasic (um die Sourcen zu kompilieren und für den Fall, dass PB Cgi erstellt werden sollen) 80 | 81 | * Einen beliebigen Webserver (Apache, IIS, nginx, ...) 82 | 83 | ## Installation 84 | 85 | GitHub-Kenner klonen sich dieses Projekt auf Ihren Datenträger an einen Ort ihrer Wahl. Menschen, die sich nicht mit GitHub auskennen, haben sie Möglichkeit, sich die Sourcen als ZIP herunterzuladen: 86 | 87 | ![](http://i.imgur.com/2SxgUyA.png) 88 | 89 | Danach müssen die PB-Sourcen (`SpiderBite.pb`, `SpiderBiteAfterCreateApp.pb` und `SpiderBiteConfig.pb`) mit PureBasic kompiliert werden und als Tools in SpiderBasic eingerichtet werden. 90 | 91 | ### SpiderBite als SpiderBasic-Tools einrichten 92 | 93 | Nachdem die Sourcen kompiliert wurden, wird SpiderBite als SpiderBasic-Tools installiert. Es ist darauf zu achten, dass als Übergabeparameter "`%COMPILEFILE`" angegeben wird. Ebenso sollten die beiden Checkboxen "`Wait until tool quits`" und "`Hide tool from the Main menu`" aktiviert sein. 94 | 95 | #### Before Compile / Run 96 | 97 | Dieses Tool tritt in Aktion, wenn in SpiderBasic `Compile/Run` aufgerufen wird. Also jedes Mal, wenn `` gedrückt wird. 98 | 99 | ![](http://i.imgur.com/sTWcQmD.png) 100 | 101 | #### Before Create App 102 | 103 | Dieses Tool tritt in Aktion, wenn in SpiderBasic `Create App...` aufgerufen wird, um eine App zu erstellen. 104 | 105 | ![](http://i.imgur.com/xVk67QQ.png) 106 | 107 | #### After Create App 108 | 109 | **Wichtig!** Aufgrund eines Fehlers in SpiderBasic wird nicht das erzeugte Temp-File als Grundlage für die zu erstellende App verwendet, sondern der Original-Source. Bis dieser Fehler behoben wird, muss hier ein wenig getrickst werden und ein separates Programm (`SpiderBiteAfterCreateApp.exe`) als Tool eingerichtet werden. 110 | 111 | ![](http://i.imgur.com/oXpURyf.png) 112 | 113 | ## 114 | 115 | Und so sieht es dann aus, wenn alle Tools richtig eingetragen sind: 116 | 117 | ![](http://i.imgur.com/GUKiyFb.png) 118 | 119 | ## SpiderBiteConfig 120 | 121 | Mit SpiderBiteConfig können Profile angelegt werden, die dann im SpiderBasic-Code angegeben werden: 122 | 123 | ![](http://i.imgur.com/eXvhJLn.png) 124 | 125 | ![](http://i.imgur.com/zg9aw5y.png) 126 | 127 | Soll beispielsweise ein PureBasic-CGI erstellt werden, so muss in SpiderBiteConfig festgelegt werden, wo sich der PureBasic-Compiler befindet. Des weiteren muss angegeben werden, wo das CGI gespeichert werden soll (`PbCgiServerFilename`) und wie es vom Browser aus aufgerufen werden kann (`PbCgiServerAddress`). Schlussendlich kann ein Template ausgewählt werden, welches als Grundlage für das zu erstellende CGI verwendet wird. Wird kein Template angegeben, so wird ein Standard-Template verwendet. 128 | 129 | Des weiteren muss die Datei `SpiderBite.sbi` eingebunden werden. Sie befindet sich im `include` - Ordner. 130 | 131 | ``` 132 | XIncludeFile "[PathTo]/SpiderBite.sbi" 133 | 134 | #SpiderBite_Profile = "default" ; hiermit wird das Profil angegeben 135 | 136 | EnablePbCgi 137 | ProcedureDLL.s myPbCgiProcedure() 138 | ProcedureReturn "Hello from myPbCgiProcedure" 139 | EndProcedure 140 | DisablePbCgi 141 | 142 | Debug myPbCgiProcedure() 143 | ``` 144 | 145 | Alternativ kann die Datei `SpiderBite.res` in den Residents-Ordner von SpiderBasic kopiert werden. 146 | 147 | SpiderBiteConfig kann optional ebenfalls als Tool installiert werden, um die Konfigurationen komfortabel aus SpiderBasic heraus zu verwalten. 148 | 149 | ## Synchrone Kommunikation vs Asynchrone Kommunikation 150 | 151 | SpiderBite verwendet für die Kommunikation zwischen Client (Browser) und Server Ajax-Aufrufe. Diese können synchron und asynchron erfolgen. 152 | 153 | Der Vorteil eines synchronen Aufrufes ist, dass der Rückgabewert in der gleichen Zeile zur Verfügung steht, in der die Funktion aufgerufen wird. 154 | 155 | Synchroner Aufruf: 156 | ``` 157 | Enable* 158 | ProcedureDLL.s myProcedure() 159 | ProcedureReturn "Hello World" 160 | EndProcedure 161 | Disable* 162 | 163 | Debug myProcedure() ; hier kann die Rückgabe ausgewertet werden. 164 | ``` 165 | 166 | Der Nachteil eines synchronen Aufrufes besteht darin, dass der Code so lange in der Zeile des Aufrufes wartet, bis der Server den Rückgabewert liefert. 167 | 168 | Das kann dazu führen, dass der Browser nicht mehr reagiert, wenn der Server zu lange benötigt, um den Rückgabewert zu liefern (beispielsweise bei einer schlechten Verbindung zwischen Client und Server oder bei langen Laufzeiten von Prozeduren). 169 | 170 | Aus diesem Grund wird empfohlen, asynchrone Aufrufe zu verwenden. Das hat zwar mehr Programmieraufwand zur Folge, resultiert aber in einem jederzeit reagierenden Browser. 171 | 172 | Ein asynchroner Aufruf erfolgt, wenn sich im Client-Code eine Prozedur gleichen Namens mit angehängtem ```Callback``` befindet: 173 | 174 | Server-Code: ```myProcedure()``` 175 | 176 | Client-Code: ```myProcedureCallback()``` 177 | 178 | Ein asynchroner Aufruf sähe dementsprechend so aus: 179 | ``` 180 | Procedure myProcedureCallback(Success, Result.s) 181 | Debug Result ; hier wird der Rückgabewert des Aufrufes 182 | ; myProcedure() geliefert. 183 | EndProcedure 184 | 185 | Enable* 186 | ProcedureDLL.s myProcedure() 187 | ProcedureReturn "Hello World" 188 | EndProcedure 189 | Disable* 190 | 191 | myProcedure() ; hier wird kein Rückgabewert geliefert! 192 | 193 | If 1=2 194 | myProcedureCallback(0, "") ; ein 'Blind'-Aufruf 195 | EndIf 196 | ``` 197 | 198 | **Wichtig:** SpiderBasic optimiert den Code. Ungenutzte Prozeduren werden nicht mitkompiliert. Da SpiderBite den im ServerCode-Block befindlichen Aufruf von `myProcedureCallback` durch einen Ajax-Aufruf ersetzt, 'denkt' SpiderBasic, dass die Prozedur nicht aufgerufen wird. Demzufolge wird sie von SpiderBasic entfernt. Aus diesem Grund müssen wir den Aufruf an anderer Stelle simulieren: 199 | ``` 200 | If 1=2 201 | myProcedureCallback(0, "") ; ein 'Blind'-Aufruf 202 | EndIf 203 | ``` 204 | 205 | ## Öffentliche und private Prozeduren 206 | 207 | Ab der Version vom 01.10.2017 wird zwischen öffentlichen und privaten Prozeduren unterschieden. Öffentliche Prozeduren kann man clientseitig aufrufen, private Prozeduren nicht. 208 | 209 | Öffentlich Prozeduren werden mit `ProcedureDLL()` angegeben. 210 | 211 | Private Prozeduren werden mit `Procedure()` angegeben. 212 | 213 | **Beispiel:** 214 | ``` 215 | EnablePbCgi 216 | 217 | Procedure.s myPrivateProcedure() 218 | ProcedureReturn "Hello from myPrivateProcedure" 219 | EndProcedure 220 | 221 | ProcedureDLL.s myPublicProcedure() 222 | ProcedureReturn "Hello from myPublicProcedure" 223 | EndProcedure 224 | 225 | DisablePbCgi 226 | 227 | Debug myPublicProcedure() 228 | 229 | Debug myPrivateProcedure() ; this will generate the error 'myPrivateProcedure() is not a function, array, list, map or macro.' 230 | ``` 231 | 232 | ## Templates 233 | 234 | {ToDo} 235 | 236 | ## Öffentliche und private Prozeduren 237 | 238 | {ToDo} 239 | 240 | ## ToDo 241 | 242 | * Momentan sind nur einfache Übergabeparameter (Zeichenketten und Zahlen) erlaubt. 243 | 244 | * ServerCode wird aktuell nicht in inkludierten (`(X)IncludeFile()`) Dateien verarbeitet. 245 | 246 | ## Fragen? Anregungen? Fehlermeldungen? 247 | 248 | [SpiderBasic-Forum (englisch)](http://forums.spiderbasic.com/index.php) 249 | 250 | [SpiderBasic-Forum (deutsch)](http://www.purebasic.fr/german/viewforum.php?f=33) 251 | 252 | ## Lizenz 253 | 254 | [MIT](https://github.com/spiderbytes/SpiderBite/blob/master/LICENSE) 255 | 256 | ## Etwas in eigener Sache 257 | 258 | Wenn Dir meine Arbeit gefällt, würde ich mich freuen, [wenn Du mich mit einer kleinen Spende unterstützen würdest](https://www.paypal.me/ptsw). 259 | -------------------------------------------------------------------------------- /README_EN.md: -------------------------------------------------------------------------------- 1 | # SpiderBite 2 | 3 | This english translation was kindly provided to me by Robert A. Rioja. 🌼 4 | 5 | ## Something on my own behalf 6 | 7 | If you like my work, I would be happy [if you would support me with a small donation](https://www.paypal.me/ptsw). 8 | 9 | ## What the hell is this? 10 | 11 | SpiderBite is a preprocessor for SpiderBasic that allows you to mark areas in a code that are executed on the web server, the so-called server code as PB2Web users know it. 12 | 13 | As known, the code generated by SpiderBasic cannot, and must not, directly access the hardware of the web server. 14 | 15 | Thus, it is not possible to execute direct database queries, file system accesses or anything else from SpiderBasic. 16 | 17 | The procedure so far is to program a server-side component, be it as CGI or PHP (ASP, Python, ...) script, and then call this component in SpiderBasic using HttpRequest(). That actually works quite well, but in my opinion it's not very comfortable. 18 | 19 | For this reason I decided to develop SpiderBite. 20 | 21 | ### A simple example 22 | 23 | ``` 24 | EnablePbCgi 25 | 26 | ; The code in this block is executed on the server. 27 | 28 | ProcedureDLL.s myPbCgiProcedure() 29 | ProcedureReturn "Hello from myPbCgiProcedure" 30 | EndProcedure 31 | 32 | DisablePbCgi 33 | 34 | Debug myPbCgiProcedure() 35 | ``` 36 | 37 | The code noted above in the `EnablePbCgi/DisablePbCgi` block is extracted by SpiderBite before the actual conversion process and compiled into its own PureBasic executable (a so-called CGI-EXE), which is then executed on the server. The entire PureBasic command set is available in the ServerCode block. 38 | 39 | ![](https://i.imgur.com/20HJMrK.png) 40 | 41 | Besides the ability to create PureBasic CGI, block areas for PHP, ASP and ASPX are also available. An example for PHP: 42 | 43 | ``` 44 | EnablePHP 45 | 46 | ProcedureDLL myPhpProcedure() 47 | ! return "Hello from myPhpProcedure"; 48 | EndProcedure 49 | 50 | DisablePHP 51 | 52 | Debug myPhpProcedure() 53 | ``` 54 | 55 | The PHP commands are marked with a leading exclamation mark. 56 | 57 | It is possible to use different block areas in one source (here: PbCgi and PHP): 58 | 59 | ``` 60 | EnablePbCgi 61 | ProcedureDLL.s myPbCgiProcedure() 62 | ProcedureReturn "Hello from myPbCgiProcedure" 63 | EndProcedure 64 | DisablePbCgi 65 | 66 | EnablePHP 67 | ProcedureDLL.s myPhpProcedure() 68 | ! return "Hello from myPhpProcedure"; 69 | EndProcedure 70 | DisablePHP 71 | 72 | Debug myPbCgiProcedure() 73 | Debug myPhpProcedure() 74 | ``` 75 | 76 | Block areas for NodeJs and Python are planned. 77 | 78 | ## System Requirements 79 | 80 | * SpiderBasic 81 | 82 | * PureBasic (to compile the sources and in case PB Cgi should be created) 83 | 84 | * Any web server (Apache, IIS, nginx, ...) 85 | 86 | ## Installation 87 | 88 | GitHub connoisseurs clone this project on your data carrier to a place of their choice. People who are not familiar with GitHub can download the sources as ZIP: 89 | 90 | ![](http://i.imgur.com/2SxgUyA.png) 91 | 92 | Then the PB sources (`SpiderBite.pb`, `SpiderBiteAfterCreateApp.pb` and `SpiderBiteConfig.pb`) must be compiled with PureBasic and set up as tools in SpiderBasic. 93 | 94 | ### Set up SpiderBite as SpiderBasic Tools 95 | 96 | After the sources have been compiled, SpiderBite is installed as SpiderBasic tools. Make sure that "`%COMPILEFILE`" is specified as the transfer parameter. The two checkboxes "`Wait until tool quits`" and "`Hide tool from the Main menu`" should also be activated. 97 | 98 | #### Before Compile / Run 99 | 100 | This tool comes into action when `Compile/Run` is called in SpiderBasic. So every time `` is pressed. 101 | 102 | ![](http://i.imgur.com/sTWcQmD.png) 103 | 104 | #### Before Create App 105 | 106 | This tool comes into action when in SpiderBasic `Create App...` is called to create an app. 107 | 108 | ![](http://i.imgur.com/xVk67QQ.png) 109 | 110 | #### After Create App 111 | 112 | **Important!** Due to a bug in SpiderBasic, the generated temp file is not used as basis for the app to be created, but the original source. Until this bug is fixed, some tricks have to be done here and a separate program (`SpiderBiteAfterCreateApp.exe`) has to be set up as a tool. 113 | 114 | ![](http://i.imgur.com/oXpURyf.png) 115 | 116 | ## 117 | 118 | And so it looks then, if all tools are correctly registered: 119 | 120 | ![](http://i.imgur.com/GUKiyFb.png) 121 | 122 | ## SpiderBiteConfig 123 | 124 | With SpiderBiteConfig profiles can be created, which are then specified in the SpiderBase code: 125 | 126 | ![](http://i.imgur.com/eXvhJLn.png) 127 | 128 | ![](http://i.imgur.com/zg9aw5y.png) 129 | 130 | For example, if you want to create a PureBasic CGI, you have to specify in SpiderBiteConfig where the PureBasic compiler is located. Furthermore you have to specify where the CGI should be stored (`PbCgiServerFilename`) and how it can be called from the browser (`PbCgiServerAddress`). Finally, a template can be selected, which is used as a basis for the CGI to be created. If no template is specified, a standard template is used. 131 | 132 | Furthermore the file `SpiderBite.sbi` must be included. It is located in the `include` folder. 133 | 134 | ``` 135 | XIncludeFile "[PathTo]/SpiderBite.sbi" 136 | 137 | #SpiderBite_Profile = "default" ; here the profile is specified 138 | 139 | EnablePbCgi 140 | ProcedureDLL.s myPbCgiProcedure() 141 | ProcedureReturn "Hello from myPbCgiProcedure" 142 | EndProcedure 143 | DisablePbCgi 144 | 145 | Debug myPbCgiProcedure() 146 | ``` 147 | 148 | Alternatively the file `SpiderBite.res` can be copied into the Residents folder of SpiderBasic. 149 | 150 | SpiderBiteConfig can optionally also be installed as a tool to manage the configurations comfortably from SpiderBasic. 151 | 152 | ## Synchronous Communication vs Asynchronous Communication 153 | 154 | SpiderBite uses Ajax calls for communication between client (browser) and server. These can be synchronous and asynchronous. 155 | 156 | The advantage of a synchronous call is that the return value is available in the same line in which the function is called. 157 | 158 | Synchronous call: 159 | ``` 160 | Enable* 161 | ProcedureDLL.s myProcedure() 162 | ProcedureReturn "Hello World" 163 | EndProcedure 164 | Disable* 165 | 166 | Debug myProcedure() ; here the return can be evaluated. 167 | ``` 168 | 169 | The disadvantage of a synchronous call is that the code waits in the line of the call until the server returns the return value. 170 | 171 | This can cause the browser to stop responding if the server takes too long to return the return value (for example, if the connection between client and server is poor, or if procedures run for long periods of time). 172 | 173 | For this reason, it is recommended to use asynchronous calls. Although this results in more programming effort, it results in a browser that reacts at all times. 174 | 175 | An asynchronous call occurs if the client code contains a procedure with the same name and an attached ```Callback```: 176 | 177 | Server-Code: ```myProcedure()``` 178 | 179 | Client-Code: ```myProcedureCallback()``` 180 | 181 | An asynchronous call would accordingly look like this: 182 | ``` 183 | Procedure myProcedureCallback(Success, Result.s) 184 | Debug Result ; hier wird der Rückgabewert des Aufrufes 185 | ; myProcedure() geliefert. 186 | EndProcedure 187 | 188 | Enable* 189 | ProcedureDLL.s myProcedure() 190 | ProcedureReturn "Hello World" 191 | EndProcedure 192 | Disable* 193 | 194 | myProcedure() ; no return value is returned here! 195 | 196 | If 1=2 197 | myProcedureCallback(0, "") ; a 'blind' call 198 | EndIf 199 | ``` 200 | 201 | **Important:** SpiderBasic optimizes the code. Unused procedures are not compiled. Since SpiderBite replaces the `myProcedureCallback` call in the ServerCode block with an Ajax call, SpiderBasic 'thinks' that the procedure will not be called. As a result, it is removed by SpiderBasic. For this reason, we must simulate the call elsewhere: 202 | 203 | ``` 204 | If 1=2 205 | myProcedureCallback(0, "") ; a 'blind' call 206 | EndIf 207 | ``` 208 | 209 | ## Public and private procedures 210 | 211 | Starting with version 01.10.2017, a distinction is made between public and private procedures. Public procedures can be called on the client side, private procedures cannot. 212 | 213 | Public procedures are specified with `ProcedureDLL()`. 214 | 215 | Private procedures are specified with `Procedure()`. 216 | 217 | **Example:** 218 | ``` 219 | EnablePbCgi 220 | 221 | Procedure.s myPrivateProcedure() 222 | ProcedureReturn "Hello from myPrivateProcedure" 223 | EndProcedure 224 | 225 | ProcedureDLL.s myPublicProcedure() 226 | ProcedureReturn "Hello from myPublicProcedure" 227 | EndProcedure 228 | 229 | DisablePbCgi 230 | 231 | Debug myPublicProcedure() 232 | 233 | Debug myPrivateProcedure() ; this will generate the error 'myPrivateProcedure() is not a function, array, list, map or macro.' 234 | ``` 235 | 236 | ## Templates 237 | 238 | {ToDo} 239 | 240 | ## ToDo 241 | 242 | * Currently, only simple transfer parameters (strings and numbers) are allowed. 243 | 244 | * ServerCode is currently not included in included (`(X)IncludeFile()`) files are processed. 245 | 246 | 247 | ## Any questions? Suggestions? Error messages? 248 | 249 | [SpiderBasic-Forum (englisch)](http://forums.spiderbasic.com/index.php) 250 | 251 | [SpiderBasic-Forum (german)](http://www.purebasic.fr/german/viewforum.php?f=33) 252 | 253 | ## License 254 | 255 | [MIT](https://github.com/spiderbytes/SpiderBite/blob/master/LICENSE) 256 | 257 | ## Something on my own behalf 258 | 259 | If you like my work, I would be happy [if you would support me with a small donation](https://www.paypal.me/ptsw). 260 | -------------------------------------------------------------------------------- /SpiderBite.pb: -------------------------------------------------------------------------------- 1 | EnableExplicit 2 | 3 | Global SourceFile.s 4 | 5 | #AppName = "SpiderBite" 6 | #AppVersion = "2017-10-25" 7 | 8 | #ServerCodeType_NodeJs = "NodeJs" 9 | #ServerCodeType_Php = "Php" 10 | #ServerCodeType_PbCgi = "PbCgi" 11 | #ServerCodeType_Python = "Python" 12 | #ServerCodeType_Asp = "Asp" 13 | #ServerCodeType_Aspx = "Aspx" 14 | 15 | Structure sSpiderBiteCfg 16 | 17 | PbCompiler.s 18 | 19 | AspxTemplate.s 20 | AspxServerFilename.s 21 | AspxServerAddress.s 22 | 23 | AspTemplate.s 24 | AspServerFilename.s 25 | AspServerAddress.s 26 | 27 | PbCgiTemplate.s 28 | PbCgiServerFilename.s 29 | PbCgiServerAddress.s 30 | 31 | NodeJsServerFilename.s 32 | NodeJsServerAddress.s 33 | NodeJsTemplate.s 34 | 35 | PhpTemplate.s 36 | PhpServerFilename.s 37 | PhpServerAddress.s 38 | 39 | PythonTemplate.s 40 | PythonServerFilename.s 41 | PythonServerAddress.s 42 | 43 | EndStructure 44 | 45 | Global SpiderBite_Profile.s 46 | Global SpiderBite_ByPass 47 | 48 | Global NewMap SpiderBiteCfg.sSpiderBiteCfg() 49 | 50 | XIncludeFile "includes/inc.lexer.pbi" 51 | XIncludeFile "includes/functions.pbi" 52 | 53 | Structure Token 54 | Token.s 55 | Type.i 56 | Line.i 57 | EndStructure 58 | 59 | Global NewList Token.Token() 60 | 61 | Procedure.s AddCompilerError(FileContent.s, Message.s) 62 | FileContent = "CompilerError " + Chr(34) + "SpiderBite: " + Message + Chr(34) + #CRLF$ + FileContent 63 | ProcedureReturn FileContent 64 | EndProcedure 65 | 66 | Procedure.s AddCompilerWarning(FileContent.s, Message.s) 67 | FileContent = "CompilerWarning " + Chr(34) + Message + Chr(34) + #CRLF$ + FileContent 68 | ProcedureReturn FileContent 69 | EndProcedure 70 | 71 | Procedure CheckNextToken(List TT.Token(), Match.s) 72 | Protected ReturnValue 73 | If NextElement(TT()) 74 | ReturnValue = Bool(TT()\Token = Match) 75 | PreviousElement(TT()) 76 | EndIf 77 | ProcedureReturn ReturnValue 78 | EndProcedure 79 | 80 | Procedure GetSpiderByteConstants(FileContent.s) 81 | 82 | Protected Lexer.iPBSC = New_PBSC() 83 | 84 | Protected RequestSelect.s 85 | 86 | FileContent = ReplaceString(FileContent, #CRLF$, #LF$) 87 | 88 | Lexer\SetFileString(FileContent) 89 | 90 | NewList TT.Token() 91 | 92 | ; Token einlesen 93 | While Lexer\IsNextToken() 94 | AddElement(TT()) 95 | TT()\Token = Lexer\GetNextToken() 96 | TT()\Type = Lexer\GetCurrentType() 97 | TT()\Line = Lexer\GetCurrentLineNb() 98 | Wend 99 | 100 | PBSC_CloseFile(Lexer) 101 | 102 | Protected ConstantName.s 103 | Protected ConstantValue.s 104 | 105 | ForEach TT() 106 | Select TT()\Type 107 | Case #PBSC_Identifier 108 | If Left(TT()\Token, 1) = "#" 109 | 110 | ConstantName = TT()\Token 111 | NextElement(TT()) 112 | NextElement(TT()) 113 | ConstantValue = TT()\Token 114 | 115 | Select LCase(ConstantName) 116 | 117 | Case "#spiderbite_profile" 118 | SpiderBite_Profile = RemoveString(ConstantValue, Chr(34)) 119 | 120 | Case "#spiderbite_bypass" 121 | 122 | Select LCase(ConstantValue) 123 | Case "1", "#true" 124 | SpiderBite_ByPass = #True 125 | Default 126 | SpiderBite_ByPass = #False 127 | EndSelect 128 | 129 | EndSelect 130 | 131 | EndIf 132 | EndSelect 133 | Next 134 | 135 | EndProcedure 136 | 137 | Procedure.s GetRequestSelect4PbCgi(ServerCode.s) 138 | 139 | Protected regex_Procedure 140 | 141 | Protected CurrentProcedure.s 142 | Protected ProcedureLine.s 143 | 144 | Protected ProcIsString 145 | Protected ParamIsString 146 | 147 | Protected ProcName.s 148 | Protected RequestSelect.s 149 | Protected ParamCounter 150 | 151 | regex_Procedure = CreateRegularExpression(#PB_Any, "^[\t]*[\ ]*ProcedureDLL([\s\S]*?)\(([\s\S]*?)^[\s]*EndProcedure", #PB_RegularExpression_MultiLine | #PB_RegularExpression_NoCase) 152 | 153 | If ExamineRegularExpression(regex_Procedure, ServerCode) 154 | 155 | While NextRegularExpressionMatch(regex_Procedure) 156 | 157 | CurrentProcedure = RegularExpressionMatchString(regex_Procedure) 158 | 159 | ProcName = Trim(RemoveString(CurrentProcedure, "ProcedureDLL", #PB_String_NoCase)) 160 | 161 | ProcIsString = #False 162 | 163 | If Left(ProcName, 2) = ".s" 164 | ProcIsString = #True 165 | ProcName = Trim(Mid(ProcName, 3)) 166 | EndIf 167 | 168 | ProcName = Trim(StringField(ProcName, 1, "(")) 169 | 170 | RequestSelect + #TAB$ + "Case " + Chr(34) + LCase(ProcName) + Chr(34) + #CRLF$ 171 | 172 | If ProcIsString 173 | RequestSelect + #TAB$ + #TAB$ + "ReturnValue = " + ProcName + "(" 174 | Else 175 | RequestSelect + #TAB$ + #TAB$ + "ReturnValue = Str(" + ProcName + "(" 176 | EndIf 177 | 178 | ProcedureLine = StringField(CurrentProcedure, 1, #LF$) 179 | 180 | Protected Parameters.s = ParseParameter(ProcedureLine) 181 | 182 | Protected Parameter.s 183 | 184 | For ParamCounter = 0 To CountString(Parameters, Chr(1)) 185 | 186 | Parameter = Trim(StringField(Parameters, ParamCounter + 1, Chr(1))) 187 | 188 | If Parameter <> "" 189 | 190 | If LCase(Left(Parameter, Len("list"))) = "list" Or 191 | LCase(Left(Parameter, Len("map"))) = "map" Or 192 | Left(Parameter, 1) = "*" 193 | 194 | ProcedureReturn "CompilerError:\n" + ProcName + "\nLists, Maps And Pointers are not allowed (yet)" 195 | 196 | EndIf 197 | 198 | ParamIsString = #False 199 | 200 | Protected P1.s = Trim(StringField(Parameter, 1, "=")) 201 | 202 | If Right(P1, 1) = "$" 203 | ParamIsString = #True 204 | EndIf 205 | 206 | Protected P2.s = Trim(StringField(P1, 2, ".")) 207 | 208 | If LCase(P2) = "s" 209 | ParamIsString = #True 210 | EndIf 211 | 212 | If ParamIsString 213 | RequestSelect + " CGIParameterValue(" + Chr(34) + Chr(34) + ", " + Str(ParamCounter + 1) + "), " 214 | Else 215 | RequestSelect + " Val(CGIParameterValue(" + Chr(34) + Chr(34) + ", " + Str(ParamCounter + 1) + ")), " 216 | EndIf 217 | 218 | EndIf 219 | 220 | Next 221 | 222 | If EndsWith(Trim(RequestSelect), ",") 223 | RequestSelect = Left(Trim(RequestSelect), Len(Trim(RequestSelect)) - 1) 224 | EndIf 225 | 226 | If ProcIsString 227 | RequestSelect + ")" + #CRLF$ 228 | Else 229 | RequestSelect + "))" + #CRLF$ 230 | EndIf 231 | 232 | Wend 233 | 234 | FreeRegularExpression(regex_Procedure) 235 | 236 | EndIf 237 | 238 | If RequestSelect <> "" 239 | 240 | RequestSelect = "Select Request" + #CRLF$ + 241 | RequestSelect + 242 | #TAB$ + "Default" + #CRLF$ + 243 | #TAB$ + #TAB$ + "ReturnValue = " + Chr(34) + "unknown request: '" + Chr(34) + " + Request + " + Chr(34) + "'" + Chr(34) + #CRLF$ + 244 | "EndSelect" 245 | 246 | EndIf 247 | 248 | Debug RequestSelect 249 | 250 | ProcedureReturn RequestSelect 251 | 252 | EndProcedure 253 | Procedure.s GetRequestSelect4Asp(ServerCode.s) 254 | 255 | Protected regex_Procedure 256 | 257 | Protected CurrentProcedure.s 258 | Protected ProcedureLine.s 259 | 260 | Protected ProcName.s 261 | Protected RequestSelect.s 262 | Protected ParamCounter 263 | 264 | regex_Procedure = CreateRegularExpression(#PB_Any, "^[\t]*[\ ]*ProcedureDLL([\s\S]*?)\(([\s\S]*?)^[\s]*EndProcedure", #PB_RegularExpression_MultiLine | #PB_RegularExpression_NoCase) 265 | 266 | If ExamineRegularExpression(regex_Procedure, ServerCode) 267 | 268 | While NextRegularExpressionMatch(regex_Procedure) 269 | 270 | CurrentProcedure = RegularExpressionMatchString(regex_Procedure) 271 | 272 | ProcName = Trim(RemoveString(CurrentProcedure, "ProcedureDLL", #PB_String_NoCase)) 273 | 274 | If Left(ProcName, 2) = ".s" 275 | ProcName = Trim(Mid(ProcName, 3)) 276 | EndIf 277 | 278 | ProcName = Trim(StringField(ProcName, 1, "(")) 279 | 280 | RequestSelect + #TAB$ + #TAB$ + "Case " + Chr(34) + LCase(ProcName) + Chr(34) + #CRLF$ 281 | 282 | RequestSelect + #TAB$ + #TAB$ + #TAB$ + "Response.Write " + ProcName + "(" 283 | 284 | ProcedureLine = StringField(CurrentProcedure, 1, #LF$) 285 | 286 | Protected Parameters.s = ParseParameter(ProcedureLine) 287 | 288 | Protected Parameter.s 289 | 290 | For ParamCounter = 0 To CountString(Parameters, Chr(1)) 291 | 292 | Parameter = Trim(StringField(Parameters, ParamCounter + 1, Chr(1))) 293 | 294 | If Parameter <> "" 295 | 296 | If LCase(Left(Parameter, Len("list"))) = "list" Or 297 | LCase(Left(Parameter, Len("map"))) = "map" Or 298 | Left(Parameter, 1) = "*" 299 | 300 | ProcedureReturn "CompilerError:\n" + ProcName + "\nLists, Maps And Pointers are not allowed (yet)" 301 | 302 | EndIf 303 | 304 | RequestSelect + "Request.Form(" + Str(ParamCounter + 2) + "), " 305 | 306 | EndIf 307 | 308 | Next 309 | 310 | If EndsWith(Trim(RequestSelect), ",") 311 | RequestSelect = Left(Trim(RequestSelect), Len(Trim(RequestSelect)) - 1) 312 | EndIf 313 | 314 | RequestSelect + ")" + #CRLF$ 315 | 316 | Wend 317 | 318 | FreeRegularExpression(regex_Procedure) 319 | 320 | EndIf 321 | 322 | If RequestSelect <> "" 323 | 324 | RequestSelect = "If Request.ServerVariables(" + Chr(34) + "REQUEST_METHOD" + Chr(34) + ")= " + Chr(34) + "POST" + Chr(34) + " Then" + #CRLF$ + 325 | "" + #CRLF$ + 326 | #TAB$ + "Dim myRequest" + #CRLF$ + 327 | #TAB$ + "myRequest = LCase(Request.Form(1))" + #CRLF$ + 328 | "" + #CRLF$ + 329 | #TAB$ + "Select Case myRequest" + #CRLF$ + 330 | RequestSelect + 331 | #TAB$ + #TAB$ + "Case Else" + #CRLF$ + 332 | #TAB$ + #TAB$ + #TAB$ + "Response.Write " + Chr(34) + "unknown request: '" + Chr(34) + " & myRequest & " + Chr(34) + "'" + Chr(34) + #CRLF$ + 333 | #TAB$ + "End Select" + #CRLF$ + 334 | "" + #CRLF$ + 335 | "End If" 336 | 337 | EndIf 338 | 339 | Debug RequestSelect 340 | 341 | ProcedureReturn RequestSelect 342 | 343 | EndProcedure 344 | Procedure.s GetRequestSelect4PHP(ServerCode.s) 345 | 346 | Protected regex_Procedure 347 | 348 | Protected CurrentProcedure.s 349 | Protected ProcedureLine.s 350 | 351 | Protected ProcName.s 352 | Protected RequestSelect.s 353 | Protected ParamCounter 354 | 355 | regex_Procedure = CreateRegularExpression(#PB_Any, "^[\t]*[\ ]*ProcedureDLL([\s\S]*?)\(([\s\S]*?)^[\s]*EndProcedure", #PB_RegularExpression_MultiLine | #PB_RegularExpression_NoCase) 356 | 357 | If ExamineRegularExpression(regex_Procedure, ServerCode) 358 | 359 | While NextRegularExpressionMatch(regex_Procedure) 360 | 361 | CurrentProcedure = RegularExpressionMatchString(regex_Procedure) 362 | 363 | ProcName = Trim(RemoveString(CurrentProcedure, "ProcedureDLL", #PB_String_NoCase)) 364 | 365 | If Left(ProcName, 2) = ".s" 366 | ProcName = Trim(Mid(ProcName, 3)) 367 | EndIf 368 | 369 | ProcName = Trim(StringField(ProcName, 1, "(")) 370 | 371 | RequestSelect + #TAB$ + "case " + Chr(34) + LCase(ProcName) + Chr(34) + ":" + #CRLF$ 372 | 373 | RequestSelect + #TAB$ + #TAB$ + "$ReturnValue = " + ProcName + "(" 374 | 375 | ProcedureLine = StringField(CurrentProcedure, 1, #LF$) 376 | 377 | Protected Parameters.s = ParseParameter(ProcedureLine) 378 | 379 | Protected Parameter.s 380 | 381 | For ParamCounter = 0 To CountString(Parameters, Chr(1)) 382 | 383 | Parameter = Trim(StringField(Parameters, ParamCounter + 1, Chr(1))) 384 | 385 | If Parameter <> "" 386 | 387 | If LCase(Left(Parameter, Len("list"))) = "list" Or 388 | LCase(Left(Parameter, Len("map"))) = "map" Or 389 | Left(Parameter, 1) = "*" 390 | 391 | ProcedureReturn "CompilerError:\n" + ProcName + "\nLists, Maps And Pointers are not allowed (yet)" 392 | 393 | EndIf 394 | 395 | RequestSelect + " $_POST(" + Str(ParamCounter + 1) + "), " 396 | 397 | EndIf 398 | 399 | Next 400 | 401 | If EndsWith(Trim(RequestSelect), ",") 402 | RequestSelect = Left(Trim(RequestSelect), Len(Trim(RequestSelect)) - 1) 403 | EndIf 404 | 405 | RequestSelect + ");" + #CRLF$ 406 | RequestSelect + #TAB$ + #TAB$ + "break;" + #CRLF$ 407 | 408 | Wend 409 | 410 | FreeRegularExpression(regex_Procedure) 411 | 412 | EndIf 413 | 414 | If RequestSelect <> "" 415 | 416 | RequestSelect = "switch ($request) {" + #CRLF$ + 417 | RequestSelect + 418 | #TAB$ + "default:" + #CRLF$ + 419 | #TAB$ + #TAB$ + "$ReturnValue = " + Chr(34) + "unknown request: '" + Chr(34) + " . $request . " + Chr(34) + "'" + Chr(34) + ";" + #CRLF$ + 420 | #TAB$ + #TAB$ + "break;" + #CRLF$ + 421 | "}" 422 | 423 | EndIf 424 | 425 | ; Debug RequestSelect 426 | 427 | ProcedureReturn RequestSelect 428 | 429 | EndProcedure 430 | Procedure.s GetRequestSelect4Aspx(ServerCode.s) 431 | 432 | Protected regex_Procedure 433 | 434 | Protected CurrentProcedure.s 435 | Protected ProcedureLine.s 436 | 437 | Protected ProcName.s 438 | Protected RequestSelect.s 439 | Protected ParamCounter 440 | 441 | regex_Procedure = CreateRegularExpression(#PB_Any, "^[\t]*[\ ]*ProcedureDLL([\s\S]*?)\(([\s\S]*?)^[\s]*EndProcedure", #PB_RegularExpression_MultiLine | #PB_RegularExpression_NoCase) 442 | 443 | If ExamineRegularExpression(regex_Procedure, ServerCode) 444 | 445 | While NextRegularExpressionMatch(regex_Procedure) 446 | 447 | CurrentProcedure = RegularExpressionMatchString(regex_Procedure) 448 | 449 | ProcName = Trim(RemoveString(CurrentProcedure, "ProcedureDLL", #PB_String_NoCase)) 450 | 451 | If Left(ProcName, 2) = ".s" 452 | ProcName = Trim(Mid(ProcName, 3)) 453 | EndIf 454 | 455 | ProcName = Trim(StringField(ProcName, 1, "(")) 456 | 457 | RequestSelect + #TAB$ + "Case " + Chr(34) + LCase(ProcName) + Chr(34) + #CRLF$ 458 | 459 | RequestSelect + #TAB$ + #TAB$ + "ReturnValue = " + ProcName + "(" 460 | 461 | ProcedureLine = StringField(CurrentProcedure, 1, #LF$) 462 | 463 | Protected Parameters.s = ParseParameter(ProcedureLine) 464 | 465 | Protected Parameter.s 466 | 467 | For ParamCounter = 0 To CountString(Parameters, Chr(1)) 468 | 469 | Parameter = Trim(StringField(Parameters, ParamCounter + 1, Chr(1))) 470 | 471 | If Parameter <> "" 472 | 473 | If LCase(Left(Parameter, Len("list"))) = "list" Or 474 | LCase(Left(Parameter, Len("map"))) = "map" Or 475 | Left(Parameter, 1) = "*" 476 | 477 | ProcedureReturn "CompilerError:\n" + ProcName + "\nLists, Maps And Pointers are not allowed (yet)" 478 | 479 | EndIf 480 | 481 | RequestSelect + "Request.Form(" + Str(ParamCounter + 1) + "), " 482 | 483 | EndIf 484 | 485 | Next 486 | 487 | If EndsWith(Trim(RequestSelect), ",") 488 | RequestSelect = Left(Trim(RequestSelect), Len(Trim(RequestSelect)) - 1) 489 | EndIf 490 | 491 | RequestSelect + ")" + #CRLF$ 492 | 493 | Wend 494 | 495 | FreeRegularExpression(regex_Procedure) 496 | 497 | EndIf 498 | 499 | If RequestSelect <> "" 500 | 501 | RequestSelect = "Dim myRequest = LCase(Request.Form(0))" + #CRLF$ + 502 | "Select Case myRequest" + #CRLF$ + 503 | RequestSelect + 504 | #TAB$ + "Case Else" + #CRLF$ + 505 | #TAB$ + #TAB$ + "ReturnValue = " + Chr(34) + "unknown request: '" + Chr(34) + " & myRequest & " + Chr(34) + "'" + Chr(34) + #CRLF$ + 506 | "End Select" 507 | 508 | EndIf 509 | 510 | ; Debug RequestSelect 511 | 512 | ProcedureReturn RequestSelect 513 | 514 | EndProcedure 515 | 516 | 517 | Procedure.s ConvertToPbCgi(Code.s) 518 | ProcedureReturn Code 519 | EndProcedure 520 | Procedure.s ConvertToAspx(Code.s) 521 | 522 | Code = #LF$ + Code 523 | 524 | Protected Lexer.iPBSC = New_PBSC() 525 | 526 | Protected RequestSelect.s 527 | 528 | Code = ReplaceString(Code, #CRLF$, #LF$) 529 | 530 | Lexer\SetFileString(Code) 531 | 532 | NewList TT.Token() 533 | 534 | ; Token einlesen 535 | While Lexer\IsNextToken() 536 | AddElement(TT()) 537 | TT()\Token = Lexer\GetNextToken() 538 | TT()\Type = Lexer\GetCurrentType() 539 | TT()\Line = Lexer\GetCurrentLineNb() 540 | Wend 541 | 542 | PBSC_CloseFile(Lexer) 543 | 544 | Protected inProcedure 545 | 546 | ForEach TT() 547 | Select TT()\Type 548 | Case #PBSC_Identifier 549 | Select LCase(TT()\Token) 550 | Case "proceduredll" 551 | 552 | TT()\Token = "Public Shared Function" 553 | 554 | inProcedure = #True 555 | 556 | If CheckNextToken(TT(), ".") 557 | NextElement(TT()) : TT()\Token = "" 558 | NextElement(TT()) : TT()\Token = "" 559 | EndIf 560 | 561 | NextElement(TT()) 562 | 563 | ; TT()\Token = LCase(TT()\Token) 564 | 565 | Case "endprocedure" 566 | TT()\Token = "End Function" 567 | EndSelect 568 | Case #PBSC_NewLine, #PBSC_Comment 569 | inProcedure = #False 570 | Default 571 | If inProcedure 572 | If TT()\Token = "." 573 | TT()\Token = "" 574 | NextElement(TT()) 575 | TT()\Token = "" 576 | EndIf 577 | EndIf 578 | If TT()\Token = "!" 579 | TT()\Token = "" 580 | EndIf 581 | EndSelect 582 | Next 583 | 584 | Code = "" 585 | 586 | ForEach TT() 587 | If CheckNextToken(TT(), ".") 588 | Code + TT()\Token 589 | ElseIf TT()\Token = "." 590 | Code + TT()\Token 591 | Else 592 | Code + TT()\Token + " " 593 | EndIf 594 | Next 595 | 596 | ProcedureReturn Code 597 | 598 | EndProcedure 599 | Procedure.s ConvertToPHP(Code.s) 600 | 601 | Code = #LF$ + Code 602 | 603 | Protected Lexer.iPBSC = New_PBSC() 604 | 605 | Protected RequestSelect.s 606 | 607 | Code = ReplaceString(Code, #CRLF$, #LF$) 608 | 609 | Lexer\SetFileString(Code) 610 | 611 | NewList TT.Token() 612 | 613 | ; Token einlesen 614 | While Lexer\IsNextToken() 615 | AddElement(TT()) 616 | TT()\Token = Lexer\GetNextToken() 617 | TT()\Type = Lexer\GetCurrentType() 618 | TT()\Line = Lexer\GetCurrentLineNb() 619 | Wend 620 | 621 | PBSC_CloseFile(Lexer) 622 | 623 | Protected inProcedure 624 | 625 | ForEach TT() 626 | Select TT()\Type 627 | 628 | Case #PBSC_Identifier 629 | 630 | Select LCase(TT()\Token) 631 | Case "proceduredll" 632 | TT()\Token = "function" 633 | inProcedure = #True 634 | Case "endprocedure" 635 | TT()\Token = "}" 636 | EndSelect 637 | 638 | Case #PBSC_NewLine 639 | 640 | If inProcedure 641 | TT()\Token = "{" + TT()\Token 642 | EndIf 643 | 644 | inProcedure = #False 645 | 646 | If CheckNextToken(TT(), "!") 647 | NextElement(TT()) 648 | TT()\Token = "" 649 | EndIf 650 | 651 | Case #PBSC_Comment 652 | 653 | If inProcedure 654 | TT()\Token = "{ //" + Mid(TT()\Token, 2) 655 | EndIf 656 | 657 | inProcedure = #False 658 | 659 | Default 660 | If inProcedure 661 | Select TT()\Token 662 | Case "." 663 | TT()\Token = "" 664 | NextElement(TT()) 665 | TT()\Token = "" 666 | Case "(" 667 | NextElement(TT()) 668 | If TT()\Token <> ")" 669 | TT()\Token = "$" + TT()\Token 670 | EndIf 671 | Case "," 672 | NextElement(TT()) 673 | TT()\Token = "$" + TT()\Token 674 | EndSelect 675 | EndIf 676 | EndSelect 677 | Next 678 | 679 | 680 | 681 | Code = "" 682 | 683 | ForEach TT() 684 | If CheckNextToken(TT(), ".") 685 | Code + TT()\Token 686 | ElseIf CheckNextToken(TT(), ":") 687 | Code + TT()\Token 688 | ElseIf CheckNextToken(TT(), "/") 689 | Code + TT()\Token 690 | ElseIf TT()\Token = "." 691 | Code + TT()\Token 692 | ElseIf TT()\Token = "/" 693 | Code + TT()\Token 694 | ElseIf TT()\Token = "!" 695 | Code + TT()\Token 696 | ElseIf TT()\Token = ":" 697 | Code + TT()\Token 698 | ElseIf TT()\Token = "$" 699 | Code + TT()\Token 700 | ElseIf TT()\Token = "-" And CheckNextToken(TT(), ">") 701 | Code + TT()\Token 702 | ElseIf TT()\Token = "=" And CheckNextToken(TT(), ">") 703 | Code + TT()\Token 704 | ElseIf TT()\Token = "=" And CheckNextToken(TT(), "=") 705 | Code + TT()\Token 706 | ElseIf TT()\Token = "&" And CheckNextToken(TT(), "&") 707 | Code + TT()\Token 708 | Else 709 | If TT()\Type = #PBSC_Number 710 | Code + TT()\Token 711 | Else 712 | Code + TT()\Token + " " 713 | EndIf 714 | EndIf 715 | Next 716 | 717 | ProcedureReturn Code 718 | 719 | EndProcedure 720 | Procedure.s ConvertToASP(Code.s) 721 | 722 | Code = #LF$ + Code 723 | 724 | Protected Lexer.iPBSC = New_PBSC() 725 | 726 | Protected RequestSelect.s 727 | 728 | Code = ReplaceString(Code, #CRLF$, #LF$) 729 | 730 | Lexer\SetFileString(Code) 731 | 732 | NewList TT.Token() 733 | 734 | ; Token einlesen 735 | While Lexer\IsNextToken() 736 | AddElement(TT()) 737 | TT()\Token = Lexer\GetNextToken() 738 | TT()\Type = Lexer\GetCurrentType() 739 | TT()\Line = Lexer\GetCurrentLineNb() 740 | Wend 741 | 742 | PBSC_CloseFile(Lexer) 743 | 744 | Protected inProcedure 745 | 746 | ForEach TT() 747 | Select TT()\Type 748 | Case #PBSC_Identifier 749 | Select LCase(TT()\Token) 750 | Case "proceduredll" 751 | TT()\Token = "Function" 752 | inProcedure = #True 753 | Case "endprocedure" 754 | TT()\Token = "End Function" 755 | EndSelect 756 | Case #PBSC_NewLine, #PBSC_Comment 757 | inProcedure = #False 758 | Default 759 | If inProcedure 760 | If TT()\Token = "." 761 | TT()\Token = "" 762 | NextElement(TT()) 763 | TT()\Token = "" 764 | EndIf 765 | EndIf 766 | If TT()\Token = "!" 767 | TT()\Token = "" 768 | EndIf 769 | EndSelect 770 | Next 771 | 772 | 773 | 774 | Code = "" 775 | 776 | ForEach TT() 777 | If CheckNextToken(TT(), ".") 778 | Code + TT()\Token 779 | ElseIf TT()\Token = "." 780 | Code + TT()\Token 781 | Else 782 | Code + TT()\Token + " " 783 | EndIf 784 | Next 785 | 786 | ProcedureReturn Code 787 | 788 | EndProcedure 789 | Procedure.s ConvertToNodeJs(Code.s) 790 | 791 | Code = #LF$ + Code 792 | 793 | NewList ProcedureName.s() 794 | 795 | Dim TempArray.s(0) 796 | Split(TempArray(), Code, #LF$) 797 | Protected Counter 798 | For Counter = 0 To ArraySize(TempArray()) 799 | TempArray(Counter) = TrimChars(TempArray(Counter)) 800 | If StartsWith(LCase(TempArray(Counter)), "proceduredll") 801 | 802 | AddElement(ProcedureName()) 803 | ProcedureName() = ReplaceString(TempArray(Counter), "ProcedureDLL.s ", "", #PB_String_NoCase) 804 | ProcedureName() = Left(ProcedureName(), FindString(ProcedureName(), "(") - 1) 805 | 806 | TempArray(Counter) = "" 807 | 808 | EndIf 809 | If StartsWith(LCase(TempArray(Counter)), "endprocedure") 810 | TempArray(Counter) = "" 811 | EndIf 812 | If StartsWith(TempArray(Counter), "!") 813 | TempArray(Counter) = Mid(TempArray(Counter), 2) 814 | EndIf 815 | Next 816 | 817 | Code = " var PB2NodeJsFunctions = { }; " 818 | Code + Join(TempArray(), #LF$) 819 | ForEach ProcedureName() 820 | Code + "PB2NodeJsFunctions." + ProcedureName() + " = " + ProcedureName() + ";" + #LF$ 821 | Next 822 | 823 | ; Debug "ServerCode:>>>" + #LF$ + Code + #LF$ + "<<<" 824 | 825 | ProcedureReturn Code 826 | 827 | EndProcedure 828 | Procedure.s ConvertToPython(Code.s) 829 | 830 | Code = #LF$ + Code 831 | 832 | Protected Lexer.iPBSC = New_PBSC() 833 | 834 | Protected RequestSelect.s 835 | 836 | Code = ReplaceString(Code, #CRLF$, #LF$) 837 | 838 | ; Whitespaces are important! 839 | Code = ReplaceString(Code, " ", Chr(1)) 840 | Code = ReplaceString(Code, #TAB$, Chr(2)) 841 | 842 | Lexer\SetFileString(Code) 843 | 844 | NewList TT.Token() 845 | 846 | ; Token einlesen 847 | While Lexer\IsNextToken() 848 | AddElement(TT()) 849 | TT()\Token = Lexer\GetNextToken() 850 | TT()\Type = Lexer\GetCurrentType() 851 | TT()\Line = Lexer\GetCurrentLineNb() 852 | Wend 853 | 854 | PBSC_CloseFile(Lexer) 855 | 856 | Protected inProcedure 857 | NewList vars.s() 858 | Protected ProcName.s 859 | ForEach TT() 860 | Select TT()\Type 861 | 862 | Case #PBSC_Identifier 863 | 864 | Select LCase(TT()\Token) 865 | 866 | Case "proceduredll", "procedurecdll" 867 | 868 | TT()\Token = "def " 869 | 870 | Define LI = ListIndex(TT()) 871 | 872 | Repeat 873 | NextElement(TT()) 874 | If TT()\Token = "(" 875 | Break 876 | EndIf 877 | ForEver 878 | Repeat 879 | PreviousElement(TT()) 880 | If TT()\Token <> Chr(1) And TT()\Token <> Chr(2) 881 | Break 882 | EndIf 883 | ForEver 884 | 885 | ProcName = TT()\Token 886 | 887 | SelectElement(TT(), LI) 888 | 889 | TT()\Token = "@app.route('/" + ProcName + "', methods=['POST'])" + #LF$ + TT()\Token 890 | 891 | inProcedure = #True 892 | 893 | Case "endprocedure" 894 | TT()\Token = "" 895 | ClearList(vars()) 896 | EndSelect 897 | 898 | Case #PBSC_NewLine 899 | 900 | If inProcedure 901 | 902 | TT()\Token = ":" + TT()\Token 903 | 904 | ForEach vars() 905 | TT()\Token + " " + vars() + " = request.form.get('" + Str(ListIndex(vars())) + "')" + #LF$ 906 | Next 907 | 908 | ClearList(vars()) 909 | 910 | EndIf 911 | 912 | inProcedure = #False 913 | 914 | Case #PBSC_Comment 915 | 916 | If inProcedure 917 | 918 | TT()\Token = ": #" + Mid(TT()\Token, 2) 919 | 920 | ForEach vars() 921 | TT()\Token + " " + vars() + " = request.form.get('" + Str(ListIndex(vars())) + "')" + #LF$ 922 | Next 923 | 924 | ClearList(vars()) 925 | 926 | EndIf 927 | 928 | inProcedure = #False 929 | 930 | Default 931 | If inProcedure 932 | Select TT()\Token 933 | Case "." 934 | TT()\Token = "" 935 | NextElement(TT()) 936 | TT()\Token = "" 937 | Case "(" 938 | NextElement(TT()) 939 | If TT()\Token <> ")" 940 | AddElement(vars()) 941 | vars() = TT()\Token 942 | TT()\Token = "" 943 | EndIf 944 | Case "," 945 | TT()\Token = "" 946 | NextElement(TT()) 947 | AddElement(vars()) 948 | vars() = TT()\Token 949 | TT()\Token = "" 950 | EndSelect 951 | EndIf 952 | If TT()\Token = "!" 953 | TT()\Token = "" 954 | EndIf 955 | EndSelect 956 | Next 957 | 958 | 959 | 960 | Code = "" 961 | 962 | ForEach TT() 963 | Code + TT()\Token 964 | Next 965 | 966 | Code = ReplaceString(Code, Chr(1), " ") 967 | Code = ReplaceString(Code, Chr(2), #TAB$) 968 | 969 | Debug "ServerCode:>>>" + #LF$ + Code + #LF$ + "<<<" 970 | 971 | ProcedureReturn Code 972 | 973 | EndProcedure 974 | 975 | Procedure.s RemoveCodeIdentifier(CodeBlock.s, ServerCodeType.s) 976 | 977 | CodeBlock = Mid(CodeBlock, FindString(CodeBlock, "Enable" + ServerCodeType, 1, #PB_String_NoCase) + Len("Enable" + ServerCodeType)) 978 | 979 | CodeBlock = Left(CodeBlock, FindString(CodeBlock, "Disable" + ServerCodeType, 1, #PB_String_NoCase) - 1) 980 | 981 | ProcedureReturn CodeBlock 982 | 983 | EndProcedure 984 | 985 | Procedure.s GetParentPath(Path.s) 986 | 987 | Protected ParentPath.s 988 | Protected Counter 989 | Protected PathSeparator.s 990 | 991 | If FindString(Path, "\") 992 | PathSeparator = "\" 993 | ElseIf FindString(Path, "/") 994 | PathSeparator = "/" 995 | Else 996 | ProcedureReturn ParentPath 997 | EndIf 998 | 999 | For Counter = 1 To CountString(Path, PathSeparator) - 1 1000 | ParentPath + StringField(Path, Counter, PathSeparator) + PathSeparator 1001 | Next 1002 | 1003 | ProcedureReturn ParentPath 1004 | 1005 | EndProcedure 1006 | 1007 | Procedure.s ProcessServerCode(FileContent.s, ServerCodeType.s) 1008 | 1009 | ;{ 1010 | 1011 | If FindString(FileContent, "Enable" + ServerCodeType, 1, #PB_String_NoCase) = 0 1012 | ProcedureReturn FileContent 1013 | EndIf 1014 | 1015 | Protected ServerFilename.s 1016 | Protected ServerAddress.s 1017 | Protected TemplateFilename.s 1018 | 1019 | Select ServerCodeType 1020 | 1021 | Case #ServerCodeType_Asp 1022 | ServerAddress = SpiderBiteCfg(SpiderBite_Profile)\AspServerAddress 1023 | ServerFilename = SpiderBiteCfg(SpiderBite_Profile)\AspServerFilename 1024 | 1025 | If SpiderBiteCfg(SpiderBite_Profile)\AspTemplate = "" 1026 | SpiderBiteCfg(SpiderBite_Profile)\AspTemplate = GetExePath() + "system/templates/asp.asp" 1027 | EndIf 1028 | 1029 | TemplateFilename = SpiderBiteCfg(SpiderBite_Profile)\AspTemplate 1030 | 1031 | Case #ServerCodeType_Aspx 1032 | ServerAddress = SpiderBiteCfg(SpiderBite_Profile)\AspxServerAddress 1033 | ServerFilename = SpiderBiteCfg(SpiderBite_Profile)\AspxServerFilename 1034 | 1035 | If SpiderBiteCfg(SpiderBite_Profile)\AspxTemplate = "" 1036 | SpiderBiteCfg(SpiderBite_Profile)\AspxTemplate = GetExePath() + "system/templates/aspx.aspx" 1037 | EndIf 1038 | 1039 | TemplateFilename = SpiderBiteCfg(SpiderBite_Profile)\AspxTemplate 1040 | 1041 | Case #ServerCodeType_PbCgi 1042 | 1043 | If FileSize(SpiderBiteCfg(SpiderBite_Profile)\PbCompiler) = -1 1044 | FileContent = AddCompilerError(FileContent, "PbCompiler not set") 1045 | ProcedureReturn FileContent 1046 | EndIf 1047 | 1048 | ServerAddress = SpiderBiteCfg(SpiderBite_Profile)\PbCgiServerAddress 1049 | ServerFilename = SpiderBiteCfg(SpiderBite_Profile)\PbCgiServerFilename 1050 | 1051 | If SpiderBiteCfg(SpiderBite_Profile)\PbCgiTemplate = "" 1052 | SpiderBiteCfg(SpiderBite_Profile)\PbCgiTemplate = GetExePath() + "system/templates/cgi.pb" 1053 | EndIf 1054 | 1055 | TemplateFilename = SpiderBiteCfg(SpiderBite_Profile)\PbCgiTemplate 1056 | 1057 | Case #ServerCodeType_Php 1058 | ServerAddress = SpiderBiteCfg(SpiderBite_Profile)\PhpServerAddress 1059 | ServerFilename = SpiderBiteCfg(SpiderBite_Profile)\PhpServerFilename 1060 | 1061 | If SpiderBiteCfg(SpiderBite_Profile)\PhpTemplate = "" 1062 | SpiderBiteCfg(SpiderBite_Profile)\PhpTemplate = GetExePath() + "system/templates/php.php" 1063 | EndIf 1064 | 1065 | TemplateFilename = SpiderBiteCfg(SpiderBite_Profile)\PhpTemplate 1066 | 1067 | Case #ServerCodeType_NodeJs 1068 | FileContent = AddCompilerWarning(FileContent, "NodeJs is not supported (yet)") 1069 | 1070 | Case #ServerCodeType_Python 1071 | 1072 | ServerAddress = SpiderBiteCfg(SpiderBite_Profile)\PythonServerAddress 1073 | ServerFilename = SpiderBiteCfg(SpiderBite_Profile)\PythonServerFilename 1074 | 1075 | If SpiderBiteCfg(SpiderBite_Profile)\PythonTemplate = "" 1076 | SpiderBiteCfg(SpiderBite_Profile)\PythonTemplate = GetExePath() + "system/templates/python.py" 1077 | EndIf 1078 | 1079 | TemplateFilename = SpiderBiteCfg(SpiderBite_Profile)\PythonTemplate 1080 | 1081 | EndSelect 1082 | 1083 | If ServerAddress = "" 1084 | FileContent = AddCompilerError(FileContent, "ServerAddress for " + ServerCodeType + " is empty!") 1085 | ProcedureReturn FileContent 1086 | EndIf 1087 | 1088 | If ServerFilename = "" 1089 | FileContent = AddCompilerError(FileContent, "ServerFilename for " + ServerCodeType + " is empty!") 1090 | ProcedureReturn FileContent 1091 | EndIf 1092 | 1093 | If FileSize(GetPathPart(ServerFilename)) <> -2 1094 | FileContent = AddCompilerError(FileContent, "Folder '" + GetPathPart(ServerFilename) + "' doesn't exist") 1095 | ProcedureReturn FileContent 1096 | EndIf 1097 | 1098 | If TemplateFilename = "" 1099 | FileContent = AddCompilerError(FileContent, "TemplateFilename for " + ServerCodeType + " is empty!") 1100 | ProcedureReturn FileContent 1101 | EndIf 1102 | 1103 | ;} 1104 | 1105 | Protected CodeBlock.s 1106 | Protected ClientProcedures.s = "" 1107 | Protected ServerCode.s 1108 | Protected CurrentProcedure.s 1109 | 1110 | Protected regex_SC 1111 | Protected regex_P 1112 | 1113 | regex_SC = CreateRegularExpression(#PB_Any, "^[\t]*[\ ]*Enable" + ServerCodeType + "([\s\S]*?)\(([\s\S]*?)^[\s]*Disable" + ServerCodeType + "", #PB_RegularExpression_MultiLine | #PB_RegularExpression_NoCase) 1114 | 1115 | ExamineRegularExpression(regex_SC, FileContent) 1116 | 1117 | While NextRegularExpressionMatch(regex_SC) 1118 | 1119 | CodeBlock = RegularExpressionMatchString(regex_SC) 1120 | 1121 | regex_P = CreateRegularExpression(#PB_Any, "^[\t]*[\ ]*ProcedureDLL([\s\S]*?)\(([\s\S]*?)^[\s]*EndProcedure", #PB_RegularExpression_MultiLine | #PB_RegularExpression_NoCase) 1122 | 1123 | ExamineRegularExpression(regex_P, CodeBlock) 1124 | 1125 | While NextRegularExpressionMatch(regex_P) 1126 | 1127 | CurrentProcedure = RegularExpressionMatchString(regex_P) 1128 | 1129 | If LCase(Left(Trim(CurrentProcedure), Len("ProcedureDLL"))) = "proceduredll" 1130 | CurrentProcedure = ReplaceString(CurrentProcedure, "ProcedureDLL", "Procedure", #PB_String_NoCase) 1131 | EndIf 1132 | 1133 | ClientProcedures + StringField(CurrentProcedure, 1, #LF$) + #LF$ 1134 | 1135 | Protected dataType.s 1136 | Protected processData.s 1137 | 1138 | dataType = "text" 1139 | processData = "true" 1140 | 1141 | Protected CallbackProcedure.s 1142 | 1143 | CurrentProcedure = Trim(StringField(CurrentProcedure, 1, "(")) 1144 | 1145 | CurrentProcedure = Trim(StringField(CurrentProcedure, CountString(CurrentProcedure, " ") + 1, " ")) 1146 | 1147 | CallbackProcedure = "f_" + LCase(CurrentProcedure) + "callback" 1148 | 1149 | ClientProcedures + " ! var returnValue; " + #LF$ + 1150 | " ! [].unshift.call(arguments, '" + CurrentProcedure + "'); " + #LF$ + 1151 | " ! var async; " + #LF$ + 1152 | " ! var successFunction; " + #LF$ + 1153 | " ! var errorFunction; " + #LF$ + 1154 | " ! if (typeof " + CallbackProcedure + " == 'function') { " + #LF$ + 1155 | " ! async = true; " + #LF$ + 1156 | " ! successFunction = function(result) { " + CallbackProcedure + "(true, result); }; " + #LF$ + 1157 | " ! errorFunction = function(a,b,c) { " + CallbackProcedure + "(false, b + '/' + c); }; " + #LF$ + 1158 | " ! } else { " + #LF$ + 1159 | " ! async = false; " + #LF$ + 1160 | " ! successFunction = function(result) { returnValue = result; };" + #LF$ + 1161 | " ! errorFunction = function(a,b,c) { returnValue = 'error: ' + b + '/' + c; };" + #LF$ + 1162 | " ! }" + #LF$ + 1163 | " ! $.ajax({ " + #LF$ + 1164 | " ! url: '" + ServerAddress + "', " + #LF$ + 1165 | " ! type: 'POST', " + #LF$ + 1166 | " ! data: arguments, " + #LF$ + 1167 | " ! dataType: '" + dataType + "', " + #LF$ + 1168 | " ! processData: " + processData + ", " + #LF$ + 1169 | " ! async: async, " + #LF$ + 1170 | " ! cache: false, " + #LF$ + 1171 | " ! success: successFunction, " + #LF$ + 1172 | " ! error: errorFunction " + #LF$ + 1173 | " ! }); " + #LF$ + 1174 | " ! return returnValue; " + #LF$ + 1175 | "EndProcedure" + #LF$ 1176 | 1177 | Wend 1178 | 1179 | FreeRegularExpression(regex_P) 1180 | 1181 | FileContent = ReplaceString(FileContent, CodeBlock, ClientProcedures) 1182 | 1183 | ServerCode + RemoveCodeIdentifier(CodeBlock, ServerCodeType) + #LF$ 1184 | 1185 | Wend 1186 | 1187 | FreeRegularExpression(regex_SC) 1188 | 1189 | ;{ 1190 | 1191 | If ServerCode <> "" 1192 | 1193 | If SpiderBite_ByPass = #False 1194 | 1195 | Protected RequestSelect.s 1196 | Protected TemplateCode.s 1197 | 1198 | Select ServerCodeType 1199 | 1200 | Case #ServerCodeType_Asp 1201 | 1202 | RequestSelect = GetRequestSelect4ASP(ServerCode) 1203 | 1204 | If Left(RequestSelect, Len("CompilerError")) = "CompilerError" 1205 | 1206 | FileContent = AddCompilerError(FileContent, Mid(RequestSelect, Len("CompilerError") + 3)) 1207 | 1208 | Else 1209 | 1210 | ServerCode = ConvertToASP(ServerCode) 1211 | TemplateCode = LoadTextFile(TemplateFilename) 1212 | TemplateCode = ReplaceString(TemplateCode, "' ### ServerCode ###", ServerCode) 1213 | TemplateCode = ReplaceString(TemplateCode, "' ### RequestSelect ###", RequestSelect) 1214 | SaveTextFile(TemplateCode, ServerFilename) 1215 | 1216 | EndIf 1217 | 1218 | Case #ServerCodeType_Aspx 1219 | 1220 | RequestSelect = GetRequestSelect4Aspx(ServerCode) 1221 | 1222 | If Left(RequestSelect, Len("CompilerError")) = "CompilerError" 1223 | 1224 | FileContent = AddCompilerError(FileContent, Mid(RequestSelect, Len("CompilerError") + 3)) 1225 | 1226 | Else 1227 | 1228 | ServerCode = ConvertToAspx(ServerCode) 1229 | TemplateCode = LoadTextFile(TemplateFilename) 1230 | TemplateCode = ReplaceString(TemplateCode, "' ### ServerCode ###", ServerCode) 1231 | TemplateCode = ReplaceString(TemplateCode, "' ### RequestSelect ###", RequestSelect) 1232 | SaveTextFile(TemplateCode, ServerFilename) 1233 | 1234 | EndIf 1235 | 1236 | Case #ServerCodeType_PbCgi 1237 | 1238 | RequestSelect = GetRequestSelect4PbCgi(ServerCode) 1239 | 1240 | If Left(RequestSelect, Len("CompilerError")) = "CompilerError" 1241 | 1242 | FileContent = AddCompilerError(FileContent, Mid(RequestSelect, Len("CompilerError") + 3)) 1243 | 1244 | Else 1245 | 1246 | ServerCode = ConvertToPbCgi(ServerCode) 1247 | TemplateCode = LoadTextFile(TemplateFilename) 1248 | TemplateCode = ReplaceString(TemplateCode, "; ### ServerCode ###", ServerCode) 1249 | TemplateCode = ReplaceString(TemplateCode, "; ### RequestSelect ###", RequestSelect) 1250 | 1251 | Protected CgiTempFilename.s 1252 | 1253 | CgiTempFilename = GetPathPart(SourceFile) + "tempcgi.pb" 1254 | 1255 | SaveTextFile(TemplateCode, CgiTempFilename) 1256 | 1257 | Protected FileDeleteCounter = 0 1258 | 1259 | Repeat 1260 | 1261 | If FileSize(ServerFilename) = -1 1262 | Break 1263 | EndIf 1264 | 1265 | DeleteFile(ServerFilename) 1266 | 1267 | FileDeleteCounter + 1 1268 | 1269 | If FileDeleteCounter > 9 1270 | Break 1271 | EndIf 1272 | 1273 | Delay(500) 1274 | 1275 | ForEver 1276 | 1277 | Protected PbCompiler.s = SpiderBiteCfg(SpiderBite_Profile)\PbCompiler 1278 | 1279 | CompilerIf #PB_Compiler_OS = #PB_OS_Windows 1280 | PbCompiler = Chr(34) + PbCompiler + Chr(34) 1281 | CgiTempFilename = Chr(34) + CgiTempFilename + Chr(34) 1282 | ServerFilename = Chr(34) + ServerFilename + Chr(34) 1283 | #Params = " /CONSOLE /EXE " 1284 | CompilerElse 1285 | #Params = " -e " 1286 | CompilerEndIf 1287 | 1288 | SetEnvironmentVariable("PUREBASIC_HOME", GetParentPath(GetPathPart(SpiderBiteCfg(SpiderBite_Profile)\PbCompiler))) 1289 | 1290 | Protected Compiler = RunProgram(PbCompiler, 1291 | CgiTempFilename + #Params + ServerFilename, 1292 | "", 1293 | #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide) 1294 | 1295 | Protected ExitCode 1296 | 1297 | If Compiler 1298 | 1299 | Protected ProgramOutput.s 1300 | 1301 | While ProgramRunning(Compiler) 1302 | If AvailableProgramOutput(Compiler) 1303 | ProgramOutput + ReadProgramString(Compiler) + #CRLF$ 1304 | EndIf 1305 | Wend 1306 | 1307 | ExitCode = ProgramExitCode(Compiler) 1308 | 1309 | CloseProgram(Compiler) ; Close the connection to the program 1310 | 1311 | If ExitCode <> 0 1312 | 1313 | FileContent = AddCompilerError(FileContent, "Something went wrong :-(" + ReplaceString(ProgramOutput, #CRLF$, " / ")) 1314 | 1315 | EndIf 1316 | 1317 | Else 1318 | 1319 | FileContent = AddCompilerError(FileContent, "Couldn't start Pbcompiler.") 1320 | 1321 | EndIf 1322 | 1323 | ; DeleteFile(CgiTempFilename) 1324 | 1325 | EndIf 1326 | 1327 | Case #ServerCodeType_Php 1328 | 1329 | RequestSelect = GetRequestSelect4PHP(ServerCode) 1330 | 1331 | If Left(RequestSelect, Len("CompilerError")) = "CompilerError" 1332 | 1333 | FileContent = AddCompilerError(FileContent, Mid(RequestSelect, Len("CompilerError") + 3)) 1334 | 1335 | Else 1336 | 1337 | ServerCode = ConvertToPHP(ServerCode) 1338 | TemplateCode = LoadTextFile(TemplateFilename) 1339 | TemplateCode = ReplaceString(TemplateCode, "// ### ServerCode ###", ServerCode) 1340 | TemplateCode = ReplaceString(TemplateCode, "// ### RequestSelect ###", RequestSelect) 1341 | SaveTextFile(TemplateCode, ServerFilename) 1342 | 1343 | EndIf 1344 | 1345 | Case #ServerCodeType_Python 1346 | 1347 | ServerCode = ConvertToPython(ServerCode) 1348 | TemplateCode = LoadTextFile(TemplateFilename) 1349 | TemplateCode = ReplaceString(TemplateCode, "# ### ServerCode ###", ServerCode) 1350 | SaveTextFile(TemplateCode, ServerFilename) 1351 | 1352 | Case #ServerCodeType_NodeJs 1353 | ; not yet 1354 | 1355 | EndSelect 1356 | 1357 | EndIf 1358 | 1359 | EndIf 1360 | 1361 | ;}- 1362 | 1363 | ProcedureReturn FileContent 1364 | 1365 | EndProcedure 1366 | 1367 | Procedure LoadConfig() 1368 | 1369 | Protected Filename.s = GetExePath() + "SpiderBite.cfg" 1370 | 1371 | If LoadJSON(0, FileName) 1372 | 1373 | ExtractJSONMap(JSONValue(0), SpiderBiteCfg()) 1374 | 1375 | ProcedureReturn #True 1376 | 1377 | EndIf 1378 | 1379 | EndProcedure 1380 | 1381 | Procedure PreProcess(SourceFile.s) 1382 | 1383 | ; AddLog("") 1384 | ; AddLog("Preprocessing. Starting PureBasic...") 1385 | 1386 | Protected SbCompiler.s = GetEnvironmentVariable("PB_TOOL_Compiler") 1387 | 1388 | Protected Parameter.s = Chr(34) + SourceFile + Chr(34) + " /PREPROCESS " + Chr(34) + SourceFile + ".pp" + Chr(34) 1389 | 1390 | MessageRequester("!", SbCompiler + #CRLF$ + Parameter) 1391 | 1392 | Protected Compiler = RunProgram(Chr(34) + SbCompiler + Chr(34), 1393 | Parameter, 1394 | "", 1395 | #PB_Program_Open | #PB_Program_Read | #PB_Program_Hide) 1396 | 1397 | 1398 | 1399 | Protected ExitCode = 1 1400 | 1401 | If Compiler 1402 | 1403 | While ProgramRunning(Compiler) 1404 | ;If AvailableProgramOutput(Compiler) 1405 | ; AddLog(ReadProgramString(Compiler)) 1406 | ;EndIf 1407 | Wend 1408 | 1409 | ExitCode = ProgramExitCode(Compiler) 1410 | 1411 | CloseProgram(Compiler) ; Close the connection to the program 1412 | 1413 | Else 1414 | 1415 | ; AddLog("") 1416 | ; AddLog("Something went wrong :-(", 1) 1417 | ; AddLog("") 1418 | 1419 | EndIf 1420 | 1421 | If ExitCode = 0 1422 | 1423 | ; PbFileContent = LoadTextfile(SourceFile + ".pp") 1424 | 1425 | ProcedureReturn #True 1426 | 1427 | Else 1428 | 1429 | ; PbFileContent = "" 1430 | 1431 | ProcedureReturn #False 1432 | 1433 | EndIf 1434 | 1435 | EndProcedure 1436 | 1437 | Procedure Main() 1438 | 1439 | Protected FileContent.s 1440 | 1441 | ; Before Compile/Run 1442 | 1443 | SourceFile.s = ProgramParameter() ; %COMPILEFILE! 1444 | 1445 | ; SourceFile = "C:\Users\Administrator\AppData\Local\Temp\7\PB_EditorOutput.pb.original" 1446 | 1447 | ; SourceFile = "/tmp/PB_EditorOutput2.pb" 1448 | 1449 | If SourceFile = "" ; no commandline-parameter 1450 | MessageRequester(#AppName, "SourceFile = ''.") 1451 | End 1452 | EndIf 1453 | 1454 | If FileSize(SourceFile) = -1 ; File not found 1455 | MessageRequester(#AppName, "File '" + SourceFile + "' not found.") 1456 | End 1457 | EndIf 1458 | 1459 | ; for SpiderBitePostCompile: 1460 | DeleteFile(SourceFile + ".original") 1461 | CopyFile(SourceFile, SourceFile + ".original") 1462 | 1463 | ; PreProcess(SourceFile) 1464 | 1465 | FileContent = LoadTextFile(SourceFile) 1466 | 1467 | GetSpiderByteConstants(FileContent) 1468 | 1469 | If SpiderBite_Profile <> "" 1470 | 1471 | If LoadConfig() 1472 | 1473 | If FindMapElement(SpiderBiteCfg(), SpiderBite_Profile) 1474 | 1475 | FileContent = ProcessServerCode(FileContent, #ServerCodeType_PbCgi) 1476 | FileContent = ProcessServerCode(FileContent, #ServerCodeType_Php) 1477 | FileContent = ProcessServerCode(FileContent, #ServerCodeType_Aspx) 1478 | FileContent = ProcessServerCode(FileContent, #ServerCodeType_Asp) 1479 | ; FileContent = ProcessServerCode(FileContent, #ServerCodeType_Python) 1480 | ; FileContent = ProcessServerCode(FileContent, #ServerCodeType_NodeJs) 1481 | 1482 | Else 1483 | 1484 | FileContent = AddCompilerError(FileContent, "Profile '" + SpiderBite_Profile + "' not found!") 1485 | 1486 | EndIf 1487 | 1488 | Else 1489 | 1490 | FileContent = AddCompilerError(FileContent, "Couldn't load '" + GetPathPart(ProgramFilename()) + "SpiderBite.cfg!") 1491 | 1492 | EndIf 1493 | 1494 | ; Debug FileContent 1495 | 1496 | SaveTextFile(FileContent, SourceFile) 1497 | 1498 | EndIf 1499 | 1500 | EndProcedure 1501 | 1502 | Main() -------------------------------------------------------------------------------- /SpiderBiteAfterCreateApp.pb: -------------------------------------------------------------------------------- 1 | EnableExplicit 2 | 3 | Global SourceFile.s 4 | 5 | #AppName = "SpiderBiteAfterCreateApp" 6 | #AppVersion = "2017-08-12" 7 | 8 | Procedure Main() 9 | 10 | ; After Create App 11 | 12 | SourceFile.s = ProgramParameter() ; %COMPILEFILE! 13 | 14 | If SourceFile = "" ; no commandline-parameter 15 | MessageRequester(#AppName, "SourceFile = ''.") 16 | End 17 | EndIf 18 | 19 | If FileSize(SourceFile) = -1 ; File not found 20 | MessageRequester(#AppName, "File '" + SourceFile + "' not found.") 21 | End 22 | EndIf 23 | 24 | If FileSize(SourceFile + ".original") > 0 25 | 26 | DeleteFile(SourceFile) 27 | 28 | RenameFile(SourceFile + ".original", SourceFile) 29 | 30 | DeleteFile(SourceFile + ".original") 31 | 32 | EndIf 33 | 34 | EndProcedure 35 | 36 | Main() -------------------------------------------------------------------------------- /SpiderBiteConfig.pb: -------------------------------------------------------------------------------- 1 | EnableExplicit 2 | 3 | Structure sSpiderBiteCfg 4 | 5 | PbCompiler.s 6 | 7 | AspxTemplate.s 8 | AspxServerFilename.s 9 | AspxServerAddress.s 10 | 11 | AspTemplate.s 12 | AspServerFilename.s 13 | AspServerAddress.s 14 | 15 | PbCgiTemplate.s 16 | PbCgiServerFilename.s 17 | PbCgiServerAddress.s 18 | 19 | NodeJsServerFilename.s 20 | NodeJsServerAddress.s 21 | NodeJsTemplate.s 22 | 23 | PhpTemplate.s 24 | PhpServerFilename.s 25 | PhpServerAddress.s 26 | 27 | PythonTemplate.s 28 | PythonServerFilename.s 29 | PythonServerAddress.s 30 | 31 | EndStructure 32 | 33 | Global NewMap SpiderBiteCfg.sSpiderBiteCfg() 34 | 35 | Global GlobalQuit 36 | 37 | Global DialogXML 38 | Global Dialog 39 | 40 | #AppName = "SpiderBiteConfig" 41 | 42 | XIncludeFile "includes/functions.pbi" 43 | 44 | Enumeration 45 | #Action_Add = 1 46 | #Action_Edit 47 | #Action_Delete 48 | EndEnumeration 49 | 50 | Global Action 51 | 52 | Runtime Enumeration 53 | 54 | #winConfig 55 | 56 | #winConfig_txtProfileName 57 | 58 | #winConfig_txtPbCompiler 59 | #winConfig_cmdPbCompiler 60 | 61 | #winConfig_txtPbCgiTemplate 62 | #winConfig_cmdPbCgiTemplate 63 | #winConfig_txtPbCgiServerFilename 64 | #winConfig_cmdPbCgiServerFilename 65 | #winConfig_txtPbCgiServerAddress 66 | 67 | #winConfig_txtPhpTemplate 68 | #winConfig_cmdPhpTemplate 69 | #winConfig_txtPhpServerFilename 70 | #winConfig_cmdPhpServerFilename 71 | #winConfig_txtPhpServerAddress 72 | 73 | #winConfig_txtAspTemplate 74 | #winConfig_cmdAspTemplate 75 | #winConfig_txtAspServerFilename 76 | #winConfig_cmdAspServerFilename 77 | #winConfig_txtAspServerAddress 78 | 79 | #winConfig_txtAspxTemplate 80 | #winConfig_cmdAspxTemplate 81 | #winConfig_txtAspxServerFilename 82 | #winConfig_cmdAspxServerFilename 83 | #winConfig_txtAspxServerAddress 84 | 85 | #winConfig_txtNodeJsFilename 86 | #winConfig_cmdNodeJsFilename 87 | #winConfig_txtNodeJsServerAddress 88 | 89 | #winConfig_txtPythonTemplate 90 | #winConfig_cmdPythonTemplate 91 | #winConfig_txtPythonServerFilename 92 | #winConfig_cmdPythonServerFilename 93 | #winConfig_txtPythonServerAddress 94 | 95 | #winConfig_cmdOK 96 | #winConfig_cmdCancel 97 | 98 | #winMain 99 | 100 | #winMain_lstProfiles 101 | #winMain_cmdAdd 102 | #winMain_cmdEdit 103 | #winMain_cmdDelete 104 | #winMain_txtProfileName 105 | #winMain_cmdCopyToClipboard 106 | 107 | EndEnumeration 108 | 109 | Procedure LoadConfig() 110 | 111 | Protected Filename.s = GetExePath() + "SpiderBite.cfg" 112 | 113 | If LoadJSON(0, FileName) 114 | 115 | ExtractJSONMap(JSONValue(0), SpiderBiteCfg()) 116 | 117 | EndIf 118 | 119 | EndProcedure 120 | 121 | Procedure SaveConfig() 122 | 123 | Protected Filename.s = GetExePath() + "SpiderBite.cfg" 124 | 125 | If CreateJSON(0) 126 | 127 | InsertJSONMap(JSONValue(0), SpiderBiteCfg()) 128 | 129 | SaveJSON(0, FileName, #PB_JSON_PrettyPrint) 130 | 131 | EndIf 132 | 133 | EndProcedure 134 | 135 | Runtime Procedure winConfig_ChoosePathEvent() 136 | 137 | Protected Filename.s 138 | Protected SelectedFilename.s 139 | 140 | Select EventGadget() 141 | 142 | Case #winConfig_cmdPbCompiler 143 | Filename = GetGadgetText(#winConfig_txtPbCompiler) 144 | 145 | Case #winConfig_cmdPbCgiTemplate 146 | Filename = GetGadgetText(#winConfig_txtPbCgiTemplate) 147 | Case #winConfig_cmdPbCgiServerFilename 148 | Filename = GetGadgetText(#winConfig_txtPbCgiServerFilename) 149 | 150 | Case #winConfig_cmdPhpTemplate 151 | Filename = GetGadgetText(#winConfig_txtPhpTemplate) 152 | Case #winConfig_cmdPhpServerFilename 153 | Filename = GetGadgetText(#winConfig_txtPhpServerFilename) 154 | 155 | Case #winConfig_cmdAspTemplate 156 | Filename = GetGadgetText(#winConfig_txtAspTemplate) 157 | Case #winConfig_cmdAspServerFilename 158 | Filename = GetGadgetText(#winConfig_txtAspServerFilename) 159 | 160 | Case #winConfig_cmdAspxTemplate 161 | Filename = GetGadgetText(#winConfig_txtAspxTemplate) 162 | Case #winConfig_cmdAspxServerFilename 163 | Filename = GetGadgetText(#winConfig_txtAspxServerFilename) 164 | 165 | Case #winConfig_cmdPythonTemplate 166 | Filename = GetGadgetText(#winConfig_txtPythonTemplate) 167 | Case #winConfig_cmdPythonServerFilename 168 | Filename = GetGadgetText(#winConfig_txtPythonServerFilename) 169 | 170 | EndSelect 171 | 172 | SelectedFilename = OpenFileRequester("Please choose a file", Filename, "All files (*.*)|*.*", 0) 173 | 174 | If SelectedFilename 175 | Select EventGadget() 176 | 177 | Case #winConfig_cmdPbCompiler 178 | SetGadgetText(#winConfig_txtPbCompiler, SelectedFilename) 179 | 180 | Case #winConfig_cmdPbCgiTemplate 181 | SetGadgetText(#winConfig_txtPbCgiTemplate, SelectedFilename) 182 | Case #winConfig_cmdPbCgiServerFilename 183 | SetGadgetText(#winConfig_txtPbCgiServerFilename, SelectedFilename) 184 | 185 | Case #winConfig_cmdPhpTemplate 186 | SetGadgetText(#winConfig_txtPhpTemplate, SelectedFilename) 187 | Case #winConfig_cmdPhpServerFilename 188 | SetGadgetText(#winConfig_txtPhpServerFilename, SelectedFilename) 189 | 190 | Case #winConfig_cmdAspTemplate 191 | SetGadgetText(#winConfig_txtAspTemplate, SelectedFilename) 192 | Case #winConfig_cmdAspServerFilename 193 | SetGadgetText(#winConfig_txtAspServerFilename, SelectedFilename) 194 | 195 | Case #winConfig_cmdAspxTemplate 196 | SetGadgetText(#winConfig_txtAspxTemplate, SelectedFilename) 197 | Case #winConfig_cmdAspxServerFilename 198 | SetGadgetText(#winConfig_txtAspxServerFilename, SelectedFilename) 199 | 200 | Case #winConfig_cmdPythonTemplate 201 | SetGadgetText(#winConfig_txtPythonTemplate, SelectedFilename) 202 | Case #winConfig_cmdPythonServerFilename 203 | SetGadgetText(#winConfig_txtPythonServerFilename, SelectedFilename) 204 | 205 | EndSelect 206 | EndIf 207 | 208 | EndProcedure 209 | 210 | Procedure CheckButtons() 211 | 212 | Protected Flag = #False 213 | 214 | If GetGadgetState(#winMain_lstProfiles) = -1 215 | Flag = #True 216 | EndIf 217 | 218 | DisableGadget(#winMain_cmdEdit, Flag) 219 | DisableGadget(#winMain_cmdDelete, Flag) 220 | 221 | If Flag = #False 222 | SetGadgetText(#winMain_txtProfileName, "#SpiderBite_Profile = " + Chr(34) + GetGadgetText(#winMain_lstProfiles) + Chr(34)) 223 | Else 224 | SetGadgetText(#winMain_txtProfileName, "") 225 | EndIf 226 | 227 | EndProcedure 228 | 229 | Procedure ReFillProfileList(ProfileName.s = "") 230 | 231 | NewList DummyList.s() 232 | 233 | ForEach SpiderBiteCfg() 234 | AddElement(DummyList()) 235 | DummyList() = MapKey(SpiderBiteCfg()) 236 | Next 237 | 238 | SortList(DummyList(), #PB_Sort_Ascending | #PB_Sort_NoCase) 239 | 240 | ClearGadgetItems(#winMain_lstProfiles) 241 | 242 | ForEach DummyList() 243 | AddGadgetItem(#winMain_lstProfiles, -1, DummyList()) 244 | Next 245 | 246 | If ProfileName <> "" 247 | SetGadgetText(#winMain_lstProfiles, ProfileName) 248 | EndIf 249 | 250 | If GetGadgetState(#winMain_lstProfiles) = -1 251 | SetGadgetState(#winMain_lstProfiles, 0) 252 | EndIf 253 | 254 | CheckButtons() 255 | 256 | EndProcedure 257 | 258 | Runtime Procedure winConfig_cmdOK_Event() 259 | 260 | Protected ProfileName.s = Trim(GetGadgetText(#winConfig_txtProfileName)) 261 | Protected ProfileNameExists 262 | 263 | If ProfileName = "" 264 | 265 | MessageRequester(#AppName, "ProfileName must not be empty.") 266 | SetActiveGadget(#winConfig_txtProfileName) 267 | 268 | ProcedureReturn 269 | 270 | EndIf 271 | 272 | Select Action 273 | 274 | Case #Action_Add 275 | 276 | ; Check, if ProfileName exists... 277 | 278 | ForEach SpiderBiteCfg() 279 | If LCase(ProfileName) = LCase(MapKey(SpiderBiteCfg())) 280 | ProfileNameExists = #True 281 | Break 282 | EndIf 283 | Next 284 | 285 | If ProfileNameExists 286 | MessageRequester(#AppName, "ProfileName already exists." + #LF$ + "Please choose another one.") 287 | SetActiveGadget(#winConfig_txtProfileName) 288 | ProcedureReturn 289 | EndIf 290 | 291 | Case #Action_Edit 292 | 293 | If LCase(ProfileName) <> LCase(GetGadgetText(#winMain_lstProfiles)) 294 | 295 | ; rename profilename 296 | 297 | ; Check, if ProfileName exists elsewhere... 298 | 299 | ForEach SpiderBiteCfg() 300 | If LCase(ProfileName) = LCase(MapKey(SpiderBiteCfg())) 301 | ProfileNameExists = #True 302 | Break 303 | EndIf 304 | Next 305 | 306 | If ProfileNameExists 307 | MessageRequester(#AppName, "ProfileName already exists." + #LF$ + "Please choose another one.") 308 | SetActiveGadget(#winConfig_txtProfileName) 309 | ProcedureReturn 310 | EndIf 311 | 312 | EndIf 313 | 314 | DeleteMapElement(SpiderBiteCfg(), GetGadgetText(#winMain_lstProfiles)) 315 | 316 | EndSelect 317 | 318 | SpiderBiteCfg(ProfileName)\PbCompiler = GetGadgetText(#winConfig_txtPbCompiler) 319 | 320 | SpiderBiteCfg(ProfileName)\PbCgiTemplate = GetGadgetText(#winConfig_txtPbCgiTemplate) 321 | SpiderBiteCfg(ProfileName)\PbCgiServerFilename = GetGadgetText(#winConfig_txtPbCgiServerFilename) 322 | SpiderBiteCfg(ProfileName)\PbCgiServerAddress = GetGadgetText(#winConfig_txtPbCgiServerAddress) 323 | 324 | SpiderBiteCfg(ProfileName)\PhpTemplate = GetGadgetText(#winConfig_txtPhpTemplate) 325 | SpiderBiteCfg(ProfileName)\PhpServerFilename = GetGadgetText(#winConfig_txtPhpServerFilename) 326 | SpiderBiteCfg(ProfileName)\PhpServerAddress = GetGadgetText(#winConfig_txtPhpServerAddress) 327 | 328 | SpiderBiteCfg(ProfileName)\AspTemplate = GetGadgetText(#winConfig_txtAspTemplate) 329 | SpiderBiteCfg(ProfileName)\AspServerFilename = GetGadgetText(#winConfig_txtAspServerFilename) 330 | SpiderBiteCfg(ProfileName)\AspServerAddress = GetGadgetText(#winConfig_txtAspServerAddress) 331 | 332 | SpiderBiteCfg(ProfileName)\AspxTemplate = GetGadgetText(#winConfig_txtAspxTemplate) 333 | SpiderBiteCfg(ProfileName)\AspxServerFilename = GetGadgetText(#winConfig_txtAspxServerFilename) 334 | SpiderBiteCfg(ProfileName)\AspxServerAddress = GetGadgetText(#winConfig_txtAspxServerAddress) 335 | 336 | SpiderBiteCfg(ProfileName)\PythonTemplate = GetGadgetText(#winConfig_txtPythonTemplate) 337 | SpiderBiteCfg(ProfileName)\PythonServerFilename = GetGadgetText(#winConfig_txtPythonServerFilename) 338 | SpiderBiteCfg(ProfileName)\PythonServerAddress = GetGadgetText(#winConfig_txtPythonServerAddress) 339 | 340 | SaveConfig() 341 | 342 | CloseWindow(#winConfig) 343 | 344 | ReFillProfileList(ProfileName) 345 | 346 | DisableWindow(#winMain, #False) 347 | 348 | EndProcedure 349 | 350 | Runtime Procedure winConfig_cmdCancel_Event() 351 | CloseWindow(#winConfig) 352 | DisableWindow(#winMain, #False) 353 | EndProcedure 354 | 355 | Procedure winConfig_Close() 356 | CloseWindow(#winConfig) 357 | DisableWindow(#winMain, #False) 358 | EndProcedure 359 | 360 | Runtime Procedure winMain_cmdAdd_Event() 361 | Action = #Action_Add 362 | DisableWindow(#winMain, #True) 363 | OpenXMLDialog(Dialog, DialogXML, "winConfig", #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore, WindowID(#winMain)) 364 | SetWindowTitle(#winConfig, "Add profile") 365 | BindEvent(#PB_Event_CloseWindow, @winConfig_Close(), #winConfig) 366 | SetActiveGadget(#winConfig_txtProfileName) 367 | EndProcedure 368 | 369 | Runtime Procedure winMain_cmdEdit_Event() 370 | 371 | Action = #Action_Edit 372 | 373 | DisableWindow(#winMain, #True) 374 | OpenXMLDialog(Dialog, DialogXML, "winConfig", #PB_Ignore, #PB_Ignore, #PB_Ignore, #PB_Ignore, WindowID(#winMain)) 375 | 376 | SetWindowTitle(#winConfig, "Edit profile") 377 | 378 | BindEvent(#PB_Event_CloseWindow, @winConfig_Close(), #winConfig) 379 | 380 | Protected SelectedProfile.s = GetGadgetText(#winMain_lstProfiles) 381 | 382 | SetGadgetText(#winConfig_txtProfileName, SelectedProfile) 383 | 384 | SetGadgetText(#winConfig_txtPbCompiler, SpiderBiteCfg(SelectedProfile)\PbCompiler) 385 | 386 | SetGadgetText(#winConfig_txtPbCgiTemplate, SpiderBiteCfg(SelectedProfile)\PbCgiTemplate) 387 | SetGadgetText(#winConfig_txtPbCgiServerFilename, SpiderBiteCfg(SelectedProfile)\PbCgiServerFilename) 388 | SetGadgetText(#winConfig_txtPbCgiServerAddress, SpiderBiteCfg(SelectedProfile)\PbCgiServerAddress) 389 | 390 | SetGadgetText(#winConfig_txtPhpTemplate, SpiderBiteCfg(SelectedProfile)\PhpTemplate) 391 | SetGadgetText(#winConfig_txtPhpServerFilename, SpiderBiteCfg(SelectedProfile)\PhpServerFilename) 392 | SetGadgetText(#winConfig_txtPhpServerAddress, SpiderBiteCfg(SelectedProfile)\PhpServerAddress) 393 | 394 | SetGadgetText(#winConfig_txtAspTemplate, SpiderBiteCfg(SelectedProfile)\AspTemplate) 395 | SetGadgetText(#winConfig_txtAspServerFilename, SpiderBiteCfg(SelectedProfile)\AspServerFilename) 396 | SetGadgetText(#winConfig_txtAspServerAddress, SpiderBiteCfg(SelectedProfile)\AspServerAddress) 397 | 398 | SetGadgetText(#winConfig_txtAspxTemplate, SpiderBiteCfg(SelectedProfile)\AspxTemplate) 399 | SetGadgetText(#winConfig_txtAspxServerFilename, SpiderBiteCfg(SelectedProfile)\AspxServerFilename) 400 | SetGadgetText(#winConfig_txtAspxServerAddress, SpiderBiteCfg(SelectedProfile)\AspxServerAddress) 401 | 402 | SetGadgetText(#winConfig_txtPythonTemplate, SpiderBiteCfg(SelectedProfile)\PythonTemplate) 403 | SetGadgetText(#winConfig_txtPythonServerFilename, SpiderBiteCfg(SelectedProfile)\PythonServerFilename) 404 | SetGadgetText(#winConfig_txtPythonServerAddress, SpiderBiteCfg(SelectedProfile)\PythonServerAddress) 405 | 406 | EndProcedure 407 | 408 | Runtime Procedure winMain_cmdDelete_Event() 409 | 410 | If MessageRequester(#AppName, "Sure?", #PB_MessageRequester_YesNo)=#PB_MessageRequester_No 411 | ProcedureReturn 412 | EndIf 413 | 414 | Action = #Action_Delete 415 | 416 | Protected SelectedProfile.s = GetGadgetText(#winMain_lstProfiles) 417 | 418 | DeleteMapElement(SpiderBiteCfg(), SelectedProfile) 419 | 420 | SaveConfig() 421 | 422 | ReFillProfileList() 423 | 424 | EndProcedure 425 | 426 | Runtime Procedure winMain_cmdCopyToClipboard_Event() 427 | SetClipboardText(GetGadgetText(#winMain_txtProfileName)) 428 | EndProcedure 429 | 430 | Procedure winMain_Close() 431 | 432 | GlobalQuit = #True 433 | 434 | EndProcedure 435 | 436 | Procedure winMain_Open() 437 | 438 | OpenXMLDialog(Dialog, DialogXML, "winMain") 439 | 440 | BindEvent(#PB_Event_CloseWindow, @winMain_Close(), #winMain) 441 | 442 | DisableGadget(#winMain_txtProfileName, #True) 443 | 444 | Protected SelectedWord.s = GetEnvironmentVariable("PB_TOOL_Word") 445 | 446 | If FindMapElement(SpiderBiteCfg(), SelectedWord) = 0 447 | SelectedWord = "" 448 | EndIf 449 | 450 | ReFillProfileList(SelectedWord) 451 | 452 | EndProcedure 453 | 454 | Runtime Procedure winMain_lstProfiles_Event() 455 | 456 | CheckButtons() 457 | 458 | If EventType() = #PB_EventType_LeftDoubleClick 459 | 460 | If GetGadgetState(#winMain_lstProfiles) > -1 461 | 462 | winMain_cmdEdit_Event() 463 | 464 | EndIf 465 | 466 | EndIf 467 | 468 | EndProcedure 469 | 470 | Procedure Main() 471 | 472 | Protected Event 473 | 474 | DialogXML = ParseXML(#PB_Any, PeekS(?SpiderBiteConfigDialogs, -1, #PB_UTF8)) 475 | 476 | If DialogXML 477 | 478 | If XMLStatus(DialogXML) = #PB_XML_Success 479 | 480 | Dialog = CreateDialog(#PB_Any) 481 | 482 | winMain_Open() 483 | 484 | Repeat 485 | Event = WaitWindowEvent() 486 | If GlobalQuit 487 | Break 488 | EndIf 489 | ForEver 490 | 491 | Else 492 | Debug "XML error: " + XMLError(DialogXML) + " (Line: " + XMLErrorLine(DialogXML) + ")" 493 | EndIf 494 | 495 | EndIf 496 | 497 | EndProcedure 498 | 499 | LoadConfig() 500 | 501 | Main() 502 | 503 | DataSection 504 | SpiderBiteConfigDialogs: 505 | IncludeBinary "includes/SpiderBiteConfigDialogs.xml" 506 | Data.b 0 507 | EndDataSection -------------------------------------------------------------------------------- /includes/SpiderBite.sbi: -------------------------------------------------------------------------------- 1 | Macro EnablePHP 2 | EndMacro 3 | Macro DisablePHP 4 | EndMacro 5 | 6 | Macro EnableASP 7 | EndMacro 8 | Macro DisableASP 9 | EndMacro 10 | 11 | Macro EnableASPX 12 | EndMacro 13 | Macro DisableASPX 14 | EndMacro 15 | 16 | Macro EnablePbCgi 17 | EndMacro 18 | Macro DisablePbCgi 19 | EndMacro 20 | 21 | Macro EnablePython 22 | EndMacro 23 | Macro DisablePython 24 | EndMacro 25 | 26 | Macro EnableNodeJs 27 | EndMacro 28 | Macro DisableNodeJs 29 | EndMacro 30 | 31 | 32 | ;{- DataBase 33 | 34 | ; ; Result = AffectedDatabaseRows(#Database) 35 | ; Procedure AffectedDatabaseRows(Database) 36 | ; EndProcedure 37 | ; 38 | ; ; Text$ = CheckDatabaseNull(#Database, Column) 39 | ; Procedure.s CheckDatabaseNull(Database, Column) 40 | ; EndProcedure 41 | ; 42 | ; ; CloseDatabase(#Database) 43 | ; Procedure CloseDatabase(Database) 44 | ; EndProcedure 45 | ; 46 | ; ; Result = DatabaseColumnIndex(#Database, ColumnName$) 47 | ; Procedure DatabaseColumnIndex(Database, ColumnName.s) 48 | ; EndProcedure 49 | ; 50 | ; ; Text$ = DatabaseColumnName(#Database, Column) 51 | ; Procedure.s DatabaseColumnName(Database, Column) 52 | ; EndProcedure 53 | ; 54 | ; ; Result = DatabaseColumnSize(#Database, Column) 55 | ; Procedure DatabaseColumnSize(Database, Column) 56 | ; EndProcedure 57 | ; 58 | ; ; Result = DatabaseColumnType(#Database, Column) 59 | ; Procedure DatabaseColumnType(Database, Column) 60 | ; EndProcedure 61 | ; 62 | ; ; Result = DatabaseColumns(#Database) 63 | ; Procedure DatabaseColumns(Database) 64 | ; EndProcedure 65 | ; 66 | ; ; Text$ = DatabaseDriverDescription() 67 | ; Procedure.s DatabaseDriverDescription() 68 | ; EndProcedure 69 | ; 70 | ; ; Text$ = DatabaseDriverName() 71 | ; Procedure.s DatabaseDriverName() 72 | ; EndProcedure 73 | ; 74 | ; ; Error$ = DatabaseError() 75 | ; Procedure.s DatabaseError() 76 | ; EndProcedure 77 | ; 78 | ; ; DatabaseID = DatabaseID(#Database) 79 | ; Procedure DatabaseID(Database) 80 | ; EndProcedure 81 | ; 82 | ; ; Result = DatabaseQuery(#Database, Request$ [, Flags]) 83 | ; Procedure DatabaseQuery(Database, Request.s, Flags = 0) 84 | ; EndProcedure 85 | ; 86 | ; ; Result = DatabaseUpdate(#Database, Request$) 87 | ; Procedure DatabaseUpdate(Database, Request.s) 88 | ; EndProcedure 89 | ; 90 | ; ; Result = ExamineDatabaseDrivers() 91 | ; Procedure ExamineDatabaseDrivers() 92 | ; EndProcedure 93 | ; 94 | ; ; FinishDatabaseQuery(#Database) 95 | ; Procedure FinishDatabaseQuery(Database) 96 | ; EndProcedure 97 | ; 98 | ; ; Result = FirstDatabaseRow(#Database) 99 | ; Procedure FirstDatabaseRow(Database) 100 | ; EndProcedure 101 | ; 102 | ; ; Result = GetDatabaseBlob(#Database, Column, *Buffer, BufferLength) 103 | ; Procedure GetDatabaseBlob(Database, Column, *Buffer, BufferLength) 104 | ; EndProcedure 105 | ; 106 | ; ; Result.d = GetDatabaseDouble(#Database, Column) 107 | ; Procedure.d GetDatabaseDouble(Database, Column) 108 | ; EndProcedure 109 | ; 110 | ; ; Result.f = GetDatabaseFloat(#Database, Column) 111 | ; Procedure.f GetDatabaseFloat(Database, Column) 112 | ; EndProcedure 113 | ; 114 | ; ; Result = GetDatabaseLong(#Database, Column) 115 | ; Procedure GetDatabaseLong(Database, Column) 116 | ; EndProcedure 117 | ; 118 | ; ; Result.q = GetDatabaseQuad(#Database, Column) 119 | ; Procedure.q GetDatabaseQuad(Database, Column) 120 | ; EndProcedure 121 | ; 122 | ; ; Text$ = GetDatabaseString(#Database, Column) 123 | ; Procedure.s GetDatabaseString(Database, Column) 124 | ; EndProcedure 125 | ; 126 | ; ; Result = IsDatabase(#Database) 127 | ; Procedure IsDatabase(Database) 128 | ; EndProcedure 129 | ; 130 | ; ; Result = NextDatabaseDriver() 131 | ; Procedure NextDatabaseDriver() 132 | ; EndProcedure 133 | ; 134 | ; ; Result = NextDatabaseRow(#Database) 135 | ; Procedure NextDatabaseRow(Database) 136 | ; EndProcedure 137 | ; 138 | ; ; Result = OpenDatabase(#Database, DatabaseName$, User$, Password$ [, Plugin]) 139 | ; Procedure OpenDatabase(Database, DatabaseName.s, User.s, Password.s, Plugin = 0) 140 | ; EndProcedure 141 | ; 142 | ; ; ; Result = OpenDatabaseRequester(#Database [, Plugin]) 143 | ; ; Procedure OpenDatabaseRequester(Database, Plugin = 0) ; NoNoNo! No Requester on ServerSide!!! 144 | ; ; EndProcedure 145 | ; 146 | ; ; Result = PreviousDatabaseRow(#Database) 147 | ; Procedure PreviousDatabaseRow(Database) 148 | ; EndProcedure 149 | ; 150 | ; ; SetDatabaseBlob(#Database, StatementIndex, *Buffer, BufferLength) 151 | ; Procedure SetDatabaseBlob(Database, StatementIndex, *Buffer, BufferLength) 152 | ; EndProcedure 153 | ; 154 | ; ; SetDatabaseDouble(#Database, StatementIndex, Value.d) 155 | ; Procedure SetDatabaseDouble(Database, StatementIndex, Value.d) 156 | ; EndProcedure 157 | ; 158 | ; ; SetDatabaseFloat(#Database, StatementIndex, Value.f) 159 | ; Procedure SetDatabaseFloat(Database, StatementIndex, Value.f) 160 | ; EndProcedure 161 | ; 162 | ; ; SetDatabaseLong(#Database, StatementIndex, Value) 163 | ; Procedure SetDatabaseLong(Database, StatementIndex, Value) 164 | ; EndProcedure 165 | ; 166 | ; ; SetDatabaseNull(#Database, StatementIndex) 167 | ; Procedure SetDatabaseNull(Database, StatementIndex) 168 | ; EndProcedure 169 | ; 170 | ; ; SetDatabaseQuad(#Database, StatementIndex, Value.q) 171 | ; Procedure SetDatabaseQuad(Database, StatementIndex, Value.q) 172 | ; EndProcedure 173 | ; 174 | ; ; SetDatabaseString(#Database, StatementIndex, Value$) 175 | ; Procedure SetDatabaseString(Database, StatementIndex, Value.s) 176 | ; EndProcedure 177 | ; 178 | ; ; UseODBCDatabase() 179 | ; Procedure UseODBCDatabase() 180 | ; EndProcedure 181 | ; 182 | ; ; UsePostgreSQLDatabase() 183 | ; Procedure UsePostgreSQLDatabase() 184 | ; EndProcedure 185 | ; 186 | ; ; UseSQLiteDatabase() 187 | ; Procedure UseSQLiteDatabase() 188 | ; EndProcedure 189 | 190 | ;}- 191 | 192 | 193 | -------------------------------------------------------------------------------- /includes/SpiderBiteConfigDialogs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |