﻿#include "sqlite3.exe.au3"
#include "sqlite3.dll.au3"
#include <SQLite.au3>
#include <Array.au3>

Opt("MustDeclareVars", 1)


Global $g_sScriptName = ""
Global $g_sWorkDir = @ScriptDir & "\Data\sqlite3_x86\", $g_sDbFile = $g_sWorkDir & "DB.db"
DirCreate($g_sWorkDir)
FileChangeDir($g_sWorkDir)

If Not FileExists($g_sWorkDir & "sqlite3.dll") Then _sqlite3dll(True, $g_sWorkDir)
If Not FileExists($g_sWorkDir & "sqlite3.exe") Then _sqlite3exe(True, $g_sWorkDir)

_SQliteStart()
If @error Then Exit MsgBox(0, "Fehler-Abbruch", @ScriptLineNumber)
OnAutoItExitRegister("_Exit")
Global $g_sFilePath = @ScriptDir & "\test.csv"




; #########  HIER DIE PARAMETER EINGEBEN ################

; Anzahl der Spalten:
Global $g_iCols = 10

; Anzahl der Zeilen:
Global $g_Rows = 500

; #######################################################






_CreateCSV($g_sFilePath, $g_iCols, $g_Rows)
_ArrayDisplay(_ImportCSV($g_sFilePath), "Die gefüllte Datenbank")
FileDelete($g_sFilePath)










Func _SQliteStart()
	_SQLite_Startup($g_sWorkDir & "sqlite3.dll", False, 1)
	If @error Then Return SetError(1)
	_SQLite_Open($g_sDbFile)
	If @error Then Return SetError(2, @extended, @error)
EndFunc   ;==>_SQliteStart

Func _ImportCSV($sFilePath)

	Local $sOut, $aSQLContent, $iRows, $iColumns

	If Not FileExists($sFilePath) Then Exit MsgBox(64, $g_sScriptName, "Datei nicht gefunden!")

	Local $sString, $sTemp, $sTempFilePath = $g_sWorkDir & "Temp.csv"
	If _GetFileEncoding($sFilePath)[0] = 512 Then
		Local $sString = FileRead($sFilePath)
		$sTemp = BinaryToString(StringToBinary($sString, 4), 4)
		FileWrite($sTempFilePath, $sTemp)
		$sFilePath = $sTempFilePath
	EndIf

	FileChangeDir($g_sWorkDir)

	_SQLite_SQLiteExe($g_sDbFile, _
			".mode csv" & @CRLF & _
			".separator ;" & @CRLF & _
			".import '" & $sFilePath & "' Tbl1" & @CRLF _
			, $sOut, "sqlite3.exe")
	If @error <> 0 Then
		Local $sError
		Switch @error
			Case 1
				$sError = "Can't create new Database"
			Case 2
				$sError = "sqlite3.exe not Found"
			Case 3
				$sError = "SQL error / incomplete SQL"
			Case 4
				$sError = "Can't open input file"
		EndSwitch
		Exit MsgBox(64, "Fehler-Abbruch", $sError)
	EndIf


	If FileExists($sTempFilePath) Then FileDelete($sTempFilePath)

	Local $iRval = _SQLite_GetTable2d(-1, "SELECT * FROM Tbl1;", $aSQLContent, $iRows, $iColumns)
	If $iRval <> $SQLITE_OK Then
		ConsoleWrite("Skriptzeile: " & @ScriptLineNumber & " " & "SQLite Error: " & $iRval & " - " & _SQLite_ErrMsg() & @CRLF)
		Exit MsgBox(64, $g_sScriptName, "Fehler-Abbruch: CSV-Datei wurde nicht korekt eingelesen!")
	EndIf
	Return $aSQLContent
EndFunc   ;==>_ImportCSV

; Gibt 1D-Array zurück [0]=Code-Nummer, [1]=Code-Name
Func _GetFileEncoding($sFilePath)
	Local $iEncoding = 0
	$iEncoding = FileGetEncoding($sFilePath)
	Local $sEncoding = ""
	Switch $iEncoding
		Case $FO_UTF16_LE
			$sEncoding = "UTF16 Little Endian" ; 32
		Case $FO_UTF16_BE
			$sEncoding = "UTF16 Big Endian" ; 64
		Case $FO_UTF8
			$sEncoding = "UTF8 (mit BOM)" ; 128
		Case $FO_UTF8_NOBOM
			$sEncoding = "UTF8 (ohne BOM)" ; 256
		Case $FO_ANSI
			$sEncoding = "ANSI" ; 512
		Case -1
			$sEncoding = "Unbekannt" ; 512
		Case Else
			$sEncoding = "Nur UTF8/ANSI unterstützt" ; 512
	EndSwitch
	Local $aEncoding[2] = [$iEncoding, $sEncoding]
	Return $aEncoding
EndFunc   ;==>_GetFileEncoding

Func _CreateCSV($f, $iCols, $iRows)

Local $s = "", $s2
For $i = 1 To $iCols
	$s &= Random(1, 1000, 1) & ";"
Next
$s = StringTrimRight($s, 1) & @CRLF
For $i = 0 To $iRows
	$s2 &= $s
Next

Local $hFileOpen = FileOpen($f, 2)
FileWrite($hFileOpen, $s2)
FileClose($hFileOpen)
EndFunc



Func _Exit()
	_SQLite_Close()
	_SQLite_Shutdown()
	FileDelete($g_sDbFile)
;~ 	DirRemove($g_sWorkDir, 1)
	Exit
EndFunc   ;==>_Exit

