On Tuesday 19 September 2006 10:47, Joost van der Sluis wrote: > Run it in a debugger and tell us on which line it crashes? The backtrace says it crashes on line 96 - the mysql_query call, I ran it through gdb and got the following output:
(gdb) run Starting program: /tmp/project1 [Thread debugging using libthread_db enabled] [New Thread 16384 (LWP 10618)] Program received signal SIGSEGV, Segmentation fault. [Switching to Thread 16384 (LWP 10618)] 0x40321a08 in mysql_slave_send_query () from /usr/lib/libmysqlclient.so.14 > > And you're using the mysql4 unit. You know what the consequences are? > What's the version of you're mysql-client? Consequences ? I understood that you needed mysql4 for versions after mysql-version 3. I have mysql version 4.1.13. Should I be using a different unit name ? > > (And ask yourself: do I really want to use mysql?) This one I haven't got much choice over. It has to be a network transparent SQL server, and it has to be something just about every distro comes with, and which people know how to use - and some of the component parts will quite possible be written in other languages like PHP (this isn't fixed but quite likely). > > On Tue, 2006-09-19 at 10:13 +0200, A.J. Venter wrote: > > Mmm, > > So does nobody know what I'm doing wrong ? Or is it not a problem in my > > code ? Any idea what I should check ? > > > > A.J. > > > > On Monday 18 September 2006 15:17, A.J. Venter wrote: > > > I have just started on a new project, which is mysql backed - beginning > > > with a fairly abstract unit which a large number of different lazarus > > > programs will use to communicate with the DB. > > > > > > But I ran into a very strange problem quite early on, I can connect to > > > the DB without hassles, but as soon as I try to do a query - I get a > > > crash, and I have no idea why... :S > > > > > > My current test calls look like this: > > > > > > ZC_DBConnect; > > > ZC_Settings : TZC_Settings.Create; > > > Writeln(ZC_Settings.GetPricePerUnit); > > > > > > TraceBack says it's crashing on line 96: > > > if (mysql_query(socket,pchar(Query)) < 0) then > > > > > > > > > The unit in full goes: > > > unit libzybacafe; > > > > > > {$mode objfpc}{$H+} > > > > > > interface > > > > > > uses > > > Classes, SysUtils,dialogs,mysql4; > > > > > > procedure ZC_DBConnect; > > > Function ZC_DBQuery(Query:String):PMYSQL_RES; > > > > > > type > > > TZC_Settings = class > > > private > > > {Private Declarations} > > > FCurrencySymbol : String; > > > FUnitLength : Integer; > > > FPricePerUnit : Real; > > > FResult : PMySQL_RES; > > > FRow: MYSQL_ROW; > > > Procedure LoadFromDB; > > > Procedure SaveToDB; > > > public > > > { public declarations } > > > Function GetCurrencySymbol : String; > > > Function GetUnitLength : Integer; > > > Function GetPricePerUnit: Real; > > > Procedure SetCurrencySymbol(NewSymbol:String); > > > Procedure SetUnitLength(NewLength:Integer); > > > Procedure SetPricePerUnit(NewPrice : Real); > > > end; > > > > > > Var > > > Socket : PMysQL; > > > > > > implementation > > > > > > procedure ZC_DBConnect; > > > Var > > > DBCFG : TSTringList; > > > I : Integer; > > > H,U,P,D : String; > > > qmysql : TMYSQL; > > > alloc : PMYSQL; > > > > > > Begin > > > DBCFG := TSTringList.Create; > > > Try > > > {$IFDEF Unix} > > > DBCFG.LoadFromFile('/etc/zybacafe.cfg'); > > > {$ENDIF} > > > {$IFDEF Win32} > > > DBCFG.LoadFromFile('C:\Program Files\ZybaCafe\zybacafe.cfg'); > > > {$ENDIF} > > > except > > > ShowMessage ('Error Loading database configuration !'); > > > Halt; > > > end; > > > For I := 0 to DBCFG.Count -1 do > > > begin > > > If pos('HOST=',uppercase(DBCFG[I])) <> 0 then > > > begin > > > H := DBCFG[I]; > > > Delete(H,1,pos('=',H)); > > > end; > > > If pos('USERNAME=',uppercase(DBCFG[I])) <> 0 then > > > begin > > > U := DBCFG[I]; > > > Delete(U,1,pos('=',U)); > > > end; > > > If pos('PASSWORD=',uppercase(DBCFG[I])) <> 0 then > > > begin > > > P := DBCFG[I]; > > > Delete(P,1,pos('=',P)); > > > end; > > > If pos('DATABASE=',uppercase(DBCFG[I])) <> 0 then > > > begin > > > D := DBCFG[I]; > > > Delete(D,1,pos('=',D)); > > > end; > > > > > > end; > > > alloc := mysql_init(PMYSQL(@qmysql)); > > > socket := mysql_real_connect(alloc, pchar(h), pchar(u), > > > pchar(p),pchar(d), 0, nil, 0); > > > if socket=Nil then > > > begin > > > ShowMessage('Error connecting to > > > database:'+LineEnding+StrPas(mysql_error(@qmysql))); > > > halt; > > > end; > > > end; > > > > > > Function ZC_DBQuery(Query:String):PMYSQL_RES; > > > Var RecBuf : PMYSQL_RES; > > > Begin > > > if (mysql_query(socket,pchar(Query)) < 0) then > > > begin > > > ShowMessage('Query failed '+ StrPas(mysql_error(socket))); > > > end > > > else > > > begin > > > recbuf := mysql_store_result(socket); > > > if RecBuf=Nil then > > > begin > > > ShowMessage('Query returned nil result.'); > > > end else > > > ZC_DBQuery := RecBuf; > > > end; > > > end; > > > > > > Procedure TZC_Settings.LoadFromDB; > > > Var Result : PMYSQL_RES; > > > Q : String; > > > Begin > > > FResult := ZC_DBQuery('SELECT * FROM settings;'); > > > FRow := Mysql_Fetch_Row(FResult); > > > If FRow = Nil then > > > begin > > > showMessage('You have no stored > > > site-settings.'+LineEnding+'Setting all to defaults'); > > > FCurrencySymbol := '$'; > > > FUnitLength := 1; > > > FPricePerUnit := 1.0; > > > Q := 'INSERT INTO settings VALUES("","'+FCurrencySymbol; > > > Q := > > > Q+'","'+IntToStr(FUnitLength)+'","'+FloatToStr(FPricePerUnit)+'");'; > > > Result := ZC_DBQuery(Q); > > > end else > > > begin > > > FCurrencySymbol := FRow[1]; > > > FUnitLength := StrToInt(FRow[2]); > > > FPricePerUnit := StrToFloat(FRow[3]); > > > end; > > > > > > end; > > > > > > Procedure TZC_Settings.SaveToDB; > > > Var > > > Query : String; > > > Begin > > > Query := 'UPDATE TABLE settings SET > > > currencysymbol="'+FCurrencySymbol; Query := > > > Query+'",unitlength="'+IntToStr(FUnitLength); > > > Query := Query+'",priceperunit="'+FloatToStr(FPricePerUnit)+';'; > > > FResult := ZC_DBQuery(Query); > > > end; > > > > > > Function TZC_Settings.GetCurrencySymbol : String; > > > Begin > > > LoadFromDB; > > > GetCurrencySymbol := FCurrencySymbol; > > > end; > > > > > > Function TZC_Settings.GetUnitLength : Integer; > > > Begin > > > LoadFromDB; > > > GetUnitLength := FUnitLength; > > > end; > > > > > > Function TZC_Settings.GetPricePerUnit: Real; > > > Begin > > > LoadFromDB; > > > GetPricePerUnit := FPricePerUnit; > > > end; > > > > > > Procedure TZC_Settings.SetCurrencySymbol(NewSymbol:String); > > > Begin > > > FCurrencySymbol := NewSymbol; > > > SaveToDB; > > > end; > > > > > > Procedure TZC_Settings.SetUnitLength(NewLength:Integer); > > > Begin > > > FUnitLength := NewLength; > > > SaveToDB; > > > end; > > > > > > Procedure TZC_Settings.SetPricePerUnit(NewPrice : Real); > > > Begin > > > FPricePerUnit := NewPrice; > > > SaveToDB; > > > end; > > > > > > initialization > > > > > > > > > end. -- "80% Of a hardware engineer's job is application of the uncertainty principle. 80% of a software engineer's job is pretending this isn't so." A.J. Venter Chief Software Architect OpenLab International | +27 83 455 99 78 (South Africa) http://www.getopenlab.com | 086 654 2898 (Fax) http://www.silentcoder.co.za | +55 118 162 2079 (Brazil) GPG Key: http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x27CFFE5A
pgprCdUlvj506.pgp
Description: PGP signature