Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
erp5
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Yoji Takeuchi
erp5
Commits
406b1c68
Commit
406b1c68
authored
Feb 19, 2013
by
Julien Muchembled
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ZMySQLDA: code cleanup
parent
48600cf8
Changes
6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
63 additions
and
129 deletions
+63
-129
product/ZMySQLDA/DA.py
product/ZMySQLDA/DA.py
+2
-5
product/ZMySQLDA/Pool.py
product/ZMySQLDA/Pool.py
+0
-39
product/ZMySQLDA/__init__.py
product/ZMySQLDA/__init__.py
+1
-2
product/ZMySQLDA/connectionAdd.dtml
product/ZMySQLDA/connectionAdd.dtml
+1
-1
product/ZMySQLDA/connectionEdit.dtml
product/ZMySQLDA/connectionEdit.dtml
+1
-1
product/ZMySQLDA/db.py
product/ZMySQLDA/db.py
+58
-81
No files found.
product/ZMySQLDA/DA.py
View file @
406b1c68
...
...
@@ -91,15 +91,14 @@ __version__='$Revision: 1.4 $'[11:-2]
import
os
from
collections
import
defaultdict
from
weakref
import
WeakKeyDictionary
from
db
import
DB
import
transaction
import
Shared.DC.ZRDB
import
DABase
from
App.Dialogs
import
MessageDialog
from
App.special_dtml
import
HTMLFile
from
App.ImageFile
import
ImageFile
from
ExtensionClass
import
Base
from
DateTime
import
DateTime
from
.
import
DABase
from
.db
import
DB
SHARED_DC_ZRDB_LOCATION
=
os
.
path
.
dirname
(
Shared
.
DC
.
ZRDB
.
__file__
)
...
...
@@ -165,8 +164,6 @@ class Connection(DABase.Connection):
return
connection
.
string_literal
(
v
)
classes
=
(
'DA.Connection'
,)
meta_types
=
(
{
'name'
:
'Z %s Database Connection'
%
database_type
,
'action'
:
'manage_addZ%sConnectionForm'
%
database_type
,
...
...
product/ZMySQLDA/Pool.py
deleted
100644 → 0
View file @
48600cf8
from
Queue
import
Queue
,
Full
,
Empty
class
Pool
(
Queue
):
"""Manage a fixed-size pool of reusable, identical objects."""
def
__init__
(
self
,
constructor
,
poolsize
=
5
):
Queue
.
__init__
(
self
,
poolsize
)
self
.
constructor
=
constructor
def
get
(
self
,
block
=
1
):
"""Get an object from the pool or a new one if empty."""
try
:
return
self
.
empty
()
and
self
.
constructor
()
or
Queue
.
get
(
self
,
block
)
except
Empty
:
return
self
.
constructor
()
def
put
(
self
,
obj
,
block
=
1
):
"""Put an object into the pool if it is not full. The caller must
not use the object after this."""
try
:
return
self
.
full
()
and
None
or
Queue
.
put
(
self
,
obj
,
block
)
except
Full
:
pass
class
Constructor
:
"""Returns a constructor that returns apply(function, args, kwargs)
when called."""
def
__init__
(
self
,
function
,
*
args
,
**
kwargs
):
self
.
f
=
function
self
.
args
=
args
self
.
kwargs
=
kwargs
def
__call__
(
self
):
return
apply
(
self
.
f
,
self
.
args
,
self
.
kwargs
)
product/ZMySQLDA/__init__.py
View file @
406b1c68
...
...
@@ -87,8 +87,7 @@ __doc__='''Generic Database Adapter Package Registration
$Id: __init__.py,v 1.4 2001/08/17 02:17:38 adustman Exp $'''
__version__
=
'$Revision: 1.4 $'
[
11
:
-
2
]
import
sys
,
string
import
DA
from
.
import
DA
methods
=
DA
.
folder_methods
misc_
=
DA
.
misc_
...
...
product/ZMySQLDA/connectionAdd.dtml
View file @
406b1c68
...
...
@@ -31,7 +31,7 @@
<tr>
<th
align=
"LEFT"
valign=
"TOP"
>
Connect immediately
</th>
<td
align=
"LEFT"
valign=
"TOP"
>
<input
name=
"check
"
type=
"CHECKBOX"
value=
"YES
"
CHECKED
>
<input
name=
"check
:int"
type=
"CHECKBOX"
value=
"1
"
CHECKED
>
</td>
</tr>
<tr>
...
...
product/ZMySQLDA/connectionEdit.dtml
View file @
406b1c68
...
...
@@ -32,7 +32,7 @@
<tr>
<th
align=
"LEFT"
valign=
"TOP"
>
Connect immediately
</th>
<td
align=
"LEFT"
valign=
"TOP"
>
<input
name=
"check
"
type=
"CHECKBOX"
value=
"YES
"
CHECKED
>
<input
name=
"check
:int"
type=
"CHECKBOX"
value=
"1
"
CHECKED
>
</td>
</tr>
...
...
product/ZMySQLDA/db.py
View file @
406b1c68
...
...
@@ -105,7 +105,6 @@ from zLOG import LOG, ERROR
from
ZODB.POSException
import
ConflictError
import
sys
from
string
import
strip
,
split
,
upper
,
rfind
hosed_connection
=
(
CR
.
SERVER_GONE_ERROR
,
...
...
@@ -150,19 +149,14 @@ type_xlate = {
}
def
_mysql_timestamp_converter
(
s
):
if
len
(
s
)
<
14
:
s
=
s
+
"0"
*
(
14
-
len
(
s
))
s
=
s
.
ljust
(
14
,
'0'
)
parts
=
map
(
int
,
(
s
[:
4
],
s
[
4
:
6
],
s
[
6
:
8
],
s
[
8
:
10
],
s
[
10
:
12
],
s
[
12
:
14
]))
return
DateTime
(
"%04d-%02d-%02d %02d:%02d:%02d"
%
tuple
(
parts
))
def
DateTime_or_None
(
s
):
try
:
return
DateTime
(
'%s UTC'
%
s
)
except
:
return
None
def
int_or_long
(
s
):
try
:
return
int
(
s
)
except
:
return
long
(
s
)
except
Exception
:
return
None
def
ord_or_None
(
s
):
if
s
is
not
None
:
...
...
@@ -171,7 +165,7 @@ def ord_or_None(s):
class
DB
(
TM
):
conv
=
conversions
.
copy
()
conv
[
FIELD_TYPE
.
LONG
]
=
int
_or_long
conv
[
FIELD_TYPE
.
LONG
]
=
int
conv
[
FIELD_TYPE
.
DATETIME
]
=
DateTime_or_None
conv
[
FIELD_TYPE
.
DATE
]
=
DateTime_or_None
conv
[
FIELD_TYPE
.
DECIMAL
]
=
float
...
...
@@ -187,7 +181,7 @@ class DB(TM):
transactionality once instead of once per DB instance.
"""
self
.
_connection
=
connection
self
.
_
kw_args
=
self
.
_parse_connection_string
(
connection
)
self
.
_
parse_connection_string
(
)
self
.
_forceReconnection
()
transactional
=
self
.
db
.
server_capabilities
&
CLIENT
.
TRANSACTIONS
if
self
.
_try_transactions
==
'-'
:
...
...
@@ -197,50 +191,40 @@ class DB(TM):
self
.
_transactions
=
transactional
self
.
_use_TM
=
transactional
or
self
.
_mysql_lock
def
_parse_connection_string
(
self
,
connection
):
kwargs
=
{
'conv'
:
self
.
conv
}
items
=
split
(
connection
)
self
.
_use_TM
=
None
if
not
items
:
return
kwargs
compress
=
items
[
0
]
if
compress
==
"~"
:
def
_parse_connection_string
(
self
):
self
.
_mysql_lock
=
self
.
_try_transactions
=
None
self
.
_kw_args
=
kwargs
=
{
'conv'
:
self
.
conv
}
items
=
self
.
_connection
.
split
()
if
not
items
:
return
if
items
[
0
]
==
"~"
:
kwargs
[
'compress'
]
=
True
items
=
items
[
1
:]
lockreq
,
items
=
items
[
0
],
items
[
1
:]
if
lockreq
[
0
]
==
"*"
:
self
.
_mysql_lock
=
lockreq
[
1
:]
db_host
,
items
=
items
[
0
],
items
[
1
:]
self
.
_use_TM
=
1
else
:
self
.
_mysql_lock
=
None
db_host
=
lockreq
if
'@'
in
db_host
:
db
,
host
=
split
(
db_host
,
'@'
,
1
)
kwargs
[
'db'
]
=
db
del
items
[
0
]
if
items
[
0
][
0
]
==
"*"
:
self
.
_mysql_lock
=
items
.
pop
(
0
)[
1
:]
db
=
items
.
pop
(
0
)
if
'@'
in
db
:
db
,
host
=
db
.
split
(
'@'
,
1
)
if
host
.
startswith
(
'['
):
host
,
port
=
split
(
host
[
1
:],
']'
,
1
)
host
,
port
=
host
[
1
:].
split
(
']'
,
1
)
if
port
.
startswith
(
':'
):
kwargs
[
'port'
]
=
int
(
port
[
1
:])
elif
':'
in
host
:
host
,
port
=
split
(
host
,
':'
,
1
)
host
,
port
=
host
.
split
(
':'
,
1
)
kwargs
[
'port'
]
=
int
(
port
)
kwargs
[
'host'
]
=
host
else
:
kwargs
[
'db'
]
=
db_host
if
kwargs
[
'db'
]
and
kwargs
[
'db'
][
0
]
in
(
'+'
,
'-'
):
self
.
_try_transactions
=
kwargs
[
'db'
][
0
]
kwargs
[
'db'
]
=
kwargs
[
'db'
][
1
:]
else
:
self
.
_try_transactions
=
None
if
not
kwargs
[
'db'
]:
del
kwargs
[
'db'
]
if
not
items
:
return
kwargs
kwargs
[
'user'
],
items
=
items
[
0
],
items
[
1
:]
if
not
items
:
return
kwargs
kwargs
[
'passwd'
],
items
=
items
[
0
],
items
[
1
:]
if
not
items
:
return
kwargs
kwargs
[
'unix_socket'
],
items
=
items
[
0
],
items
[
1
:]
return
kwargs
if
db
:
if
db
[
0
]
in
'+-'
:
self
.
_try_transactions
=
db
[
0
]
db
=
db
[
1
:]
if
db
:
kwargs
[
'db'
]
=
db
if
items
:
kwargs
[
'user'
]
=
items
.
pop
(
0
)
if
items
:
kwargs
[
'passwd'
]
=
items
.
pop
(
0
)
if
items
:
kwargs
[
'unix_socket'
]
=
items
.
pop
(
0
)
defs
=
{
FIELD_TYPE
.
CHAR
:
"i"
,
FIELD_TYPE
.
DATE
:
"d"
,
...
...
@@ -271,23 +255,23 @@ class DB(TM):
return
r
def
columns
(
self
,
table_name
):
from
string
import
join
try
:
c
=
self
.
_query
(
'SHOW COLUMNS FROM %s'
%
table_name
)
except
:
except
Exception
:
return
()
join
=
str
.
join
r
=
[]
for
Field
,
Type
,
Null
,
Key
,
Default
,
Extra
in
c
.
fetch_row
(
0
):
info
=
{}
field_default
=
Default
and
"DEFAULT %s"
%
Default
or
''
if
Default
:
info
[
'Default'
]
=
Default
if
'('
in
Type
:
end
=
rfind
(
Type
,
')'
)
short_type
,
size
=
split
(
Type
[:
end
],
'('
,
1
)
end
=
Type
.
rfind
(
')'
)
short_type
,
size
=
Type
[:
end
].
split
(
'('
,
1
)
if
short_type
not
in
(
'set'
,
'enum'
):
if
','
in
size
:
info
[
'Scale'
],
info
[
'Precision'
]
=
\
map
(
int
,
s
plit
(
size
,
','
,
1
))
map
(
int
,
s
ize
.
split
(
','
,
1
))
else
:
info
[
'Scale'
]
=
int
(
size
)
else
:
...
...
@@ -302,7 +286,7 @@ class DB(TM):
info
[
'Description'
]
=
join
([
Type
,
field_default
,
Extra
or
''
,
key_types
.
get
(
Key
,
Key
or
''
),
Null
!=
'YES'
and
'NOT NULL'
or
''
]),
info
[
'Nullable'
]
=
(
Null
==
'YES'
)
and
1
or
0
info
[
'Nullable'
]
=
Null
==
'YES'
if
Key
:
info
[
'Index'
]
=
1
if
Key
==
'PRI'
:
...
...
@@ -331,8 +315,7 @@ class DB(TM):
raise
OperationalError
(
m
[
0
],
'%s: %s'
%
(
m
[
1
],
query
))
if
m
[
0
]
in
lock_error
:
raise
ConflictError
(
'%s: %s: %s'
%
(
m
[
0
],
m
[
1
],
query
))
if
((
not
force_reconnect
)
and
\
(
self
.
_mysql_lock
or
self
.
_transactions
))
or
\
if
not
force_reconnect
and
self
.
_use_TM
or
\
m
[
0
]
not
in
hosed_connection
:
LOG
(
'ZMySQLDA'
,
ERROR
,
'query failed: %s'
%
(
query
,))
raise
...
...
@@ -370,39 +353,33 @@ class DB(TM):
def
query
(
self
,
query_string
,
max_rows
=
1000
):
self
.
_use_TM
and
self
.
_register
()
desc
=
None
result
=
()
desc
=
None
# XXX deal with a typical mistake that the user appends
# an unnecessary and rather harmful semicolon at the end.
# Unfortunately, MySQLdb does not want to be graceful.
if
query_string
[
-
1
:]
==
';'
:
query_string
=
query_string
[:
-
1
]
for
qs
in
filter
(
None
,
map
(
strip
,
split
(
query_string
,
'
\
0
'
))
):
q
type
=
upper
(
split
(
qs
,
None
,
1
)[
0
]
)
if
q
type
==
"SELECT"
and
max_row
s
:
qs
=
"%s LIMIT %d"
%
(
qs
,
max_rows
)
r
=
0
for
qs
in
query_string
.
split
(
'
\
0
'
):
q
s
=
qs
.
strip
(
)
if
qs
:
if
qs
[:
6
].
upper
()
==
"SELECT"
and
max_rows
:
qs
=
"%s LIMIT %d"
%
(
qs
,
max_rows
)
c
=
self
.
_query
(
qs
)
if
c
:
if
desc
is
not
None
is
not
c
.
describe
():
raise
'Query Error'
,
(
raise
Exception
(
'Multiple select schema are not allowed'
)
desc
=
c
.
describe
()
result
=
c
.
fetch_row
(
max_rows
)
if
desc
is
None
:
return
(),()
items
=
[]
func
=
items
.
append
defs
=
self
.
defs
for
d
in
desc
:
item
=
{
'name'
:
d
[
0
],
'type'
:
defs
.
get
(
d
[
1
],
"t"
),
desc
=
c
.
describe
()
result
=
c
.
fetch_row
(
max_rows
)
if
desc
is
None
:
return
(),
()
get_def
=
self
.
defs
.
get
items
=
[{
'name'
:
d
[
0
],
'type'
:
get_def
(
d
[
1
],
"t"
),
'width'
:
d
[
2
],
'null'
:
d
[
6
]
}
func
(
item
)
}
for
d
in
desc
]
return
items
,
result
def
string_literal
(
self
,
s
):
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment