[Gambas-devel] More Database Driver Changes
    Nigel Gerrard 
    linus at ...2...
       
    Mon Apr 19 20:12:39 CEST 2004
    
    
  
Benoit,
Could you have a look at the following changes and feedback your
comments.  The changes apply to gambas-0.92.
The major change is an attempt to implement access to fields with the
same name contained in a multiple table query. e.g.
select fred.field1, sid.field1 from fred, field.
In order for this to work within Postgresql, version 7.4.1 or greater
needs to be available.
Please note that I have defined the $ character to separate
tablename$filedname within the class.  It would be better if '.' could
be used as $ is valid within field/tablename.  In each of my attempts to
use '.' a syntax error is thrown (thus I've gone to $). I'm sure  that
you will be able to get around this.
Project.Module is a rouh demonstration of what I have been trying to
achieve.
The other major change (and probably the one I have not tested enough)
is the use of parameters within .EXEC eg. .Exec("select * from &1",
table) would get evaluated as select * from 'table' which would throw an
error in mysql or postgresql.
Have a look at the changelogs to see what else has been implemented. 
Drop me a line if there is anything you need.
Nigel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: db_changes.tar.gz
Type: application/x-compressed-tar
Size: 11881 bytes
Desc: not available
URL: <http://lists.gambas-basic.org/pipermail/devel/attachments/20040419/fb1fd345/attachment.bin>
-------------- next part --------------
' Gambas class file
PRIVATE $hConn AS NEW Connection
PUBLIC PROCEDURE Main()
  DIM rTest AS Result
  DIM sTable1 AS String
  DIM sTable2 AS String
  sTable1 = "Player"
  sTable2 = "Team"
  WITH $hConn
    '.Type = "postgresql"
    '.Type = "mysql"
    .Type = "sqlite"
    .Host = "localhost"
    
    IF $hConn.Type = "sqlite" THEN  
      '.Host = "/home/ngerrard/gambas-0.91a/app/gambas-database-manager/"
    ELSE
      '.Host = "10.10.10.0"
    ENDIF
    .Login = "ngerrard"
    .Password = ""
  END  WITH
  TRY $hConn.Open
  IF ERROR THEN PRINT "NIGEL: DATABASE NOT Running"
  'END IF
  IF NOT $hConn.Database.Exist("test") THEN
     PRINT "Database does not exist"
     $hConn.Database.Create("test")
     $hConn.Close
     QUIT
  ENDIF
  $hConn.Close
  $hConn.Name = "test"
  $hConn.Open
  ' Create and populate the tables
  Create_tables()
  Enter_details()
  'Test 1
  'rTest = $hConn.Exec("select * from Player,Team where Player.Field2 = Team.id")
  'rTest = $hConn.Exec("select Player.Field1, Team.Field1, Field2 from Player,Team where Player.Field2 = Team.id")
  'Test 2
  'rTest = $hConn.Exec("select Player.Field1 a, Team.Field1 b, Field2 from Player,Team where Player.Field2 = Team.id")
  'Test 3
  'rTest = $hConn.Exec("select a.Field1, b.Field1, Field2 from Player a,Team b where a.Field2 = b.id") '- does not work. Player.Field1 is shown
  'Test 4
  'rTest = $hConn.Exec("select a.Field1 as Foo, b.Field1 as Bar, Field2 from Player a,Team b where a.Field2 = b.id") 
  'Test 5
  rTest = $hConn.Exec("select * from &1, &2 where Player.Field2 = Team.id", sTable1, sTable2)
  PRINT "The select statement contains the following fields:"
  FOR EACH rTest.Field
      PRINT rTest.Field.Name
  NEXT
  PRINT "Type : " & $hConn.Type & " Database : " & $hConn.Name
  PRINT "Records selected :"
  WHILE rTest.Available
        'Test 1
        'PRINT rTest!Player$Field1 & ":" & rTest!Team$Field1 & ":" & rTest!Field2
        'Test 2
        'success for mysql
        'fails for postgresql
        'partly for sqlite
        
        'PRINT rTest!a & ":" & rTest!b & ":" & rTest!Field2 'works with mysql, not with postgresql and sort of works with sqlite
        'Test 3
        'fails for sqlite
        'success for mysql
        'fails for postgresql
        'PRINT rTest!a$Field1 & ":" & rTest!b$Field1 & ":" & rTest!Field2 
        'Test 4
        'For postgresql test: Works
        'PRINT rTest!foo & ":" & rTest!bar & ":" & rTest!Field2 
        'Test 5
        PRINT rTest!Player$Field1 & ":" & rTest!Team$Field1 & ":" & rTest!Field2
        rTest.MoveNext
  WEND
  ' Drop Tables
  $hConn.Tables.Delete("Player")
  $hConn.Tables.Delete("Team")
  $hConn.Close
  PRINT "Ending..."
  'CATCH
  '  PRINT "Nigel: Cannot open database"
END
PUBLIC SUB Create_tables()
  DIM hTable AS Table
  
  IF $hConn.Tables.Exist("Player") THEN
     $hConn.Tables.Delete("Player")
  ENDIF
  IF $hConn.Tables.Exist("Team") THEN
     $hConn.Tables.Delete("Team")
  ENDIF
  IF $hConn.Type = "mysql" THEN  
     hTable = $hConn.Tables.Create("Player","InnoDB")
  ELSE
     hTable = $hConn.Tables.Create("Player")
  ENDIF
  hTable.Field.Create("id", gb.Integer)
  hTable.Field.Create("Field1", gb.String)
  hTable.Field.Create("Field2", gb.Integer)
  hTable.PrimaryKey=["id"]
  hTable.Update
  hTable = $hConn.Tables.Create("Team")
  hTable.Field.Create("id", gb.Integer)
  hTable.Field.Create("Field1", gb.String)
  hTable.PrimaryKey=["id"]
  hTable.Update
  PRINT "Tables successfully Created"
'CATCH
'  PRINT "Unable to Create Table"
END
PUBLIC SUB Enter_details()
  DIM rTest AS Result
  rTest= $hConn.Create("Player")
  rTest!id = 1
  rTest!Field1 = "Kevin Keegan"
  rTest!Field2 = 1
  rTest.Update
  rTest!id = 2
  rTest!Field1 = "Joe Royle"
  rTest!Field2 = 2
  rTest.Update
  rTest= $hConn.Create("Team")
  rTest!id = 1
  rTest!Field1 = "Liverpool"
  rTest.Update
  rTest!id = 2
  rTest!Field1 = "Manchester City"
  rTest.Update
END
    
    
More information about the Devel
mailing list