| 16 |   |     raise NotImplementedError | 
          
          
            |   | 35 |     """ | 
          
          
            |   | 36 |     Returns a dictionary of {field_index: (field_index_other_table, other_table)} | 
          
          
            |   | 37 |     representing all relationships to the given table. Indexes are 0-based. | 
          
          
            |   | 38 |     """ | 
          
          
            |   | 39 |     my_field_dict = _name_to_index(cursor, table_name) | 
          
          
            |   | 40 |     constraints = [ ] | 
          
          
            |   | 41 |     relations = {} | 
          
          
            |   | 42 |      | 
          
          
            |   | 43 |     try: | 
          
          
            |   | 44 |         # This should work for MySQL 5.0 | 
          
          
            |   | 45 |         # Shouldn't we limit the select to table_schema? | 
          
          
            |   | 46 |         cursor.execute( | 
          
          
            |   | 47 |             """select column_name, referenced_table_name, referenced_column_name | 
          
          
            |   | 48 |                from information_schema.key_column_usage | 
          
          
            |   | 49 |                where table_name = %s | 
          
          
            |   | 50 |                  and referenced_table_name is not null | 
          
          
            |   | 51 |                  and referenced_column_name is not null""", | 
          
          
            |   | 52 |             [table_name]) | 
          
          
            |   | 53 |         constraints.extend(cursor.fetchall()) | 
          
          
            |   | 54 |     except OperationalError: | 
          
          
            |   | 55 |         # Fall back to `show create table` | 
          
          
            |   | 56 |         # go through all constraints (== matches) and save these | 
          
          
            |   | 57 |         cursor.execute("SHOW CREATE TABLE "+ table_name) | 
          
          
            |   | 58 |         for row in cursor.fetchall(): | 
          
          
            |   | 59 |             pos = 0 | 
          
          
            |   | 60 |             while True: | 
          
          
            |   | 61 |                 match = FKEY_PARSER.search(row[1], pos) | 
          
          
            |   | 62 |                 if match == None: | 
          
          
            |   | 63 |                     break | 
          
          
            |   | 64 |                 pos = match.end() | 
          
          
            |   | 65 |                 constraints.append(match.groups()) | 
          
          
            |   | 66 |  | 
          
          
            |   | 67 |     # handle constraints. (can't do this in the loop above since we need the cursor in both places) | 
          
          
            |   | 68 |     for (my_fieldname, other_table, other_field) in constraints: | 
          
          
            |   | 69 |         other_field_index = _name_to_index(cursor, other_table)[other_field] | 
          
          
            |   | 70 |         my_field_index = my_field_dict[my_fieldname] | 
          
          
            |   | 71 |         relations[my_field_index] = (other_field_index, other_table) | 
          
          
            |   | 72 |     return relations |