in metadata.go [608:739]
func getTableMetadata(session *Session, keyspaceName string) ([]TableMetadata, error) {
var (
iter *Iter
scan func(iter *Iter, table *TableMetadata) bool
stmt string
keyAliasesJSON []byte
columnAliasesJSON []byte
)
if session.useSystemSchema { // Cassandra 3.x+
stmt = `
SELECT
table_name
FROM system_schema.tables
WHERE keyspace_name = ?`
switchIter := func() *Iter {
iter.Close()
stmt = `
SELECT
view_name
FROM system_schema.views
WHERE keyspace_name = ?`
iter = session.control.query(stmt, keyspaceName)
return iter
}
scan = func(iter *Iter, table *TableMetadata) bool {
r := iter.Scan(
&table.Name,
)
if !r {
iter = switchIter()
if iter != nil {
switchIter = func() *Iter { return nil }
r = iter.Scan(&table.Name)
}
}
return r
}
} else if session.cfg.ProtoVersion == protoVersion1 {
// we have key aliases
stmt = `
SELECT
columnfamily_name,
key_validator,
comparator,
default_validator,
key_aliases,
column_aliases,
value_alias
FROM system.schema_columnfamilies
WHERE keyspace_name = ?`
scan = func(iter *Iter, table *TableMetadata) bool {
return iter.Scan(
&table.Name,
&table.KeyValidator,
&table.Comparator,
&table.DefaultValidator,
&keyAliasesJSON,
&columnAliasesJSON,
&table.ValueAlias,
)
}
} else {
stmt = `
SELECT
columnfamily_name,
key_validator,
comparator,
default_validator
FROM system.schema_columnfamilies
WHERE keyspace_name = ?`
scan = func(iter *Iter, table *TableMetadata) bool {
return iter.Scan(
&table.Name,
&table.KeyValidator,
&table.Comparator,
&table.DefaultValidator,
)
}
}
iter = session.control.query(stmt, keyspaceName)
tables := []TableMetadata{}
table := TableMetadata{Keyspace: keyspaceName}
for scan(iter, &table) {
var err error
// decode the key aliases
if keyAliasesJSON != nil {
table.KeyAliases = []string{}
err = json.Unmarshal(keyAliasesJSON, &table.KeyAliases)
if err != nil {
iter.Close()
return nil, fmt.Errorf(
"invalid JSON value '%s' as key_aliases for in table '%s': %v",
keyAliasesJSON, table.Name, err,
)
}
}
// decode the column aliases
if columnAliasesJSON != nil {
table.ColumnAliases = []string{}
err = json.Unmarshal(columnAliasesJSON, &table.ColumnAliases)
if err != nil {
iter.Close()
return nil, fmt.Errorf(
"invalid JSON value '%s' as column_aliases for in table '%s': %v",
columnAliasesJSON, table.Name, err,
)
}
}
tables = append(tables, table)
table = TableMetadata{Keyspace: keyspaceName}
}
err := iter.Close()
if err != nil && err != ErrNotFound {
return nil, fmt.Errorf("error querying table schema: %v", err)
}
return tables, nil
}