PostgresqlPatch: pgsql_patch_07.diff
| File pgsql_patch_07.diff, 59.4 kB (added by brad, 4 years ago) |
|---|
-
scripts/trac-admin
old new 27 27 import time 28 28 import cmd 29 29 import shlex 30 import sqlite31 30 import StringIO 31 import traceback 32 32 33 33 from trac import util 34 34 from trac import sync … … 92 92 return 0 93 93 return 1 94 94 95 def env_create(self ):95 def env_create(self, db_str): 96 96 try: 97 self.__env = trac.Environment.Environment (self.envname, create=1)97 self.__env = trac.Environment.Environment (self.envname, 1, db_str) 98 98 return self.__env 99 99 except Exception, e: 100 100 print 'Failed to create environment.', e … … 111 111 112 112 def db_execsql (self, sql, cursor=None): 113 113 data = [] 114 row = None 114 115 if not cursor: 115 116 cnx=self.db_open() 116 117 cursor = cnx.cursor() … … 118 119 cnx = None 119 120 cursor.execute(sql) 120 121 while 1: 121 row = cursor.fetchone() 122 try: 123 row = cursor.fetchone() 124 except: 125 pass 122 126 if row == None: 123 127 break 124 128 data.append(row) … … 457 461 458 462 ## Initenv 459 463 _help_initenv = [('initenv', 'Create and initialize a new environment interactively'), 460 ('initenv <projectname> <repospath> <templatepath> ',464 ('initenv <projectname> <repospath> <templatepath> <dbms> [dbms options]', 461 465 'Create and initialize a new environment from arguments')] 462 466 463 467 def do_initdb(self, line): … … 490 494 dt = trac.siteconfig.__default_templates_dir__ 491 495 prompt = 'Templates directory [%s]> ' % dt 492 496 returnvals.append(raw_input(prompt) or dt) 497 print 498 print " Please enter the database in which you wish to store Trac data." 499 print " Default is 'sqlite', but others are supported:" 500 print " 'sqlite' - SQLite http://www.sqlite.org" 501 print " 'pgsql' - PostgreSQL http://www.postgresql.org" 502 print 503 ddb = "sqlite" 504 prompt = 'database system [%s]> ' % ddb 505 dbms = raw_input(prompt) or ddb 506 returnvals.append(dbms) 507 508 # PostgreSQL - additional questions 509 if dbms == "pgsql": 510 print 511 print " Please enter the host of your PostgreSQL database." 512 print " Default is 'localhost'" 513 print 514 host = "localhost" 515 prompt = "PostgreSQL host [%s]> " % host 516 returnvals.append(raw_input(prompt) or host) 517 518 print 519 print " Please enter the port of your PostgreSQL database." 520 print " Default is '5432'" 521 print 522 port = "5432" 523 prompt = "PostgreSQL port [%s]> " % port 524 returnvals.append(raw_input(prompt) or port) 525 526 print 527 print " Please enter the name of your PostgreSQL database." 528 print " Default is 'trac'" 529 print " Note: This database should not exist, as trac-admin will" \ 530 " attempt to create it." 531 print 532 name = "trac" 533 prompt = "PostgreSQL database [%s]> " % name 534 returnvals.append(raw_input(prompt) or name) 535 536 print 537 print " Please enter the user of your PostgreSQL database." 538 print " Default is 'trac'" 539 print 540 user = "trac" 541 prompt = "PostgreSQL user [%s]> " % user 542 returnvals.append(raw_input(prompt) or user) 543 544 print 545 print " Please enter the password of your PostgreSQL database." 546 print " Default is 'trac'" 547 print 548 password = "trac" 549 prompt = "PostgreSQL password [%s]> " % password 550 returnvals.append(raw_input(prompt) or password) 551 493 552 return returnvals 494 553 495 554 def do_initenv(self, line): … … 500 559 project_name = None 501 560 repository_dir = None 502 561 templates_dir = None 562 db_str = None 503 563 if len(arg) == 1: 504 564 returnvals = self.get_initenv_args() 505 565 project_name = returnvals[0] 506 566 repository_dir = returnvals[1] 507 567 templates_dir = returnvals[2] 508 elif len(arg)!= 3: 568 db_str = returnvals[3] 569 elif len(arg) < 4: 509 570 print 'Wrong number of arguments to initenv %d' % len(arg) 510 571 return 511 572 else: 512 573 project_name = arg[0] 513 574 repository_dir = arg[1] 514 575 templates_dir = arg[2] 576 db_str = arg[3] 577 578 # sqlite-specific stuff 579 if db_str.lower() == "sqlite": 580 db_str = 'sqlite:"db/trac.db",timeout=10000' 581 582 # postgres-specific stuff 583 if db_str.lower() == "pgsql": 584 if len(arg) == 1: 585 host = returnvals[4] 586 port = returnvals[5] 587 database = returnvals[6] 588 user = returnvals[7] 589 password = returnvals[8] 590 elif len(arg) != 9: 591 print 'Wrong number of arguments to initenv %d' % len(arg) 592 print 'For PostgreSQL (after pgsql): <host> <port> <database>' \ 593 ' <user> <password>' 594 return 595 else: 596 host = arg[4] 597 port = arg[5] 598 database = arg[6] 599 user = arg[7] 600 password = arg[8] 601 db_str = "pgsql:\"\",host='%s:%s',database='%s',user='%s'," \ 602 "password='%s'" \ 603 % (host, port, database, user, password) 604 createdb_str = "createdb --host=%s --port=%s --owner=%s " \ 605 "--username=%s %s\n" \ 606 % (host, port, user, user, database) 607 print createdb_str 608 try: 609 # TODO: this is not cross-platform. 610 # for Windows, look at win32pipe.popen() 611 os.popen(createdb_str) 612 except Exception, e: 613 print "Error creating PostgreSQL database: %s" % e 614 print "command: %s" % createdb_str 615 515 616 from svn import util, repos, core 516 617 core.apr_initialize() 517 618 pool = core.svn_pool_create(None) … … 530 631 return 531 632 try: 532 633 print 'Creating and Initializing Project' 533 self.env_create( )634 self.env_create(db_str) 534 635 cnx = self.__env.get_db_cnx() 535 636 print ' Inserting default data' 536 637 self.__env.insert_default_data() … … 669 770 self.do_help ('wiki') 670 771 except Exception, e: 671 772 print 'Wiki %s failed:' % arg[0], e 773 print traceback.print_exc() 774 672 775 673 776 def _do_wiki_list(self): 674 777 data = self.db_execsql('SELECT name,max(version),time' -
trac/db_default.py
old new 172 172 CREATE INDEX session_idx ON session(sid,var_name); 173 173 """ 174 174 175 # FIXME: move to env.db ( maybe here in db_default, just provide the structure 176 # and have dbms-specific CREATE TABLE commands generated in env.db ) 177 schema_pgsql = """ 178 CREATE TABLE revision ( 179 rev integer, 180 time integer, 181 author text, 182 message text, 183 CONSTRAINT revision_pkey PRIMARY KEY (rev) 184 ); 185 186 CREATE TABLE node_change ( 187 rev integer, 188 name text, 189 change char(1), 190 CONSTRAINT node_change_pkey PRIMARY KEY (rev, name, change) 191 ); 192 193 CREATE TABLE auth_cookie ( 194 cookie text, 195 name text, 196 ipnr text, 197 time integer, 198 CONSTRAINT auth_cookie_pkey PRIMARY KEY(cookie, name, ipnr) 199 ); 200 201 CREATE TABLE enum ( 202 type text, 203 name text, 204 value integer, 205 CONSTRAINT enum_pkey PRIMARY KEY(name,type) 206 ); 207 208 CREATE TABLE system ( 209 name text, 210 value text, 211 CONSTRAINT system_pkey PRIMARY KEY(name) 212 ); 213 214 CREATE TABLE lock ( 215 name text, 216 owner text, 217 ipnr text, 218 time integer, 219 CONSTRAINT lock_pkey PRIMARY KEY(name) 220 ); 221 222 --CREATE SEQUENCE ticket_id_seq; 223 CREATE TABLE ticket ( 224 id serial, 225 time integer, -- the time it was created 226 changetime integer, 227 component text, 228 severity text, 229 priority text, 230 owner text, -- who is this ticket assigned to 231 reporter text, 232 cc text, -- email addresses to notify 233 url text, -- url related to this ticket 234 version text, -- 235 milestone text, -- 236 status text, 237 resolution text, 238 summary text, -- one-line summary 239 description text, -- problem description (long) 240 keywords text, 241 CONSTRAINT ticket_pkey PRIMARY KEY(id) 242 ); 243 244 CREATE TABLE ticket_change ( 245 ticket integer, 246 time integer, 247 author text, 248 field text, 249 oldvalue text, 250 newvalue text, 251 CONSTRAINT ticket_change_pkey PRIMARY KEY(ticket, time, field) 252 ); 253 254 CREATE TABLE ticket_custom ( 255 ticket integer, 256 name text, 257 value text, 258 CONSTRAINT ticket_custom_pkey PRIMARY KEY(ticket,name) 259 ); 260 261 --CREATE SEQUENCE report_id_seq; 262 CREATE TABLE report ( 263 id serial, 264 author text, 265 title text, 266 sql text, 267 description text, 268 CONSTRAINT report_pkey PRIMARY KEY(id) 269 ); 270 271 CREATE TABLE permission ( 272 username text, -- 273 action text, -- allowable activity 274 CONSTRAINT permission_pkey PRIMARY KEY(username,action) 275 ); 276 277 CREATE TABLE component ( 278 name text, 279 owner text, 280 CONSTRAINT component_pkey PRIMARY KEY(name) 281 ); 282 283 CREATE TABLE milestone ( 284 name text, 285 due integer, -- Due date/time 286 completed integer, -- Completed date/time 287 description text, 288 CONSTRAINT milestone_pkey PRIMARY KEY(name) 289 ); 290 291 CREATE TABLE version ( 292 name text, 293 time integer, 294 CONSTRAINT version_pkey PRIMARY KEY(name) 295 ); 296 297 CREATE TABLE wiki ( 298 name text, 299 version integer, 300 time integer, 301 author text, 302 ipnr text, 303 text text, 304 comment text, 305 readonly integer, 306 CONSTRAINT wiki_pkey PRIMARY KEY(name,version) 307 ); 308 309 CREATE TABLE attachment ( 310 type text, 311 id text, 312 filename text, 313 size integer, 314 time integer, 315 description text, 316 author text, 317 ipnr text, 318 CONSTRAINT attachment_pkey PRIMARY KEY(type,id,filename) 319 ); 320 321 CREATE TABLE session ( 322 sid text, 323 username text, 324 var_name text, 325 var_value text, 326 CONSTRAINT session_pkey PRIMARY KEY(sid,var_name) 327 ); 328 329 """ 330 175 331 ## 176 332 ## Default Reports 177 333 ## … … 293 449 FROM ticket t,enum p 294 450 WHERE p.name=t.priority AND p.type='priority' 295 451 ORDER BY (milestone IS NULL), milestone DESC, (status = 'closed'), 452 <<<<<<< .mine 453 (CASE status WHEN 'closed' THEN changetime ELSE (-1)*p.value END) DESC 454 ======= 296 455 (CASE status WHEN 'closed' THEN modified ELSE (-1)*p.value END) DESC 456 >>>>>>> .r1211 297 457 """), 298 458 #---------------------------------------------------------------------------- 299 459 ('My Tickets', … … 411 571 (('trac', 'htdocs_location', '/trac/'), 412 572 ('trac', 'repository_dir', '/var/svn/myrep'), 413 573 ('trac', 'templates_dir', '/usr/lib/trac/templates'), 414 ('trac', 'database', 'sqlite: db/trac.db'),574 ('trac', 'database', 'sqlite:"db/trac.db",timeout=10000'), 415 575 ('trac', 'default_charset', 'iso-8859-15'), 416 576 ('logging', 'log_type', 'none'), 417 577 ('logging', 'log_file', 'trac.log'), -
trac/Search.py
old new 117 117 118 118 cursor = self.db.cursor () 119 119 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 120 129 q = [] 121 130 if changeset: 122 131 q.append('SELECT 1 as type, message AS title, message, author, ' 123 ' \'\' AS keywords, revAS data, time,0 AS ver'132 ' \'\' AS keywords, %s AS data, time,0 AS ver' 124 133 ' FROM revision WHERE %s OR %s' % 125 (self.query_to_sql(query, 'message'), 134 (data_changeset, 135 self.query_to_sql(query, 'message'), 126 136 self.query_to_sql(query, 'author'))) 127 137 if tickets: 128 138 q.append('SELECT DISTINCT 2 as type, a.summary AS title, ' 129 139 ' 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'), 135 146 self.query_to_sql(query, 'summary'), 136 147 self.query_to_sql(query, 'keywords'), 137 148 self.query_to_sql(query, 'description'), -
trac/Query.py
old new 154 154 sql.append("\nFROM ticket") 155 155 for k in [k for k in cols if k in custom_fields]: 156 156 sql.append("\n LEFT OUTER JOIN ticket_custom AS %s ON " \ 157 "(id=%s.ticket AND %s.name='%s') " % (k, k, k, k))157 "(id=%s.ticket AND %s.name='%s') tc" % (k, k, k, k)) 158 158 159 159 for col in [c for c in ['status', 'resolution', 'priority', 'severity'] 160 160 if c == self.order or c == self.group]: 161 161 sql.append("\n LEFT OUTER JOIN (SELECT name AS %s_name, " \ 162 162 "value AS %s_value " \ 163 "FROM enum WHERE type='%s') " \163 "FROM enum WHERE type='%s') e" \ 164 164 " ON %s_name=%s" % (col, col, col, col, col)) 165 165 for col in [c for c in ['milestone', 'version'] 166 166 if c == self.order or c == self.group]: 167 167 time_col = col == 'milestone' and 'due' or 'time' 168 168 sql.append("\n LEFT OUTER JOIN (SELECT name AS %s_name, " \ 169 "%s AS %s_time FROM %s) " \169 "%s AS %s_time FROM %s) a" \ 170 170 " ON %s_name=%s" % (col, time_col, col, col, col, col)) 171 171 172 172 def get_constraint_sql(name, value, mode, neg): -
trac/Report.py
old new 110 110 def create_report(self, title, description, sql): 111 111 self.perm.assert_permission(perm.REPORT_CREATE) 112 112 113 dbms = self.env.get_dbms() 113 114 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() 115 cursor.execute('INSERT INTO report (title, sql, description)' 116 'VALUES (%s, %s, %s)', (title, sql, description,)) 117 118 # FIXME: move to env.db 119 if dbms == 'pgsql': 120 cursor.execute("SELECT id FROM report " \ 121 "WHERE id = CURRVAL('report_id_seq')") 122 id = cursor.fetchone()[0] 123 else: # sqlite way 124 id = self.db.db.sqlite_last_insert_rowid() 125 117 126 self.db.commit() 118 127 self.req.redirect(self.env.href.report(id)) 119 128 -
trac/tests/tracadmin-tests.txt
old new 1 1 ===== test_help_ok ===== 2 trac-admin - The Trac Administration Console %(version)s2 trac-admin - The Trac Administration Console 0.8 3 3 4 4 Usage: trac-admin </path/to/projenv> [command [subcommand] [option ...]] 5 5 6 6 Invoking trac-admin without command starts interactive mode. 7 7 8 about -- Shows information about trac-admin9 help -- Show documentation10 initenv -- Create and initialize a new environment interactively11 initenv <projectname> <repospath> <templatepath> -- Create and initialize a new environment from arguments12 hotcopy <backupdir> -- Make a hot backup copy of an environment13 resync -- Re-synchronize trac with the repository14 upgrade -- Upgrade database to current version15 wiki list -- List wiki pages16 wiki export <page> [file] -- Export wiki page to file or stdout17 wiki import <page> [file] -- Import wiki page from file or stdin18 wiki dump <directory> -- Export all wiki pages to files named by title19 wiki load <directory> -- Import all wiki pages from directory20 wiki upgrade -- Upgrade default wiki pages to current version21 permission list -- List permission rules22 permission add <user> <action> [action] [...] -- Add a new permission rule23 permission remove <user> <action> [action] [...] -- Remove permission rule24 component list -- Show available components25 component add <name> <owner> -- Add a new component26 component rename <name> <newname> -- Rename a component27 component remove <name> -- Remove/uninstall component28 component chown <name> <owner> -- Change component ownership29 priority list -- Show possible ticket priorities30 priority add <value> -- Add a priority value option31 priority change <value> <newvalue> -- Change a priority value32 priority remove <value> -- Remove priority value33 severity list -- Show possible ticket priorities34 severity add <value> -- Add a severity value option35 severity change <value> <newvalue> -- Change a severity value36 severity remove <value> -- Remove severity value37 version list -- Show versions38 version add <name> [time] -- Add version39 version rename <name> <newname> -- Rename version40 version time <name> <time> -- Set version date (Format: "%(date_format_hint)s" or "now")41 version remove <name> -- Remove version42 milestone list -- Show milestones43 milestone add <name> [due] -- Add milestone44 milestone rename <name> <newname> -- Rename milestone45 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 milestone8 about -- Shows information about trac-admin 9 help -- Show documentation 10 initenv -- Create and initialize a new environment interactively 11 initenv <projectname> <repospath> <templatepath> <dbms> [dbms options] -- 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: "MM/DD/YY" 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: "MM/DD/YY" or "now") 46 milestone completed <name> <completed> -- Set milestone completed date (Format: "MM/DD/YY" or "now") 47 milestone remove <name> -- Remove milestone 48 48 49 49 Visit the Trac Project at http://trac.edgewall.com/ 50 50 -
trac/tests/ticket.py
old new 18 18 assert ticket['reporter'] == 'santa' 19 19 assert ticket['summary'] == 'Foo' 20 20 assert ticket['custom_foo'] == 'This is a custom field' 21 ticket.insert(self.db )21 ticket.insert(self.db, self.dbms) 22 22 # Retrieving ticket 23 23 ticket2 = Ticket(self.db, 1) 24 24 assert ticket2['id'] == 1 -
trac/tests/environment.py
old new 36 36 37 37 def test_config(self): 38 38 """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' 40 41 self.env.set_config('foo', 'bar', 'baz') 41 42 self.env.save_config() 42 43 assert self.env.get_config('foo', 'bar') == 'baz' -
trac/tests/query.py
old new 35 35 self.assertEqual(sql, 36 36 """SELECT id,summary,status,owner,priority,milestone,component 37 37 FROM ticket 38 LEFT OUTER JOIN (SELECT name AS priority_name, value AS priority_value FROM enum WHERE type='priority') ON priority_name=priority38 LEFT OUTER JOIN (SELECT name AS priority_name, value AS priority_value FROM enum WHERE type='priority') e ON priority_name=priority 39 39 ORDER BY COALESCE(priority,'')='',priority_value,id""") 40 40 41 41 def test_all_ordered_by_priority_desc(self): … … 44 44 self.assertEqual(sql, 45 45 """SELECT id,summary,status,owner,priority,milestone,component 46 46 FROM ticket 47 LEFT OUTER JOIN (SELECT name AS priority_name, value AS priority_value FROM enum WHERE type='priority') ON priority_name=priority47 LEFT OUTER JOIN (SELECT name AS priority_name, value AS priority_value FROM enum WHERE type='priority') e ON priority_name=priority 48 48 ORDER BY COALESCE(priority,'')='' DESC,priority_value DESC,id""") 49 49 50 50 def test_all_ordered_by_version(self): … … 53 53 self.assertEqual(sql, 54 54 """SELECT id,summary,status,owner,priority,milestone,version 55 55 FROM ticket 56 LEFT OUTER JOIN (SELECT name AS version_name, time AS version_time FROM version) ON version_name=version56 LEFT OUTER JOIN (SELECT name AS version_name, time AS version_time FROM version) a ON version_name=version 57 57 ORDER BY COALESCE(version,'')='',COALESCE(version_time,0)=0,version_time,version,id""") 58 58 59 59 def test_all_ordered_by_version_desc(self): … … 62 62 self.assertEqual(sql, 63 63 """SELECT id,summary,status,owner,priority,milestone,version 64 64 FROM ticket 65 LEFT OUTER JOIN (SELECT name AS version_name, time AS version_time FROM version) ON version_name=version65 LEFT OUTER JOIN (SELECT name AS version_name, time AS version_time FROM version) a ON version_name=version 66 66 ORDER BY COALESCE(version,'')='' DESC,COALESCE(version_time,0)=0 DESC,version_time DESC,version DESC,id""") 67 67 68 68 69 def test_constrained_by_milestone(self): 69 70 query = Query(self.env, order='id') 70 71 query.constraints['milestone'] = ['milestone1'] … … 81 82 self.assertEqual(sql, 82 83 """SELECT id,summary,status,owner,priority,component,version,milestone 83 84 FROM ticket 84 LEFT OUTER JOIN (SELECT name AS milestone_name, due AS milestone_time FROM milestone) ON milestone_name=milestone85 LEFT OUTER JOIN (SELECT name AS milestone_name, due AS milestone_time FROM milestone) a ON milestone_name=milestone 85 86 ORDER BY COALESCE(milestone,'')='',COALESCE(milestone_time,0)=0,milestone_time,milestone,COALESCE(id,0)=0,id""") 86 87 88 87 89 def test_all_grouped_by_milestone_desc(self): 88 90 query = Query(self.env, order='id', group='milestone', groupdesc=1) 89 91 sql = query.get_sql() 90 92 self.assertEqual(sql, 91 93 """SELECT id,summary,status,owner,priority,component,version,milestone 92 94 FROM ticket 93 LEFT OUTER JOIN (SELECT name AS milestone_name, due AS milestone_time FROM milestone) ON milestone_name=milestone95 LEFT OUTER JOIN (SELECT name AS milestone_name, due AS milestone_time FROM milestone) a ON milestone_name=milestone 94 96 ORDER BY COALESCE(milestone,'')='' DESC,COALESCE(milestone_time,0)=0 DESC,milestone_time DESC,milestone DESC,COALESCE(id,0)=0,id""") 95 97 98 96 99 def test_grouped_by_priority(self): 97 100 query = Query(self.env, group='priority') 98 101 sql = query.get_sql() 99 102 self.assertEqual(sql, 100 103 """SELECT id,summary,status,owner,milestone,component,version,priority 101 104 FROM ticket 102 LEFT OUTER JOIN (SELECT name AS priority_name, value AS priority_value FROM enum WHERE type='priority') ON priority_name=priority105 LEFT OUTER JOIN (SELECT name AS priority_name, value AS priority_value FROM enum WHERE type='priority') e ON priority_name=priority 103 106 ORDER BY COALESCE(priority,'')='',priority_value,id""") 104 107 108 105 109 def test_constrained_by_milestone_not(self): 106 110 query = Query(self.env, order='id') 107 111 query.constraints['milestone'] = ['!milestone1'] … … 170 174 self.assertEqual(sql, 171 175 """SELECT id,summary,status,owner,priority,milestone,component, foo.value AS foo 172 176 FROM ticket 173 LEFT OUTER JOIN ticket_custom AS foo ON (id=foo.ticket AND foo.name='foo') 177 LEFT OUTER JOIN ticket_custom AS foo ON (id=foo.ticket AND foo.name='foo') tc 174 178 WHERE COALESCE(foo,'')='something' 175 179 ORDER BY COALESCE(id,0)=0,id""") 176 180 181 177 182 def test_constrained_by_multiple_owners(self): 178 183 query = Query(self.env, order='id') 179 184 query.constraints['owner'] = ['someone', 'someone_else'] -
trac/Session.py
old new 68 68 def get_session(self, sid): 69 69 self.sid = sid 70 70 curs = self.db.cursor() 71 curs.execute("SELECT username,var_name,var_value FROM session" 72 " WHERE sid=%s", self.sid)71 curs.execute("SELECT username,var_name,var_value FROM session" 72 " WHERE sid=%s", (self.sid,)) 73 73 rows = curs.fetchall() 74 74 if (not rows # No session data yet 75 75 or rows[0][0] == 'anonymous' # Anon session -
trac/auth.py
old new 41 41 cursor = self.db.cursor () 42 42 cookie = util.hex_entropy() 43 43 cursor.execute ("INSERT INTO auth_cookie (cookie, name, ipnr, time)" + 44 "VALUES (%s, %s, %s, % d)",45 cookie, req.remote_user, req.remote_addr,46 int(time.time()) );44 "VALUES (%s, %s, %s, %s)", 45 (cookie, req.remote_user, req.remote_addr, 46 int(time.time()),)); 47 47 self.db.commit () 48 48 self.authname = req.remote_user 49 49 req.outcookie['trac_auth'] = cookie … … 52 52 def logout(self): 53 53 cursor = self.db.cursor () 54 54 cursor.execute ("DELETE FROM auth_cookie WHERE name=%s", 55 self.authname)55 (self.authname,)) 56 56 self.db.commit () -
trac/Wiki.py
old new 58 58 if version: 59 59 cursor.execute ('SELECT version, text, readonly FROM wiki ' 60 60 'WHERE name=%s AND version=%s', 61 name, version)61 (name, version,)) 62 62 else: 63 63 cursor.execute ('SELECT version, text, readonly FROM wiki ' 64 'WHERE name=%s ORDER BY version DESC LIMIT 1', name) 64 'WHERE name=%s ORDER BY version DESC LIMIT 1', 65 (name,)) 65 66 row = cursor.fetchone() 66 67 if row: 67 68 self.new = 0 -
trac/Database.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 22 import os 23 24 class Database: 25 """ 26 A wrapper for presenting Trac with a consistent database interface, 27 even though different backend dbms's may be used 28 """ 29 30 def __init__(self, path, db_str): 31 self.path = path 32 self.db_str = db_str 33 34 def get_db_cnx(self): 35 db_str = self.db_str 36 pos = db_str.find(':') 37 if pos == -1: 38 raise DatabaseError, 'Connection param must be of form ' \ 39 '(db_module_name):(db_connect_params), the value "%s ' \ 40 'does not match' % db_str 41 42 self.dbms = db_str[:pos].lower() 43 connect_params = db_str[pos+1:].split(',') 44 45 # following is very crude code for parsing the arguments in the 46 # db_connect_params string 47 kargs = {} 48 arg_list = [] 49 for x in connect_params: 50 pos1 = x.find('=') 51 pos2 = x.find('"') 52 pos3 = x.find("'") 53 if pos1 > -1: 54 if pos2 > -1 and pos2 < pos1: 55 arg_list.append(eval(x)) 56 elif pos3 > -1 and pos3 < pos1: 57 arg_list.append(eval(x)) 58 else: 59 name = x[:pos1].strip() 60 value = eval(x[pos1+1:].strip()) 61 kargs[name] = value 62 else: 63 arg_list.append(eval(x)) 64 args = tuple(arg_list) 65 66 # since Trac has a slightly closer relationship with sqlite than 67 # other db's, there's a special case setup here so that when the 68 # path to the sqlite db is specified, its relative to TRAC_ENV 69 if self.dbms == 'sqlite': 70 db_name = os.path.join(self.path, args[0]) 71 args = list(args) 72 args[0] = '%s' % db_name 73 args = tuple(args) 74 if check_exists == 1 and not os.access(db_name, os.F_OK): 75 raise DatabaseError, 'Database "%s" not found.' % db_name 76 77 directory = os.path.dirname(db_name) 78 if (check_exists == 1 and not os.access(db_name, os.R_OK + os.W_OK)) \ 79 or not os.access(directory, os.R_OK + os.W_OK): 80 raise DatabaseError, \ 81 'The web server user requires read _and_ write ' \ 82 'permission\nto the database %s and the directory this '\ 83 'file is located in.' % db_name 84 85 # import proper database driver/module 86 87 # handle weird import for PostgreSQL module 88 if self.dbms == 'pgsql': 89 import_str = "from pyPgSQL import PgSQL" 90 module_name = "PgSQL" # case-sensitive 91 else: 92 import_str = 'import %s' % self.dbms 93 module_name = self.dbms 94 95 exec import_str 96 m = eval(module_name) 97 98 # open and return connection 99 conn = m.connect(*args, **kargs) 100 return conn 101 102 def create(self): 103 if self.dbms == 'sqlite': 104 os.mkdir(os.path.join(self.path, 'db')) 105 106 cnx = self.get_db_cnx() 107 cursor = cnx.cursor() 108 109 # get right db schema based on db_str 110 dbschema = db_default.schema &nb
