Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Implement Connection.Indexes().
  • Loading branch information
rowland committed Oct 18, 2013
1 parent 82a4866 commit 6733e4e
Show file tree
Hide file tree
Showing 5 changed files with 109 additions and 4 deletions.
35 changes: 35 additions & 0 deletions connection.go
Expand Up @@ -206,6 +206,41 @@ func (conn *Connection) IndexColumns(indexName string) (names []string, err erro
return conn.names(sql, indexName)
}

func (conn *Connection) Indexes() (indexes []*Index, err error) {
const sql = `SELECT RDB$INDICES.RDB$RELATION_NAME, RDB$INDICES.RDB$INDEX_NAME, RDB$INDICES.RDB$UNIQUE_FLAG, RDB$INDICES.RDB$INDEX_TYPE
FROM RDB$INDICES
JOIN RDB$RELATIONS ON RDB$INDICES.RDB$RELATION_NAME = RDB$RELATIONS.RDB$RELATION_NAME
WHERE (RDB$RELATIONS.RDB$SYSTEM_FLAG <> 1 OR RDB$RELATIONS.RDB$SYSTEM_FLAG IS NULL);`
var cursor *Cursor
if cursor, err = conn.Execute(sql); err != nil {
return
}
defer cursor.Close()

for cursor.Next() {
var index Index
if err = cursor.Scan(&index.TableName, &index.Name, &index.Unique, &index.Unique); err != nil {
return
}
index.Name = strings.TrimRightFunc(index.Name, unicode.IsSpace)
index.TableName = strings.TrimRightFunc(index.TableName, unicode.IsSpace)
if index.Columns, err = conn.IndexColumns(index.Name); err != nil {
return
}
if conn.database.LowercaseNames && !hasLowercase(index.Name) {
index.Name = strings.ToLower(index.Name)
}
if conn.database.LowercaseNames && !hasLowercase(index.TableName) {
index.TableName = strings.ToLower(index.TableName)
}
indexes = append(indexes, &index)
}
if cursor.Err() != io.EOF {
err = cursor.Err()
}
return
}

func (conn *Connection) names(sql string, args ...interface{}) (names []string, err error) {
var cursor *Cursor
if cursor, err = conn.Execute(sql, args...); err != nil {
Expand Down
66 changes: 64 additions & 2 deletions connection_test.go
Expand Up @@ -714,7 +714,7 @@ func TestPrimaryKeyCompound(t *testing.T) {
if pk, err = conn.PrimaryKey("TEST"); err != nil {
t.Fatal(err)
}

exp := []string{"ID", "NAME"}
if !reflect.DeepEqual(exp, pk) {
t.Errorf("Expected %v, got %v", exp, pk)
Expand All @@ -741,9 +741,71 @@ func TestIndexColumns(t *testing.T) {
if pk, err = conn.IndexColumns("PK"); err != nil {
t.Fatal(err)
}

exp := []string{"ID", "NAME"}
if !reflect.DeepEqual(exp, pk) {
t.Errorf("Expected %v, got %v", exp, pk)
}
}

func TestIndexes(t *testing.T) {
st := SuperTest{t}
os.Remove(TestFilename)

conn, err := Create(TestConnectionString)
if err != nil {
t.Fatalf("Unexpected error creating database: %s", err)
}
defer conn.Drop()

const sqlSchema = `
create table test(id int not null, name varchar(20) not null);
alter table test add constraint pk primary key(id, name);`
if err = conn.ExecuteScript(sqlSchema); err != nil {
t.Fatalf("Error executing schema: %s", err)
}

indexes, err := conn.Indexes()
if err != nil {
t.Fatal(err)
}
st.MustEqual(1, len(indexes))
st.Equal("PK", indexes[0].Name)
st.Equal("TEST", indexes[0].TableName)
st.False(indexes[0].Unique.Value)
st.False(indexes[0].Descending.Value)
st.MustEqual(2, len(indexes[0].Columns))
st.Equal("ID", indexes[0].Columns[0])
st.Equal("NAME", indexes[0].Columns[1])
}

func TestIndexesLower(t *testing.T) {
st := SuperTest{t}
os.Remove(TestFilename)

conn, err := Create(TestConnectionStringLowerNames)
if err != nil {
t.Fatalf("Unexpected error creating database: %s", err)
}
defer conn.Drop()

const sqlSchema = `
create table test(id int not null, name varchar(20) not null);
alter table test add constraint pk primary key(id, name);`
if err = conn.ExecuteScript(sqlSchema); err != nil {
t.Fatalf("Error executing schema: %s", err)
}

indexes, err := conn.Indexes()
if err != nil {
t.Fatal(err)
}
st.MustEqual(1, len(indexes))
st.Equal("pk", indexes[0].Name)
st.Equal("test", indexes[0].TableName)
st.False(indexes[0].Unique.Value)
st.False(indexes[0].Descending.Value)
st.MustEqual(2, len(indexes[0].Columns))
st.Equal("id", indexes[0].Columns[0])
st.Equal("name", indexes[0].Columns[1])
}
1 change: 0 additions & 1 deletion database_test.go
Expand Up @@ -10,7 +10,6 @@ import (
const (
TestFilename = "/var/fbdata/go-fb-test.fdb"
TestTimezone = "US/Arizona"
// TestTimezone = "UTC"
TestConnectionString = "database=localhost:/var/fbdata/go-fb-test.fdb; username=gotest; password=gotest; charset=NONE; role=READER; timezone=" + TestTimezone + ";"
TestConnectionString2 = "database=localhost:/var/fbdata/go-fb-test.fdb;username=gotest;password=gotest;lowercase_names=true;page_size=2048"
TestConnectionString3 = "database=localhost:/var/fbdata/go-fb-test.fdb;username=bogus;password=gotest;lowercase_names=true;page_size=2048"
Expand Down
9 changes: 9 additions & 0 deletions index.go
@@ -0,0 +1,9 @@
package fb

type Index struct {
Name string
TableName string
Unique NullableBool
Descending NullableBool
Columns []string
}
2 changes: 1 addition & 1 deletion support_test.go
Expand Up @@ -685,7 +685,7 @@ func TestConvertValue_time(t *testing.T) {
if tm2 != dt {
t.Errorf("Expected %v, got %v", tm)
}

var nt NullableTime
if err = ConvertValue(&nt, dt); err != nil {
t.Error(err)
Expand Down

0 comments on commit 6733e4e

Please sign in to comment.