|
From: Dak <dak...@ya...> - 2005-10-22 18:36:41
|
Hello Rene
I have suggestion, how to regularize differences
between Query and QueryW command in TLiteDB class. I
suggest use in both metods next functions
SQLite3_Prepare(16), SQLite3_Step and
SQLite3_Finalize, because this way makes it possible
returns more complex info about returned columns in
ResultSet. I will place current implementation Query
metod (with SQLite_exec function) for example in to
new metod SimpleQuery or i dont use this anyway. I
will changne this, that SimpleQuery return no
resultset and be very simple. The final solution
depends on you. In actual implementation of metods
Query and QueryW is couple of missing thigs. If i want
get content table (for exapmle SELECT * FROM Table1;)
and table is full empty (has no row), both metods dont
return name of columns. In DB browser i need show name
of columns even if table is full empty too. Metod
QueryW dont support execution of SQL multistatements.
All this missing thigs i try solve in my proposal. My
proposal looks like in this next metods, it is noly
pseudo-code, full implementation depends on you, you
know your code complex and in detail.
function TLiteDB.SimpleQuery(SQL: String): Boolean;
begin
use classic way with SQLite_exec. Maybe is possible
completely leave out @QueryCallBack function. Then is
possible use this function for speed execution of
large, a lot of sql statements which dont need
ResultSet.
end;
function TLiteDB.Query(SQL: String): Boolean;
var
SQLStatement: PAnsiChar;
Stmt: Pointer;
sr,qr: Integer;
FLastError: Integer;
begin
SQLStatement := PAnsiChar(SQL);
repeat
try
FLastError := SQLite3_prepare(FBaseInfo.FHandle,
SQLStatement, -1, Stmt, SQLStatement);
if FLastError = SQLite_OK then
begin
//This must be first, to get definition of
columns even if table is include no rows
//This one you execute very pretty in function
StoreFields3, but this must be first!
if Not FieldDef then
begin
Columns := SQLite3_Column_count(Stmt);
for i := 0 to Columns - 1 do
begin
name := Sqlite3_Column_Name(Stmt, i);
_datatype := Sqlite3_Column_Type (Stmt,
i);
end;
end;
sr := SQLite3_step (Stmt);
while sr=SQLITE_BUSY do
begin
sleep(0);
sr := SQLite3_step (Stmt);
end;
while sr=SQLITE_ROW do
begin
//Geting simple fields of current row
//This one you execute very pretty in
function StoreRow3
Columns := SQLite3_Column_count(Stmt);
for i := 0 to Columns - 1 do
begin
Value := SQLite3_Column_Text(Stmt, i);
end;
sr := SQLite3_step(Stmt);
while sr=SQLITE_BUSY do
begin
sleep(0);
sr := SQLite3_step (Stmt);
end;
end;
if sr in [SQLITE_ERROR, SQLITE_MISUSE] then
begin
FLastErrorText :=
SQLite3_errormsg(FBaseInfo.FHandle);
FLastError :=
SQLite3_errcode(FBaseInfo.FHandle);
end
else
begin
FLastErrorText := '';
FLastError := 0;
end;
end
else
FLastErrorText := SQLite3_errormsg
(FBaseInfo.FHandle);
finally
//I see this finalisation in others SQLite
wrappers and works well
SQLite3_reset(Stmt);
SQLite3_finalize(Stmt);
end;
until SQLStatement^ = #0; //This one solve problem
with SQL Multi-Statement
end;
function TLiteDB.QueryW(SQL: WideString): Boolean;
var
SQLStatement: PWideChar;
Stmt: Pointer;
sr,qr: Integer;
FLastError: Integer;
begin
SQLStatement := PAnsiChar(SQL);
repeat
try
FLastError :=
SQLite3_prepare16(FBaseInfo.FHandle, SQLStatement, -1,
Stmt, SQLStatement);
if FLastError = SQLite_OK then
begin
//This must be first, to get definition of
columns even if table is include no rows
//This one you execute very pretty in function
StoreFields3, but this must be first!
if Not FieldDef then
begin
Columns := SQLite3_Column_count(Stmt);
for i := 0 to Columns - 1 do
begin
name := Sqlite3_Column_Name16(Stmt, i);
_datatype := Sqlite3_Column_Type (Stmt,
i);
end;
end;
sr := SQLite3_step (Stmt);
while sr=SQLITE_BUSY do
begin
sleep(0);
sr := SQLite3_step (Stmt);
end;
while sr=SQLITE_ROW do
begin
//Geting simple fields of current row
//This one you execute very pretty in
function StoreRow3
Columns := SQLite3_Column_count(Stmt);
for i := 0 to Columns - 1 do
begin
Value := SQLite3_Column_Text16(Stmt, i);
end;
sr := SQLite3_step(Stmt);
while sr=SQLITE_BUSY do
begin
sleep(0);
sr := SQLite3_step (Stmt);
end;
end;
if sr in [SQLITE_ERROR, SQLITE_MISUSE] then
begin
FLastErrorText :=
SQLite3_errormsg16(FBaseInfo.FHandle);
FLastError :=
SQLite3_errcode(FBaseInfo.FHandle);
end
else
begin
FLastErrorText := '';
FLastError := 0;
end;
end
else
FLastErrorText := SQLite3_errormsg16
(FBaseInfo.FHandle);
finally
//I see this finalisation in others SQLite
wrappers and works well
SQLite3_reset(Stmt);
SQLite3_finalize(Stmt);
end;
until SQLStatement^ = #0; //This one solve problem
with SQL Multi-Statement
end;
Thanks my riend Flyman for his help with translation.
Dak
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
|
|
From: <re...@du...> - 2005-10-22 19:00:39
|
hi, like to ask you again.. please download tortoisecvs (or some other cvs client), and tell me the name of your sourceforge account. cvs is so convenient for this, and i may make less errors merging.. Dak wrote: >Hello Rene > >I have suggestion, how to regularize differences >between Query and QueryW command in TLiteDB class. I >suggest use in both metods next functions >SQLite3_Prepare(16), SQLite3_Step and >SQLite3_Finalize, because this way makes it possible >returns more complex info about returned columns in >ResultSet. I will place current implementation Query >metod (with SQLite_exec function) for example in to >new metod SimpleQuery or i dont use this anyway. I >will changne this, that SimpleQuery return no >resultset and be very simple. The final solution >depends on you. In actual implementation of metods >Query and QueryW is couple of missing thigs. If i want >get content table (for exapmle SELECT * FROM Table1;) >and table is full empty (has no row), both metods dont >return name of columns. In DB browser i need show name >of columns even if table is full empty too. Metod >QueryW dont support execution of SQL multistatements. >All this missing thigs i try solve in my proposal. My >proposal looks like in this next metods, it is noly >pseudo-code, full implementation depends on you, you >know your code complex and in detail. > >function TLiteDB.SimpleQuery(SQL: String): Boolean; >begin > use classic way with SQLite_exec. Maybe is possible >completely leave out @QueryCallBack function. Then is >possible use this function for speed execution of >large, a lot of sql statements which dont need >ResultSet. >end; > >function TLiteDB.Query(SQL: String): Boolean; >var > SQLStatement: PAnsiChar; > Stmt: Pointer; > sr,qr: Integer; > FLastError: Integer; >begin > SQLStatement := PAnsiChar(SQL); > > repeat > > try > FLastError := SQLite3_prepare(FBaseInfo.FHandle, >SQLStatement, -1, Stmt, SQLStatement); > > if FLastError = SQLite_OK then > begin > //This must be first, to get definition of >columns even if table is include no rows > //This one you execute very pretty in function >StoreFields3, but this must be first! > if Not FieldDef then > begin > Columns := SQLite3_Column_count(Stmt); > for i := 0 to Columns - 1 do > begin > name := Sqlite3_Column_Name(Stmt, i); > _datatype := Sqlite3_Column_Type (Stmt, >i); > end; > end; > > sr := SQLite3_step (Stmt); > > while sr=SQLITE_BUSY do > begin > sleep(0); > sr := SQLite3_step (Stmt); > end; > > while sr=SQLITE_ROW do > begin > //Geting simple fields of current row > //This one you execute very pretty in >function StoreRow3 > Columns := SQLite3_Column_count(Stmt); > for i := 0 to Columns - 1 do > begin > Value := SQLite3_Column_Text(Stmt, i); > end; > sr := SQLite3_step(Stmt); > while sr=SQLITE_BUSY do > begin > sleep(0); > sr := SQLite3_step (Stmt); > end; > end; > > if sr in [SQLITE_ERROR, SQLITE_MISUSE] then > begin > FLastErrorText := >SQLite3_errormsg(FBaseInfo.FHandle); > FLastError := >SQLite3_errcode(FBaseInfo.FHandle); > end > else > begin > FLastErrorText := ''; > FLastError := 0; > end; > end > else > FLastErrorText := SQLite3_errormsg >(FBaseInfo.FHandle); > > finally > //I see this finalisation in others SQLite >wrappers and works well > SQLite3_reset(Stmt); > SQLite3_finalize(Stmt); > end; > > until SQLStatement^ = #0; //This one solve problem >with SQL Multi-Statement > >end; > >function TLiteDB.QueryW(SQL: WideString): Boolean; >var > SQLStatement: PWideChar; > Stmt: Pointer; > sr,qr: Integer; > FLastError: Integer; >begin > SQLStatement := PAnsiChar(SQL); > > repeat > > try > FLastError := >SQLite3_prepare16(FBaseInfo.FHandle, SQLStatement, -1, >Stmt, SQLStatement); > > if FLastError = SQLite_OK then > begin > //This must be first, to get definition of >columns even if table is include no rows > //This one you execute very pretty in function >StoreFields3, but this must be first! > if Not FieldDef then > begin > Columns := SQLite3_Column_count(Stmt); > for i := 0 to Columns - 1 do > begin > name := Sqlite3_Column_Name16(Stmt, i); > _datatype := Sqlite3_Column_Type (Stmt, >i); > end; > end; > > sr := SQLite3_step (Stmt); > > while sr=SQLITE_BUSY do > begin > sleep(0); > sr := SQLite3_step (Stmt); > end; > > while sr=SQLITE_ROW do > begin > //Geting simple fields of current row > //This one you execute very pretty in >function StoreRow3 > Columns := SQLite3_Column_count(Stmt); > for i := 0 to Columns - 1 do > begin > Value := SQLite3_Column_Text16(Stmt, i); > end; > sr := SQLite3_step(Stmt); > while sr=SQLITE_BUSY do > begin > sleep(0); > sr := SQLite3_step (Stmt); > end; > end; > > if sr in [SQLITE_ERROR, SQLITE_MISUSE] then > begin > FLastErrorText := >SQLite3_errormsg16(FBaseInfo.FHandle); > FLastError := >SQLite3_errcode(FBaseInfo.FHandle); > end > else > begin > FLastErrorText := ''; > FLastError := 0; > end; > end > else > FLastErrorText := SQLite3_errormsg16 >(FBaseInfo.FHandle); > > finally > //I see this finalisation in others SQLite >wrappers and works well > SQLite3_reset(Stmt); > SQLite3_finalize(Stmt); > end; > > until SQLStatement^ = #0; //This one solve problem >with SQL Multi-Statement > >end; > >Thanks my riend Flyman for his help with translation. > >Dak > > > >__________________________________________________ >Do You Yahoo!? >Tired of spam? Yahoo! Mail has the best spam protection around >http://mail.yahoo.com > > >------------------------------------------------------- >This SF.Net email is sponsored by the JBoss Inc. >Get Certified Today * Register for a JBoss Training Course >Free Certification Exam for All Training Attendees Through End of 2005 >Visit http://www.jboss.com/services/certification for more information >_______________________________________________ >libsql-discussion mailing list >lib...@li... >https://lists.sourceforge.net/lists/listinfo/libsql-discussion > > |