PostgresqlPatch: pgsql_patch_10.diff
| File pgsql_patch_10.diff, 57.7 kB (added by brad <brad@dsource.org>, 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 perm 34 34 from trac import util … … 93 93 return 0 94 94 return 1 95 95 96 def env_create(self ):96 def env_create(self, db_str): 97 97 try: 98 self.__env = trac.Environment.Environment (self.envname, create=1)98 self.__env = trac.Environment.Environment (self.envname, 1, db_str) 99 99 return self.__env 100 100 except Exception, e: 101 101 print 'Failed to create environment.', e … … 112 112 113 113 def db_execsql (self, sql, cursor=None): 114 114 data = [] 115 row = None 115 116 if not cursor: 116 117 cnx=self.db_open() 117 118 cursor = cnx.cursor() … … 119 120 cnx = None 120 121 cursor.execute(sql) 121 122 while 1: 122 row = cursor.fetchone() 123 try: 124 row = cursor.fetchone() 125 except: 126 pass 123 127 if row == None: 124 128 break 125 129 data.append(row) … … 452 456 453 457 ## Initenv 454 458 _help_initenv = [('initenv', 'Create and initialize a new environment interactively'), 455 ('initenv <projectname> <repospath> <templatepath> ',459 ('initenv <projectname> <repospath> <templatepath> <dbms> [dbms options]', 456 460 'Create and initialize a new environment from arguments')] 457 461 458 462 def do_initdb(self, line): … … 485 489 dt = trac.siteconfig.__default_templates_dir__ 486 490 prompt = 'Templates directory [%s]> ' % dt 487 491 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 488 547 return returnvals 489 548 490 549 def do_initenv(self, line): … … 495 554 project_name = None 496 555 repository_dir = None 497 556 templates_dir = None 557 db_str = None 498 558 if len(arg) == 1: 499 559 returnvals = self.get_initenv_args() 500 560 project_name = returnvals[0] 501 561 repository_dir = returnvals[1] 502 562 templates_dir = returnvals[2] 503 elif len(arg)!= 3: 563 db_str = returnvals[3] 564 elif len(arg) < 4: 504 565 print 'Wrong number of arguments to initenv %d' % len(arg) 505 566 return 506 567 else: 507 568 project_name = arg[0] 508 569 repository_dir = arg[1] 509 570 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 510 611 from svn import util, repos, core 511 612 core.apr_initialize() 512 613 pool = core.svn_pool_create(None) … … 525 626 return 526 627 try: 527 628 print 'Creating and Initializing Project' 528 self.env_create( )629 self.env_create(db_str) 529 630 cnx = self.__env.get_db_cnx() 530 631 print ' Inserting default data' 531 632 self.__env.insert_default_data() … … 664 765 self.do_help ('wiki') 665 766 except Exception, e: 666 767 print 'Wiki %s failed:' % arg[0], e 768 print traceback.print_exc() 769 667 770 668 771 def _do_wiki_list(self): 669 772 data = self.db_execsql('SELECT name,max(version),time' … … 794 897 self.print_listing(['Possible Values'], data) 795 898 796 899 def _do_enum_add(self, type, name): 900 797 901 sql = ("INSERT INTO enum(value,type,name) " 798 902 " SELECT 1+COALESCE(max(value),0),'%(type)s','%(name)s'" 799 903 " FROM enum WHERE type='%(type)s'" -
trac/db_default.py
old new 172 172 CREATE INDEX session_idx ON session(sid,var_name); 173 173 """ 174 174 175 schema_pgsql = """ 176 CREATE TABLE revision ( 177 rev integer, 178 time integer, 179 author text, 180 message text, 181 CONSTRAINT revision_pkey PRIMARY KEY (rev) 182 ); 183 184 CREATE 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 191 CREATE 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 199 CREATE TABLE enum ( 200 type text, 201 name text, 202 value integer, 203 CONSTRAINT enum_pkey PRIMARY KEY(name,type) 204 ); 205 206 CREATE TABLE system ( 207 name text, 208 value text, 209 CONSTRAINT system_pkey PRIMARY KEY(name) 210 ); 211 212 CREATE 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; 221 CREATE 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 242 CREATE 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 252 CREATE 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; 260 CREATE 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 269 CREATE TABLE permission ( 270 username text, -- 271 action text, -- allowable activity 272 CONSTRAINT permission_pkey PRIMARY KEY(username,action) 273 ); 274 275 CREATE TABLE component ( 276 name text, 277 owner text, 278 CONSTRAINT component_pkey PRIMARY KEY(name) 279 ); 280 281 CREATE 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 289 CREATE TABLE version ( 290 name text, 291 time integer, 292 CONSTRAINT version_pkey PRIMARY KEY(name) 293 ); 294 295 CREATE 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 307 CREATE 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 319 CREATE 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 175 329 ## 176 330 ## Default Reports 177 331 ## … … 293 447 FROM ticket t,enum p 294 448 WHERE p.name=t.priority AND p.type='priority' 295 449 ORDER BY (milestone IS NULL), milestone DESC, (status = 'closed'), 296 (CASE status WHEN 'closed' THEN modifiedELSE (-1)*p.value END) DESC450 (CASE status WHEN 'closed' THEN changetime ELSE (-1)*p.value END) DESC 297 451 """), 298 452 #---------------------------------------------------------------------------- 299 453 ('My Tickets', … … 411 565 (('trac', 'htdocs_location', '/trac/'), 412 566 ('trac', 'repository_dir', '/var/svn/myrep'), 413 567 ('trac', 'templates_dir', '/usr/lib/trac/templates'), 414 ('trac', 'database', 'sqlite: db/trac.db'),568 ('trac', 'database', 'sqlite:"db/trac.db",timeout=10000'), 415 569 ('trac', 'default_charset', 'iso-8859-15'), 416 570 ('logging', 'log_type', 'none'), 417 571 ('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 111 111 self.perm.assert_permission(perm.REPORT_CREATE) 112 112 113 113 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 117 118 self.db.commit() 118 119 req.redirect(self.env.href.report(id)) 119 120 -
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/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 def test_constrained_by_milestone(self): … … 81 81 self.assertEqual(sql, 82 82 """SELECT id,summary,status,owner,priority,component,version,milestone 83 83 FROM ticket 84 LEFT OUTER JOIN (SELECT name AS milestone_name, due AS milestone_time FROM milestone) ON milestone_name=milestone84 LEFT OUTER JOIN (SELECT name AS milestone_name, due AS milestone_time FROM milestone) a ON milestone_name=milestone 85 85 ORDER BY COALESCE(milestone,'')='',COALESCE(milestone_time,0)=0,milestone_time,milestone,COALESCE(id,0)=0,id""") 86 86 87 87 def test_all_grouped_by_milestone_desc(self): … … 90 90 self.assertEqual(sql, 91 91 """SELECT id,summary,status,owner,priority,component,version,milestone 92 92 FROM ticket 93 LEFT OUTER JOIN (SELECT name AS milestone_name, due AS milestone_time FROM milestone) ON milestone_name=milestone93 LEFT OUTER JOIN (SELECT name AS milestone_name, due AS milestone_time FROM milestone) a ON milestone_name=milestone 94 94 ORDER BY COALESCE(milestone,'')='' DESC,COALESCE(milestone_time,0)=0 DESC,milestone_time DESC,milestone DESC,COALESCE(id,0)=0,id""") 95 95 96 96 def test_grouped_by_priority(self): … … 99 99 self.assertEqual(sql, 100 100 """SELECT id,summary,status,owner,milestone,component,version,priority 101 101 FROM ticket 102 LEFT OUTER JOIN (SELECT name AS priority_name, value AS priority_value FROM enum WHERE type='priority') ON priority_name=priority102 LEFT OUTER JOIN (SELECT name AS priority_name, value AS priority_value FROM enum WHERE type='priority') e ON priority_name=priority 103 103 ORDER BY COALESCE(priority,'')='',priority_value,id""") 104 104 105 105 def test_constrained_by_milestone_not(self): … … 170 170 self.assertEqual(sql, 171 171 """SELECT id,summary,status,owner,priority,milestone,component, foo.value AS foo 172 172 FROM 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 174 174 WHERE COALESCE(foo,'')='something' 175 175 ORDER BY COALESCE(id,0)=0,id""") 176 176 -
trac/tests/db.py
old new 1 2 import unittest 3 from trac.Environment import Environment # TODO: take out trac. when being run 4 # from normal trac/test.py 5 6 class DBTestBase: 7 def setUp(self): 8 pass 9 10 def tearDown(self): 11 pass 12 13 class 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 28 def 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? 33 if __name__ == '__main__': 34 unittest.main(defaultTest='suite') 35 -
trac/Session.py
old new 64 64 def get_session(self, sid): 65 65 self.sid = sid 66 66 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,)) 69 69 rows = curs.fetchall() 70 70 if (not rows # No session data yet 71 71 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 22 import os 23 24 def 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 46 class 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 85 class 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 124 class 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
<
