1from SQLGenerator import SQLGenerator
2
3
4class MySQLSQLGenerator(SQLGenerator):
5
6    def sqlSupportsDefaultValues(self):
7        return True
8
9
10class Klasses(object):
11
12    def dropDatabaseSQL(self, dbName):
13        return 'drop database if exists %s;\n' % dbName
14
15    def dropTablesSQL(self):
16        sql = []
17        for tableName in reversed(self.auxiliaryTableNames()):
18            sql.append('drop table if exists %s;\n' % tableName)
19        for klass in reversed(self._model._allKlassesInOrder):
20            sql.append('drop table if exists %s;\n' % klass.name())
21        sql.append('\n')
22        return ''.join(sql)
23
24    def createDatabaseSQL(self, dbName):
25        return 'create database %s;\n' % dbName
26
27    def useDatabaseSQL(self, dbName):
28        return 'use %s;\n\n' % dbName
29
30    def listTablesSQL(self):
31        return 'show tables\n\n'
32
33
34class Klass(object):
35
36    def writePostCreateTable(self, generator, out):
37        start = self.setting('StartingSerialNum', None)
38        if start:
39            out.write('alter table %s auto_increment=%s;\n' % (
40                self.sqlTableName(), start))
41
42    def primaryKeySQLDef(self, generator):
43        return '    %s int not null primary key auto_increment,\n' % (
44            self.sqlSerialColumnName().ljust(self.maxNameWidth()),)
45
46    def writeIndexSQLDefsInTable(self, wr):
47        for attr in self.allAttrs():
48            if attr.boolForKey('isIndexed') and attr.hasSQLColumn():
49                wr(',\n')
50                wr('    index (%s)' % attr.sqlName())
51        wr('\n')
52
53
54class EnumAttr(object):
55
56    def nativeEnumSQLType(self):
57        return 'enum(%s)' % ', '.join(['"%s"' % enum for enum in self.enums()])
58
59
60class StringAttr(object):
61
62    def sqlType(self):
63        # @@ 2000-11-11 ce: cache this
64        if not self.get('Max'):
65            return 'varchar(100) /* WARNING: NO LENGTH SPECIFIED */'
66        max = int(self['Max'])  # @@ 2000-11-12 ce: won't need int() after using types
67        if max > 65535:
68            return 'longtext'
69        if max > 255:
70            return 'text'
71        if self.get('Min') and int(self['Min']) == max:
72            return 'char(%s)' % max
73        else:
74            return 'varchar(%s)' % max
75
76
77class ObjRefAttr(object):
78
79    def sqlType(self):
80        if self.setting('UseBigIntObjRefColumns', False):
81            return 'bigint unsigned /* %s */' % self['Type']
82        else:
83            return 'int unsigned'
84