PostgresqlPatch: pgsql_patch_11.diff

File pgsql_patch_11.diff, 58.1 kB (added by brad <brad@dsource.org>, 3 years ago)
  • scripts/trac-admin

    old new  
    2727import time 
    2828import cmd 
    2929import shlex 
    30 import sqlite 
    3130import StringIO 
     31import traceback 
    3232 
    3333from trac import perm 
    3434from trac import util 
     
    9393            return 0 
    9494        return 1 
    9595         
    96     def env_create(self): 
     96    def env_create(self, db_str): 
    9797        try: 
    98             self.__env = trac.Environment.Environment (self.envname, create=1
     98            self.__env = trac.Environment.Environment (self.envname, 1, db_str
    9999            return self.__env 
    100100        except Exception, e: 
    101101            print 'Failed to create environment.', e 
     
    112112 
    113113    def db_execsql (self, sql, cursor=None): 
    114114        data = [] 
     115        row = None 
    115116        if not cursor: 
    116117            cnx=self.db_open() 
    117118            cursor = cnx.cursor() 
     
    119120            cnx = None 
    120121        cursor.execute(sql) 
    121122        while 1: 
    122             row = cursor.fetchone() 
     123            try: 
     124                row = cursor.fetchone() 
     125            except: 
     126                pass 
    123127            if row == None: 
    124128                break 
    125129            data.append(row) 
     
    452456 
    453457    ## Initenv 
    454458    _help_initenv = [('initenv', 'Create and initialize a new environment interactively'), 
    455                      ('initenv <projectname> <repospath> <templatepath>', 
     459                     ('initenv <projectname> <repospath> <templatepath> <dbms> [dbms options]', 
    456460                      'Create and initialize a new environment from arguments')] 
    457461 
    458462    def do_initdb(self, line): 
     
    485489        dt = trac.siteconfig.__default_templates_dir__ 
    486490        prompt = 'Templates directory [%s]> ' % dt 
    487491        returnvals.append(raw_input(prompt) or dt) 
     492        print 
     493        print " Please enter the database in which you wish to store Trac data." 
     494        print " Default is 'sqlite', but others are supported:" 
     495        print " 'sqlite' - SQLite       http://www.sqlite.org" 
     496        print " 'pgsql'  - PostgreSQL   http://www.postgresql.org" 
     497        print 
     498        ddb = "sqlite" 
     499        prompt =  'database system [%s]> ' % ddb 
     500        dbms = raw_input(prompt) or ddb 
     501        returnvals.append(dbms) 
     502         
     503        # PostgreSQL - additional questions 
     504        if dbms == "pgsql": 
     505            print 
     506            print " Please enter the host of your PostgreSQL database." 
     507            print " Default is 'localhost'" 
     508            print 
     509            host = "localhost" 
     510            prompt = "PostgreSQL host [%s]> " % host 
     511            returnvals.append(raw_input(prompt) or host) 
     512             
     513            print 
     514            print " Please enter the port of your PostgreSQL database." 
     515            print " Default is '5432'" 
     516            print 
     517            port = "5432" 
     518            prompt = "PostgreSQL port [%s]> " % port 
     519            returnvals.append(raw_input(prompt) or port) 
     520             
     521            print 
     522            print " Please enter the name of your PostgreSQL database." 
     523            print " Default is 'trac'" 
     524            print " Note: This database should not exist, as trac-admin will" \ 
     525                  " attempt to create it." 
     526            print 
     527            name = "trac" 
     528            prompt = "PostgreSQL database [%s]> " % name 
     529            returnvals.append(raw_input(prompt) or name) 
     530             
     531            print 
     532            print " Please enter the user of your PostgreSQL database." 
     533            print " Default is 'trac'" 
     534            print 
     535            user = "trac" 
     536            prompt = "PostgreSQL user [%s]> " % user 
     537            returnvals.append(raw_input(prompt) or user) 
     538             
     539            print 
     540            print " Please enter the password of your PostgreSQL database." 
     541            print " Default is 'trac'" 
     542            print 
     543            password = "trac" 
     544            prompt = "PostgreSQL password [%s]> " % password 
     545            returnvals.append(raw_input(prompt) or password) 
     546             
    488547        return returnvals 
    489548          
    490549    def do_initenv(self, line): 
     
    495554        project_name = None 
    496555        repository_dir = None 
    497556        templates_dir = None 
     557        db_str = None 
    498558        if len(arg) == 1: 
    499559            returnvals = self.get_initenv_args() 
    500560            project_name = returnvals[0] 
    501561            repository_dir = returnvals[1] 
    502562            templates_dir = returnvals[2] 
    503         elif len(arg)!= 3: 
     563            db_str = returnvals[3] 
     564        elif len(arg) < 4: 
    504565            print 'Wrong number of arguments to initenv %d' % len(arg) 
    505566            return 
    506567        else: 
    507568            project_name = arg[0] 
    508569            repository_dir = arg[1] 
    509570            templates_dir = arg[2] 
     571            db_str = arg[3] 
     572         
     573        # sqlite-specific stuff 
     574        if db_str.lower() == "sqlite": 
     575            db_str = 'sqlite:"db/trac.db",timeout=10000' 
     576         
     577        # postgres-specific stuff 
     578        if db_str.lower() == "pgsql": 
     579            if len(arg) == 1: 
     580                host = returnvals[4] 
     581                port = returnvals[5] 
     582                database = returnvals[6] 
     583                user = returnvals[7] 
     584                password = returnvals[8] 
     585            elif len(arg) != 9: 
     586                print 'Wrong number of arguments to initenv %d' % len(arg) 
     587                print 'For PostgreSQL (after pgsql): <host> <port> <database>' \ 
     588                      ' <user> <password>' 
     589                return 
     590            else: 
     591                host = arg[4] 
     592                port = arg[5] 
     593                database = arg[6] 
     594                user = arg[7] 
     595                password = arg[8] 
     596            db_str = "pgsql:\"\",host='%s:%s',database='%s',user='%s'," \ 
     597                     "password='%s'" \ 
     598                     % (host, port, database, user, password) 
     599            createdb_str = "createdb --host=%s --port=%s --owner=%s " \ 
     600                           "--username=%s %s\n" \ 
     601                           % (host, port, user, user, database) 
     602            print createdb_str 
     603            try: 
     604                # TODO: this is not cross-platform. 
     605                # for Windows, look at win32pipe.popen() 
     606                os.popen(createdb_str) 
     607            except Exception, e: 
     608                print "Error creating PostgreSQL database: %s" % e 
     609                print "command: %s" % createdb_str 
     610         
    510611        from svn import util, repos, core 
    511612        core.apr_initialize() 
    512613        pool = core.svn_pool_create(None) 
     
    525626            return 
    526627        try: 
    527628            print 'Creating and Initializing Project' 
    528             self.env_create(
     629            self.env_create(db_str
    529630            cnx = self.__env.get_db_cnx() 
    530631            print ' Inserting default data' 
    531632            self.__env.insert_default_data() 
     
    664765                self.do_help ('wiki') 
    665766        except Exception, e: 
    666767            print 'Wiki %s failed:' % arg[0], e 
     768            print traceback.print_exc() 
     769             
    667770 
    668771    def _do_wiki_list(self): 
    669772        data = self.db_execsql('SELECT name,max(version),time' 
     
    794897        self.print_listing(['Possible Values'], data) 
    795898 
    796899    def _do_enum_add(self, type, name): 
     900 
    797901        sql = ("INSERT INTO enum(value,type,name) " 
    798902               " SELECT 1+COALESCE(max(value),0),'%(type)s','%(name)s'" 
    799903               "   FROM enum WHERE type='%(type)s'"  
  • trac/db_default.py

    old new  
    172172CREATE INDEX session_idx        ON session(sid,var_name); 
    173173""" 
    174174 
     175schema_pgsql = """ 
     176CREATE TABLE revision ( 
     177        rev             integer, 
     178        time            integer, 
     179        author          text, 
     180        message         text, 
     181        CONSTRAINT revision_pkey PRIMARY KEY (rev) 
     182); 
     183 
     184CREATE TABLE node_change ( 
     185        rev             integer, 
     186        name            text, 
     187        change          char(1), 
     188        CONSTRAINT node_change_pkey PRIMARY KEY (rev, name, change) 
     189); 
     190 
     191CREATE TABLE auth_cookie ( 
     192        cookie          text, 
     193        name            text, 
     194        ipnr            text, 
     195        time            integer, 
     196        CONSTRAINT auth_cookie_pkey PRIMARY KEY(cookie, name, ipnr) 
     197); 
     198 
     199CREATE TABLE enum ( 
     200        type            text, 
     201        name            text, 
     202        value           integer, 
     203        CONSTRAINT enum_pkey PRIMARY KEY(name,type) 
     204); 
     205 
     206CREATE TABLE system ( 
     207        name            text, 
     208        value           text, 
     209        CONSTRAINT system_pkey PRIMARY KEY(name) 
     210); 
     211 
     212CREATE TABLE lock ( 
     213        name            text, 
     214        owner           text, 
     215        ipnr            text, 
     216        time            integer, 
     217        CONSTRAINT lock_pkey PRIMARY KEY(name) 
     218); 
     219 
     220--CREATE SEQUENCE ticket_id_seq; 
     221CREATE TABLE ticket ( 
     222        id              serial, 
     223        time            integer,        -- the time it was created 
     224        changetime      integer, 
     225        component       text, 
     226        severity        text, 
     227        priority        text, 
     228        owner           text,           -- who is this ticket assigned to 
     229        reporter        text, 
     230        cc              text,           -- email addresses to notify 
     231        url             text,           -- url related to this ticket 
     232        version         text,           --  
     233        milestone       text,           --  
     234        status          text, 
     235        resolution      text, 
     236        summary         text,           -- one-line summary 
     237        description     text,           -- problem description (long) 
     238        keywords        text, 
     239        CONSTRAINT ticket_pkey PRIMARY KEY(id) 
     240); 
     241 
     242CREATE TABLE ticket_change ( 
     243        ticket          integer, 
     244        time            integer, 
     245        author          text, 
     246        field           text, 
     247        oldvalue        text, 
     248        newvalue        text, 
     249        CONSTRAINT ticket_change_pkey PRIMARY KEY(ticket, time, field) 
     250); 
     251 
     252CREATE TABLE ticket_custom ( 
     253       ticket           integer, 
     254       name             text, 
     255       value            text, 
     256       CONSTRAINT ticket_custom_pkey PRIMARY KEY(ticket,name) 
     257); 
     258 
     259--CREATE SEQUENCE report_id_seq; 
     260CREATE TABLE report ( 
     261        id              serial, 
     262        author          text, 
     263        title           text, 
     264        sql             text, 
     265        description     text, 
     266        CONSTRAINT report_pkey PRIMARY KEY(id) 
     267); 
     268 
     269CREATE TABLE permission ( 
     270        username        text,           --  
     271        action          text,           -- allowable activity 
     272        CONSTRAINT permission_pkey PRIMARY KEY(username,action) 
     273); 
     274 
     275CREATE TABLE component ( 
     276         name            text, 
     277         owner           text, 
     278         CONSTRAINT component_pkey PRIMARY KEY(name) 
     279); 
     280 
     281CREATE TABLE milestone ( 
     282         name            text, 
     283         due             integer, -- Due date/time 
     284         completed       integer, -- Completed date/time 
     285         description     text, 
     286         CONSTRAINT milestone_pkey PRIMARY KEY(name) 
     287); 
     288 
     289CREATE TABLE version ( 
     290         name            text, 
     291         time            integer, 
     292         CONSTRAINT version_pkey PRIMARY KEY(name) 
     293); 
     294 
     295CREATE TABLE wiki ( 
     296         name            text, 
     297         version         integer, 
     298         time            integer, 
     299         author          text, 
     300         ipnr            text, 
     301         text            text, 
     302         comment         text, 
     303         readonly        integer, 
     304         CONSTRAINT wiki_pkey PRIMARY KEY(name,version) 
     305); 
     306 
     307CREATE TABLE attachment ( 
     308         type            text, 
     309         id              text, 
     310         filename        text, 
     311         size            integer, 
     312         time            integer, 
     313         description     text, 
     314         author          text, 
     315         ipnr            text, 
     316         CONSTRAINT attachment_pkey PRIMARY KEY(type,id,filename) 
     317); 
     318 
     319CREATE TABLE session ( 
     320         sid             text, 
     321         username        text, 
     322         var_name        text, 
     323         var_value       text, 
     324         CONSTRAINT session_pkey PRIMARY KEY(sid,var_name) 
     325); 
     326 
     327""" 
     328 
    175329## 
    176330## Default Reports 
    177331## 
     
    293447  FROM ticket t,enum p 
    294448  WHERE p.name=t.priority AND p.type='priority' 
    295449  ORDER BY (milestone IS NULL), milestone DESC, (status = 'closed'),  
    296         (CASE status WHEN 'closed' THEN modified ELSE (-1)*p.value END) DESC 
     450        (CASE status WHEN 'closed' THEN changetime ELSE (-1)*p.value END) DESC 
    297451"""), 
    298452#---------------------------------------------------------------------------- 
    299453('My Tickets', 
     
    411565 (('trac', 'htdocs_location', '/trac/'), 
    412566  ('trac', 'repository_dir', '/var/svn/myrep'), 
    413567  ('trac', 'templates_dir', '/usr/lib/trac/templates'), 
    414   ('trac', 'database', 'sqlite:db/trac.db'), 
     568  ('trac', 'database', 'sqlite:"db/trac.db",timeout=10000'), 
    415569  ('trac', 'default_charset', 'iso-8859-15'), 
    416570  ('logging', 'log_type', 'none'), 
    417571  ('logging', 'log_file', 'trac.log'), 
  • trac/Search.py

    old new  
    117117 
    118118        cursor = self.db.cursor () 
    119119 
     120        # ugly 'cast' hack for sqlite vs other dbms 
     121        # and UNION ALL requiring like column datatypes 
     122        data_changeset = 'rev' 
     123        data_tickets = 'a.id' 
     124        dbms = self.env.dbms 
     125        if dbms != 'sqlite': 
     126            data_changeset = 'cast(rev as text)' 
     127            data_tickets = 'cast(a.id as text)' 
     128 
    120129        q = [] 
    121130        if changeset: 
    122131            q.append('SELECT 1 as type, message AS title, message, author, ' 
    123                      ' \'\' AS keywords, rev AS data, time,0 AS ver' 
     132                     ' \'\' AS keywords, %s AS data, time,0 AS ver' 
    124133                     ' FROM revision WHERE %s OR %s' %  
    125                      (self.query_to_sql(query, 'message'), 
     134                     (data_changeset, 
     135                      self.query_to_sql(query, 'message'), 
    126136                      self.query_to_sql(query, 'author'))) 
    127137        if tickets: 
    128138            q.append('SELECT DISTINCT 2 as type, a.summary AS title, ' 
    129139                     ' a.description AS message, a.reporter AS author, ' 
    130                      ' a.keywords as keywords, a.id AS data, a.time as time, 0 AS ver' 
    131                      ' FROM ticket a LEFT JOIN ticket_change b ON a.id = b.ticket' 
    132                      ' WHERE (b.field=\'comment\' AND %s ) OR' 
    133                      ' %s OR %s OR %s OR %s OR %s' % 
    134                       (self.query_to_sql(query, 'b.newvalue'), 
     140                     ' a.keywords as keywords, %s AS data, a.time as time' 
     141                     ' , 0 AS ver FROM ticket a LEFT JOIN ticket_change b' 
     142                     ' ON a.id = b.ticket WHERE (b.field=\'comment\' AND %s )' 
     143                     ' OR %s OR %s OR %s OR %s OR %s' % 
     144                      (data_tickets, 
     145                       self.query_to_sql(query, 'b.newvalue'), 
    135146                       self.query_to_sql(query, 'summary'), 
    136147                       self.query_to_sql(query, 'keywords'), 
    137148                       self.query_to_sql(query, 'description'), 
  • trac/Query.py

    old new  
    155155        sql.append("\nFROM ticket") 
    156156        for k in [k for k in cols if k in custom_fields]: 
    157157           sql.append("\n  LEFT OUTER JOIN ticket_custom AS %s ON " \ 
    158                       "(id=%s.ticket AND %s.name='%s')" % (k, k, k, k)) 
     158                      "(id=%s.ticket AND %s.name='%s') tc" % (k, k, k, k)) 
    159159 
    160160        for col in [c for c in ['status', 'resolution', 'priority', 'severity'] 
    161161                    if c == self.order or c == self.group]: 
    162162            sql.append("\n  LEFT OUTER JOIN (SELECT name AS %s_name, " \ 
    163163                                            "value AS %s_value " \ 
    164                                             "FROM enum WHERE type='%s')" \ 
     164                                            "FROM enum WHERE type='%s') e" \ 
    165165                       " ON %s_name=%s" % (col, col, col, col, col)) 
    166166        for col in [c for c in ['milestone', 'version'] 
    167167                    if c == self.order or c == self.group]: 
    168168            time_col = col == 'milestone' and 'due' or 'time' 
    169169            sql.append("\n  LEFT OUTER JOIN (SELECT name AS %s_name, " \ 
    170                                             "%s AS %s_time FROM %s)" \ 
     170                                            "%s AS %s_time FROM %s) a" \ 
    171171                       " ON %s_name=%s" % (col, time_col, col, col, col, col)) 
    172172 
    173173        def get_constraint_sql(name, value, mode, neg): 
  • trac/Report.py

    old new  
    111111        self.perm.assert_permission(perm.REPORT_CREATE) 
    112112 
    113113        cursor = self.db.cursor() 
    114         cursor.execute("INSERT INTO report (title, sql, description)" 
    115                        " VALUES (%s, %s, %s)", title, sql, description) 
    116         id = self.db.db.sqlite_last_insert_rowid() 
     114        cursor.execute('INSERT INTO report (title, sql, description)' 
     115                       'VALUES (%s, %s, %s)', (title, sql, description)) 
     116        id = self.db.get_last_id('report', 'id', cursor) 
     117             
    117118        self.db.commit() 
    118119        req.redirect(self.env.href.report(id)) 
    119120 
  • trac/tests/tracadmin-tests.txt

    old new  
    11===== test_help_ok ===== 
    2 trac-admin - The Trac Administration Console %(version)s 
     2trac-admin - The Trac Administration Console 0.8 
    33 
    44Usage: trac-admin </path/to/projenv> [command [subcommand] [option ...]] 
    55 
    66Invoking trac-admin without command starts interactive mode. 
    77 
    8 about                                             -- Shows information about trac-admin 
    9 help                                              -- Show documentation 
    10 initenv                                           -- Create and initialize a new environment interactively 
    11 initenv <projectname> <repospath> <templatepath> -- Create and initialize a new environment from arguments 
    12 hotcopy <backupdir>                               -- Make a hot backup copy of an environment 
    13 resync                                            -- Re-synchronize trac with the repository 
    14 upgrade                                           -- Upgrade database to current version 
    15 wiki list                                         -- List wiki pages 
    16 wiki export <page> [file]                         -- Export wiki page to file or stdout 
    17 wiki import <page> [file]                         -- Import wiki page from file or stdin 
    18 wiki dump <directory>                             -- Export all wiki pages to files named by title 
    19 wiki load <directory>                             -- Import all wiki pages from directory 
    20 wiki upgrade                                      -- Upgrade default wiki pages to current version 
    21 permission list                                   -- List permission rules 
    22 permission add <user> <action> [action] [...]     -- Add a new permission rule 
    23 permission remove <user> <action> [action] [...]  -- Remove permission rule 
    24 component list                                    -- Show available components 
    25 component add <name> <owner>                      -- Add a new component 
    26 component rename <name> <newname>                 -- Rename a component 
    27 component remove <name>                           -- Remove/uninstall component 
    28 component chown <name> <owner>                    -- Change component ownership 
    29 priority list                                     -- Show possible ticket priorities 
    30 priority add <value>                              -- Add a priority value option 
    31 priority change <value> <newvalue>                -- Change a priority value 
    32 priority remove <value>                           -- Remove priority value 
    33 severity list                                     -- Show possible ticket priorities 
    34 severity add <value>                              -- Add a severity value option 
    35 severity change <value> <newvalue>                -- Change a severity value 
    36 severity remove <value>                           -- Remove severity value 
    37 version list                                      -- Show versions 
    38 version add <name> [time]                         -- Add version 
    39 version rename <name> <newname>                   -- Rename version 
    40 version time <name> <time>                        -- Set version date (Format: "%(date_format_hint)s" or "now") 
    41 version remove <name>                             -- Remove version 
    42 milestone list                                    -- Show milestones 
    43 milestone add <name> [due]                        -- Add milestone 
    44 milestone rename <name> <newname>                 -- Rename milestone 
    45 milestone due <name> <due>                        -- Set milestone due date (Format: "%(date_format_hint)s" or "now") 
    46 milestone completed <name> <completed>            -- Set milestone completed date (Format: "%(date_format_hint)s" or "now") 
    47 milestone remove <name>                           -- Remove milestone 
     8about                                                                   -- Shows information about trac-admin 
     9help                                                                    -- Show documentation 
     10initenv                                                                 -- Create and initialize a new environment interactively 
     11initenv <projectname> <repospath> <templatepath> <dbms> [dbms options] -- Create and initialize a new environment from arguments 
     12hotcopy <backupdir>                                                     -- Make a hot backup copy of an environment 
     13resync                                                                  -- Re-synchronize trac with the repository 
     14upgrade                                                                 -- Upgrade database to current version 
     15wiki list                                                               -- List wiki pages 
     16wiki export <page> [file]                                               -- Export wiki page to file or stdout 
     17wiki import <page> [file]                                               -- Import wiki page from file or stdin 
     18wiki dump <directory>                                                   -- Export all wiki pages to files named by title 
     19wiki load <directory>                                                   -- Import all wiki pages from directory 
     20wiki upgrade                                                            -- Upgrade default wiki pages to current version 
     21permission list                                                         -- List permission rules 
     22permission add <user> <action> [action] [...]                           -- Add a new permission rule 
     23permission remove <user> <action> [action] [...]                        -- Remove permission rule 
     24component list                                                          -- Show available components 
     25component add <name> <owner>                                            -- Add a new component 
     26component rename <name> <newname>                                       -- Rename a component 
     27component remove <name>                                                 -- Remove/uninstall component 
     28component chown <name> <owner>                                          -- Change component ownership 
     29priority list                                                           -- Show possible ticket priorities 
     30priority add <value>                                                    -- Add a priority value option 
     31priority change <value> <newvalue>                                      -- Change a priority value 
     32priority remove <value>                                                 -- Remove priority value 
     33severity list                                                           -- Show possible ticket priorities 
     34severity add <value>                                                    -- Add a severity value option 
     35severity change <value> <newvalue>                                      -- Change a severity value 
     36severity remove <value>                                                 -- Remove severity value 
     37version list                                                            -- Show versions 
     38version add <name> [time]                                               -- Add version 
     39version rename <name> <newname>                                         -- Rename version 
     40version time <name> <time>                                              -- Set version date (Format: "MM/DD/YY" or "now") 
     41version remove <name>                                                   -- Remove version 
     42milestone list                                                          -- Show milestones 
     43milestone add <name> [due]                                              -- Add milestone 
     44milestone rename <name> <newname>                                       -- Rename milestone 
     45milestone due <name> <due>                                              -- Set milestone due date (Format: "MM/DD/YY" or "now") 
     46milestone completed <name> <completed>                                  -- Set milestone completed date (Format: "MM/DD/YY" or "now") 
     47milestone remove <name>                                                 -- Remove milestone 
    4848 
    4949Visit the Trac Project at http://trac.edgewall.com/ 
    5050 
  • trac/tests/environment.py

    old new  
    3636 
    3737    def test_config(self): 
    3838        """Testing env.get/set_config""" 
    39         assert self.env.get_config('trac', 'database') == 'sqlite:db/trac.db' 
     39        # Any way to do this with multiple backends now supported? 
     40        # assert self.env.get_config('trac', 'database') == 'sqlite:db/trac.db' 
    4041        self.env.set_config('foo', 'bar', 'baz') 
    4142        self.env.save_config() 
    4243        assert self.env.get_config('foo', 'bar') == 'baz' 
  • trac/tests/query.py

    old new  
    3535        self.assertEqual(sql, 
    3636"""SELECT id,summary,status,owner,priority,milestone,component 
    3737FROM ticket 
    38   LEFT OUTER JOIN (SELECT name AS priority_name, value AS priority_value FROM enum WHERE type='priority') ON priority_name=priority 
     38  LEFT OUTER JOIN (SELECT name AS priority_name, value AS priority_value FROM enum WHERE type='priority') e ON priority_name=priority 
    3939ORDER BY COALESCE(priority,'')='',priority_value,id""") 
    4040 
    4141    def test_all_ordered_by_priority_desc(self): 
     
    4444        self.assertEqual(sql, 
    4545"""SELECT id,summary,status,owner,priority,milestone,component 
    4646FROM ticket 
    47   LEFT OUTER JOIN (SELECT name AS priority_name, value AS priority_value FROM enum WHERE type='priority') ON priority_name=priority 
     47  LEFT OUTER JOIN (SELECT name AS priority_name, value AS priority_value FROM enum WHERE type='priority') e ON priority_name=priority 
    4848ORDER BY COALESCE(priority,'')='' DESC,priority_value DESC,id""") 
    4949 
    5050    def test_all_ordered_by_version(self): 
     
    5353        self.assertEqual(sql, 
    5454"""SELECT id,summary,status,owner,priority,milestone,version 
    5555FROM ticket 
    56   LEFT OUTER JOIN (SELECT name AS version_name, time AS version_time FROM version) ON version_name=version 
     56  LEFT OUTER JOIN (SELECT name AS version_name, time AS version_time FROM version) a ON version_name=version 
    5757ORDER BY COALESCE(version,'')='',COALESCE(version_time,0)=0,version_time,version,id""") 
    5858 
    5959    def test_all_ordered_by_version_desc(self): 
     
    6262        self.assertEqual(sql, 
    6363"""SELECT id,summary,status,owner,priority,milestone,version 
    6464FROM ticket 
    65   LEFT OUTER JOIN (SELECT name AS version_name, time AS version_time FROM version) ON version_name=version 
     65  LEFT OUTER JOIN (SELECT name AS version_name, time AS version_time FROM version) a ON version_name=version 
    6666ORDER BY COALESCE(version,'')='' DESC,COALESCE(version_time,0)=0 DESC,version_time DESC,version DESC,id""") 
    6767 
    6868    def test_constrained_by_milestone(self): 
     
    8181        self.assertEqual(sql, 
    8282"""SELECT id,summary,status,owner,priority,component,version,milestone 
    8383FROM ticket 
    84   LEFT OUTER JOIN (SELECT name AS milestone_name, due AS milestone_time FROM milestone) ON milestone_name=milestone 
     84  LEFT OUTER JOIN (SELECT name AS milestone_name, due AS milestone_time FROM milestone) a ON milestone_name=milestone 
    8585ORDER BY COALESCE(milestone,'')='',COALESCE(milestone_time,0)=0,milestone_time,milestone,COALESCE(id,0)=0,id""") 
    8686 
    8787    def test_all_grouped_by_milestone_desc(self): 
     
    9090        self.assertEqual(sql, 
    9191"""SELECT id,summary,status,owner,priority,component,version,milestone 
    9292FROM ticket 
    93   LEFT OUTER JOIN (SELECT name AS milestone_name, due AS milestone_time FROM milestone) ON milestone_name=milestone 
     93  LEFT OUTER JOIN (SELECT name AS milestone_name, due AS milestone_time FROM milestone) a ON milestone_name=milestone 
    9494ORDER BY COALESCE(milestone,'')='' DESC,COALESCE(milestone_time,0)=0 DESC,milestone_time DESC,milestone DESC,COALESCE(id,0)=0,id""") 
    9595 
    9696    def test_grouped_by_priority(self): 
     
    9999        self.assertEqual(sql, 
    100100"""SELECT id,summary,status,owner,milestone,component,version,priority 
    101101FROM ticket 
    102   LEFT OUTER JOIN (SELECT name AS priority_name, value AS priority_value FROM enum WHERE type='priority') ON priority_name=priority 
     102  LEFT OUTER JOIN (SELECT name AS priority_name, value AS priority_value FROM enum WHERE type='priority') e ON priority_name=priority 
    103103ORDER BY COALESCE(priority,'')='',priority_value,id""") 
    104104 
    105105    def test_constrained_by_milestone_not(self): 
     
    170170        self.assertEqual(sql, 
    171171"""SELECT id,summary,status,owner,priority,milestone,component, foo.value AS foo 
    172172FROM ticket 
    173   LEFT OUTER JOIN ticket_custom AS foo ON (id=foo.ticket AND foo.name='foo') 
     173  LEFT OUTER JOIN ticket_custom AS foo ON (id=foo.ticket AND foo.name='foo') tc 
    174174WHERE COALESCE(foo,'')='something' 
    175175ORDER BY COALESCE(id,0)=0,id""") 
    176176 
  • trac/tests/db.py

    old new  
     1 
     2import unittest 
     3from trac.Environment import Environment # TODO: take out trac. when being run 
     4                                         #       from normal trac/test.py 
     5 
     6class DBTestBase: 
     7    def setUp(self): 
     8        pass 
     9 
     10    def tearDown(self): 
     11        pass 
     12 
     13class DBTestCase(DBTestBase, unittest.TestCase): 
     14    def test_connect(self): 
     15        """Testing db.connect""" 
     16        env = Environment('/var/trac/test')  # TODO: make more generic 
     17                                             # for now, it's my local pgsql env 
     18        cnx = env.get_db_cnx() 
     19        cursor = cnx.cursor() 
     20        cursor.execute("select * from system") 
     21        row = cursor.fetchone() 
     22        print row 
     23        cnx.close() 
     24 
     25    def test_parse_args(self): 
     26        """Testing db.parse_args""" 
     27         
     28def suite(): 
     29    return unittest.makeSuite(DBTestCase,'test') 
     30     
     31# TODO: take this out when we put this in with the other tests 
     32# Q: will we be able to do these tests for different dbms's in the test suite? 
     33if __name__ == '__main__': 
     34    unittest.main(defaultTest='suite') 
     35         
  • trac/Session.py

    old new  
    6464    def get_session(self, sid): 
    6565        self.sid = sid 
    6666        curs = self.db.cursor() 
    67         curs.execute("SELECT username,var_name,var_value FROM session" 
    68                     " WHERE sid=%s", self.sid
     67        curs.execute("SELECT username,var_name,var_value FROM session"  
     68                    " WHERE sid=%s", (self.sid,)
    6969        rows = curs.fetchall() 
    7070        if (not rows                              # No session data yet 
    7171            or rows[0][0] == 'anonymous'          # Anon session 
  • trac/db.py

    old new  
     1# -*- coding: iso8859-1 -*- 
     2# 
     3# Copyright (C) 2005 Edgewall Software 
     4# Copyright (C) 2005 Brad Anderson <brad@dsource.org> 
     5# 
     6# Trac is free software; you can redistribute it and/or 
     7# modify it under the terms of the GNU General Public License as 
     8# published by the Free Software Foundation; either version 2 of the 
     9# License, or (at your option) any later version. 
     10# 
     11# Trac is distributed in the hope that it will be useful, 
     12# but WITHOUT ANY WARRANTY; without even the implied warranty of 
     13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
     14# General Public License for more details. 
     15# 
     16# You should have received a copy of the GNU General Public License 
     17# along with this program; if not, write to the Free Software 
     18# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 
     19# 
     20# Author: Brad Anderson <brad@dsource.org> 
     21 
     22import os 
     23 
     24def get_cnx(db_str, path, check_exists): 
     25    pos = db_str.find(':') 
     26    if pos == -1: 
     27        raise EnvironmentError, 'Connection param must be of form ' \ 
     28              '(db_module_name):(db_connect_params), the value "%s ' \ 
     29              'does not match' % db_str 
     30    module_name = db_str[:pos] 
     31    connect_params = db_str[pos+1:].split(',') 
     32     
     33    # TODO: factory here? 
     34    if module_name.lower() == 'sqlite': 
     35        conn = SQLiteDBConnection(module_name, connect_params, path,  
     36                   check_exists) 
     37    elif module_name.lower() == 'pgsql': 
     38        conn = PostgreSQLDBConnection(module_name, connect_params, path,  
     39                   check_exists) 
     40    else: 
     41        raise EnvironmentError, 'Unrecognized database in trac.ini: %s' \ 
     42                                % module_name 
     43    return conn 
     44             
     45 
     46class DBConnection: 
     47     
     48    def __init__(self, module_name, connect_params, path, check_exists): 
     49        # set some variables 
     50        self.module_name = module_name 
     51        self.path = path 
     52         
     53        # prepare the connection 
     54        self.parse_args(connect_params) 
     55        self.connect(check_exists) 
     56     
     57    def __getattr__(self, name): 
     58        """DBConnection is a wrapper for the dbms's connection, and here's  
     59           the magic that allows this.""" 
     60        return getattr(self.db, name) 
     61 
     62    def parse_args(self, connect_params): 
     63        """very crude code for parsing the arguments in connect_params""" 
     64        kargs = {} 
     65        arg_list = [] 
     66        for x in connect_params: 
     67            pos1 = x.find('=') 
     68            pos2 = x.find('"') 
     69            pos3 = x.find("'") 
     70            if pos1 > -1: 
     71                if pos2 > -1 and pos2 < pos1: 
     72                    arg_list.append(eval(x)) 
     73                elif pos3 > -1 and pos3 < pos1: 
     74                    arg_list.append(eval(x)) 
     75                else: 
     76                    name = x[:pos1].strip() 
     77                    value = eval(x[pos1+1:].strip()) 
     78                    kargs[name] = value 
     79            else: 
     80                arg_list.append(eval(x)) 
     81        self.args = tuple(arg_list) 
     82        self.kargs = kargs 
     83         
     84         
     85class SQLiteDBConnection(DBConnection): 
     86    """specific implementation of DBConnection for SQLite""" 
     87     
     88    def connect(self, check_exists): 
     89 
     90        # since Trac has a slightly closer relationship with sqlite than 
     91        # other db's, there's a special case setup here so that when the 
     92        # path to the sqlite db is specified, its relative to TRAC_ENV 
     93        db_name = os.path.join(self.path, self.args[0]) 
     94        args = list(self.args) 
     95        args[0] = '%s' % db_name 
     96        self.args = tuple(args) 
     97 
     98        # check to see if db exists 
     99        if check_exists == 1 and not os.access(db_name, os.F_OK): 
     100            raise EnvironmentError, 'Database "%s" not found.' % db_name 
     101         
     102        # make sure db is readable/writable by web server user 
     103        directory = os.path.dirname(db_name) 
     104        if (check_exists == 1 and not os.access(db_name, os.R_OK + os.W_OK)) \ 
     105            or not os.access(directory, os.R_OK + os.W_OK): 
     106            raise EnvironmentError, \ 
     107                  'The web server user requires read _and_ write permission\n' \ 
     108                  'to the database %s and the directory in which this file ' \ 
     109                  'is located.' % db_name 
     110                           
     111        # import database module 
     112        import_str = 'import sqlite' 
     113        exec import_str 
     114        m = eval('sqlite') 
     115         
     116        # get connection 
     117        self.db = m.connect(*self.args, **self.kargs) 
     118 
     119    def get_last_id(self, table, field, cursor): 
     120        id = self.db.db.sqlite_last_insert_rowid() 
     121        return id 
     122 
     123 
     124class PostgreSQLDBConnection(DBConnection): 
     125    """specific implementation of DBConnection for PostgreSQL""" 
     126     
     127    def connect(self, check_exists): 
     128         
     129        # check to see if db exists 
     130        # TODO: 
     131         
     132        # get strings for proper pgsql module (add more as needed) 
     133        if self.module_name == 'pgsql': 
     134            import_str = 'from pyPgSQL import PgSQL' 
     135            module_str = 'PgSQL' 
     136        else: 
     137            raise EnvironmentError, "Unknown PostgreSQL DB module '%s'" \ 
     138                                    % self.module_name 
     139         
     140        # import database module 
     141        exec import_str 
     142        m = eval(module_str) 
     143         
     144        # get connection 
     145        self.db = m.connect(*self.args, **self.kargs) 
     146         
     147    def get_last_id(self, table, field, cursor): 
     148        sql = "SELECT %s FROM %s " \ 
     149              "WHERE %s = CURRVAL('%s_%s_seq')" \ 
     150              % (field, table, field, table, field) 
     151        cursor.execute(sql) 
     152        id = cursor.fetchone()[0] 
     153        return id 
     154         
  • trac/auth.py

    <