//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 기능 |
//+------------------------------------------------------------------+
void OnStart()
{
//--- DAT 확장자를 사용하여 파일을 선택할 수 있는 대화 상자 열기
string selected_files[];
if(!FileSelectDialog("다운로드할 파일을 선택", NULL,
"Data files (*.dat)|*.dat|All files (*.*)|*.*",
FSD_ALLOW_MULTISELECT, selected_files, "tester.dat")>0)
{
Print("파일이 선택되지 않음. Exit");
return;
}
//--- 파일의 사이즈를 가져오기
ulong filesize[];
int filehandle[];
int files=ArraySize(selected_files);
ArrayResize(filesize, files);
ZeroMemory(filesize);
ArrayResize(filehandle, files);
double total_size=0;
for(int i=0; i<files; i++)
{
filehandle[i]=FileOpen(selected_files[i], FILE_READ|FILE_BIN);
if(filehandle[i]!=INVALID_HANDLE)
{
filesize[i]=FileSize(filehandle[i]);
//PrintFormat("%d, %s handle=%d %d bytes", i, selected_files[i], filehandle[i], filesize[i]);
total_size+=(double)filesize[i];
}
}
//--- 파일의 공통 크기를 확인
if(total_size==0)
{
PrintFormat("총 파일의 크기가 0입니다. Exit");
return;
}
//--- 공통 터미널 폴더에서 데이터베이스 생성 또는 열기
string filename="dat_files.sqlite";
int db=DatabaseOpen(filename, DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE);
if(db==INVALID_HANDLE)
{
Print("DB: ", filename, " 코드와함께 열기 실패 ", GetLastError());
return;
}
else
Print("데이터베이스: ", filename, " 성공적으로 열림");
//--- FILES 테이블이 있는 경우 삭제
if(DatabaseTableExists(db, "FILES"))
{
//--- 테이블 삭제
if(!DatabaseExecute(db, "DROP TABLE FILES"))
{
Print("코드가 있는 테이블 FILES을 삭제하는데 실패 ", GetLastError());
DatabaseClose(db);
return;
}
}
//--- FILES 테이블을 생성
if(!DatabaseExecute(db, "CREATE TABLE FILES("
"NAME TEXT NOT NULL,"
"SIZE INT NOT NULL,"
"PERCENT_SIZE REAL NOT NULL,"
"DATA BLOB NOT NULL);"))
{
Print("DB: 코드가 있는 FILES을 생성하지 못했습니다 ", GetLastError());
DatabaseClose(db);
return;
}
//--- 코드가 있는 FILES 테이블 파일을 생성하지 못했습니다
if(DatabasePrint(db, "PRAGMA TABLE_INFO(FILES)", 0)<0)
{
PrintFormat("DatabasePrint(\"PRAGMA TABLE_INFO(FILES)\") failed, error code=%d at line %d", GetLastError(), __LINE__);
DatabaseClose(db);
return;
}
//--- 매개변수화된 요청을 생성하여 FILES 테이블에 추가
string sql="INSERT INTO FILES (NAME,SIZE,PERCENT_SIZE,DATA)"
" VALUES (?1,?2,?3,?4);"; // 매개변수 요청
int request=DatabasePrepare(db, sql);
if(request==INVALID_HANDLE)
{
PrintFormat("DatabasePrepare() failed with code=%d", GetLastError());
Print("SQL 요청: ", sql);
DatabaseClose(db);
return;
}
//--- 모든 파일을 살펴본 후 FILES 테이블에 추가
bool request_error=false;
DatabaseTransactionBegin(db);
int count=0;
uint size;
for(int i=0; i<files; i++)
{
if(filehandle[i]!=INVALID_HANDLE)
{
char data[];
size=FileReadArray(filehandle[i], data);
if(size==0)
{
PrintFormat("FileReadArray(%s) failed with code %d", selected_files[i], GetLastError());
continue;
}
count++;
//--- 테이블에 파일을 추가하기 전에 매개변수의 값을 설정
if(!DatabaseBind(request, 0, selected_files[i]))
{
PrintFormat("DatabaseBind() failed at line %d with code=%d", __LINE__, GetLastError());
request_error=true;
break;
}
if(!DatabaseBind(request, 1, size))
{
PrintFormat("DatabaseBind() failed at line %d with code=%d", __LINE__, GetLastError());
request_error=true;
break;
}
if(!DatabaseBind(request, 2, double(size)*100./total_size))
{
PrintFormat("DatabaseBind() failed at line %d with code=%d", __LINE__, GetLastError());
request_error=true;
break;
}
if(!DatabaseBindArray(request, 3, data))
{
PrintFormat("DatabaseBind() failed at line %d with code=%d", __LINE__, GetLastError());
request_error=true;
break;
}
//--- 진입 입력 요청을 실행하고 오류를 확인
if(!DatabaseRead(request)&&(GetLastError()!=ERR_DATABASE_NO_MORE_DATA))
{
PrintFormat("DatabaseRead() failed with code=%d", GetLastError());
DatabaseFinalize(request);
request_error=true;
break;
}
else
PrintFormat("%d. %s: %d bytes", count, selected_files[i],size);
//--- 다음 매개변수 업데이트 전에 요청을 재설정
if(!DatabaseReset(request))
{
PrintFormat("DatabaseReset() failed with code=%d", GetLastError());
DatabaseFinalize(request);
request_error=true;
break;
}
}
}
//--- 트랜잭션 상태
if(request_error)
{
PrintFormat("테이블 FILES: %d 파일 추가 실패", count);
DatabaseTransactionRollback(db);
DatabaseClose(db);
return;
}
else
{
DatabaseTransactionCommit(db);
PrintFormat("테이블 FILES: %d 파일 추가", count);
}
//--- 데이터베이스 파일을 닫고 이를 알림
DatabaseClose(db);
PrintFormat("데이터베이스: %s 생성되고 마감됨", filename);
}
|