'CreateTable(table, columns) - Create a new table in the database.
raises TableDBError if it already exists or for other DB errors.'

def CreateTable(self, table, columns):

    assert isinstance(columns, list)
    txn = None
    try:
        if contains_metastrings(table):
            raise ValueError('bad    table    name:    contains    reserved    metastrings')
        for column in columns:
            if contains_metastrings(column):
                raise ValueError('bad    column    name:    contains    reserved    metastrings')
        columnlist_key = _columns_key(table)
        if getattr(self.db, 'has_key')(columnlist_key):
            raise TableAlreadyExists, 'table    already    exists'
        txn = self.env.txn_begin()
        getattr(self.db, 'put_bytes', self.db.put)(columnlist_key, pickle.dumps(columns, 1), txn=txn)
        tablelist = pickle.loads(getattr(self.db, 'get_bytes', self.db.get)(_table_names_key, txn=txn, flags=db.DB_RMW))
        tablelist.append(table)
        self.db.delete(_table_names_key, txn=txn)
        getattr(self.db, 'put_bytes', self.db.put)(_table_names_key, pickle.dumps(tablelist, 1), txn=txn)
        txn.commit()
        txn = None
    except db.DBError as dberror:
        if txn:
            txn.abort()
        if (sys.version_info < (2, 6)):
            raise TableDBError, dberror[1]
        else:
            raise TableDBError, dberror.args[1]
