;ò Á7Cc@swdZdZdkZdkZdkZdkZdkZeiii eiii fZ d„Z dfd„ƒYZ dS(s Database connection s $Rev: 71 $NcCss|itiƒ|itiƒ|itiƒti}t|ƒdjot |d„|ƒ}n|}|SdS(NicCs ||j S(N(sxsiroles(sxsiroles((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pys s( srolessappendscfgsMYSQL_USER_ROLEsZOPE_ANONYMOUS_ROLEsZOPE_AUTHENTICATED_ROLEsVALIDATE_IGNORE_ROLESsirolesslensfilters new_roles(srolessiroless new_roles((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pyssetup_user_roless s dbConnectioncBsˆtZdZd„Zd„Zd„Zd„Zdd„Zd„Ze e d„Z d „Z d „Z d „Z d „Zd „Zd„Zd„Zd„Zd„Zdd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Ze d„Zd„Zd„Zd„Zd„Z d„Z!d „Z"d!„Z#d"„Z$d#„Z%d$„Z&dd%„Z'd&„Z(d'„Z)d(„Z*d)„Z+RS(*s… DB Connection class. It is supposed to be refferenced as _v_ attribute of all classes that need access to a database. So this class does not use locks. dbConnection methods will lock MySQL tables in case they need to access more than one table. Because MySQL does not support transactions loosing connection in the middle of the transaction could create problems. cCsd||_||_||_||_||_||_t|_|i o d|_nd|_ dS(Niê i( sserversSelfsportssocketsdb_namesuserspasswordsNonesdb_consdb_error(sSelfsserversportssocketsdb_namesuserspassword((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pys__init__6s        cCs |iSdS(N(scurs lastrowid(sSelfscur((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pys__autoincrement_idGsc Cs£t|ƒ}d}xzt|ƒD]l}||\}}|djo d}nd}d||f}||}||djo|d}qqW|i |fƒdS(Ns lock tables srsreadswrites%s %sis, ( slenstb_listslsquerysrangesistablesmodesmode_strsvsSelfs_dbConnection__do_query( sSelfstb_listsismode_strsvslsmodestablesquery((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pys __lock_tablesKs    cCs|idfƒdS(Ns unlock tables(sSelfs_dbConnection__do_query(sSelf((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pys__unlock_tables]sicCsé|itjo|iƒn|itjo t}nª|iiƒ}y0| o|i||ƒn|i ||ƒWngt i j oX}|dtjo!|iƒ|i|||ƒSnd|_tid|ƒ‚nX|SdS(NiisDatabase error: %s(sSelfsdb_consNonesconnectsresscursorsmanysexecutesquerysparams executemanysMySQLdbs MySQLErrorsesDB_HOSED_CONNECTIONs_dbConnection__do_querysdb_errorsutils log_error(sSelfsquerysparamsmanysesres((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pys __do_query`s"   cCsƒ|i||ƒ}|tjogSn|iƒ}g}x?t t |ƒƒD]+}||\}|o|i |ƒqLqLW|SdS(sl This function returns a list of values from the select query. Result set should contain only one field. N(sSelfs_dbConnection__do_querysquerysargsscursNonesfetchallsdatasretsrangeslensisvaluesappend(sSelfsquerysargssvaluescursisretsdata((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pys__query_list_fieldys   cCshd|}|od||f}n|i||ƒ}|tjogSn|iƒ}|ddSdS(sJ Returns number of rows in the recordset specified by where clause. sselect count(*) from %ss %s where %siN( stablesquerys where_clausesSelfs_dbConnection__do_querysargsscursNonesfetchallsdata(sSelfstables where_clausesargsscursquerysdata((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pys __query_count‰s   cCs |iSdS(N(scursrowcount(sSelfscur((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pys__affected_rows™sc Cs·|idjoMtidƒtid|id|id|id|i d|i ƒ|_ nJtidƒtid|id |id|id|i d|i ƒ|_ d |_ d SdS( Nssdb.connect (): using TCP.shostsportsuserspasswdsdbsdb.connect (): using socket.s unix_socketii( sSelfssocketsutils log_debugsMySQLdbsconnectsserversportsuserspasswordsdb_namesdb_consdb_error(sSelf((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pysconnect s     cCs/|itj o|iiƒnt|_dS(N(sSelfsdb_consNonesclose(sSelf((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pys disconnect²scCs |iSdS(N(sSelfsdb_error(sSelf((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pys has_errors¸scCsV|iƒ}|iƒ}|iƒ}d}|i d||||fƒ}|djSdS(Ns(Username = %s and Realm = %s and Id = %ssUsersi( susers getUserNamesusernamesgetRealmsrealmsgetDBIdsidswheresSelfs_dbConnection__query_countscnt(sSelfsusersusernamescntsrealmswheresid((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pys __check_user¿s    cCs/d}|id|||fƒ}|djSdS(NsUsername = %s and Realm = %ssUsersi(swheresSelfs_dbConnection__query_countsusernamesrealmscnt(sSelfsusernamesrealmswherescnt((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pys__check_user_existÊscCs#d}|i||fƒ}|SdS(Ns=select Rolename from Roles where Realm = %s order by Rolename(squerysSelfs_dbConnection__query_list_fieldsrealmsret(sSelfsrealmsquerysret((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pyslist_rolenamesÓscCsd}|i||fƒSdS(Ns=select Username from Users where Realm = %s order by Username(squerysSelfs_dbConnection__query_list_fieldsrealm(sSelfsrealmsquery((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pyslist_usernamesÙscCsy|iddfddfddfgƒd}|i|||fƒ\}d}|i|||fƒ}|iƒ|SdS(NsUserssrsRoless UserRoless7Select id from Roles where Realm = %s and Rolename = %ss”Select Users.Username from Users,UserRoles where (Users.Id = UserRoles.Id_User) and (UserRoles.Id_Role = %s)and (Users.Realm = %s) order by Username( sSelfs_dbConnection__lock_tablessquerys_dbConnection__query_list_fieldsrealmsrolesridsrets_dbConnection__unlock_tables(sSelfsrealmsrolesretsquerysrid((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pyslist_usernames_with_roleÝs( cCs|iƒ}|iƒ}|o|iƒ}n|it i ƒ|i ddƒ|i ggƒ|i ddƒ|iddfddfddfgƒ|o×d}|i||fƒ} | o|iƒtid ƒdSn| iƒ} t| ƒdjo#|iƒtid |ƒdSn| d\}}|}|i|ƒ||jo|iƒtid ƒdSqund }|i|||fƒ} | tjo|iƒtid ƒdSn| iƒ} t| ƒdjo|iƒtid ƒdSn| d\}}} }}}|tjo d}nt#i$t#i%|ƒƒ}d}|i'||fƒ}g}x9|D]1} d}|i'|| fƒ\} |i,| ƒqpWt-|ƒ}|i|ƒ|i ||ƒ|i ||ƒ|i || ƒ|iƒdSdS(Nsis sUserssrsRoless UserRoless/Select Username, Realm from Users where Id = %ss"dbConn.get_user_data (): no cursors1dbConn.get_user_data (): no user data by id: '%i's2dbConn.get_user_data (): invalid realm for user idsiSelect Id, Password, PasswordType, EMail, Realname, Domains from Users where Realm = %s and Username = %ss%dbConn.get_user_data (): no user datas0Select Id_Role from UserRoles where Id_User = %ss(Select Rolename from Roles where Id = %si(.susers getUserNamesusernamesgetRealmsrealmsby_idsgetDBIdsuids_setDBIdscfgsVDB_INVALID_IDs _setPasswords _setAuthDatas _setOtherDatasSelfs_dbConnection__lock_tablessquerys_dbConnection__do_queryscurs_dbConnection__unlock_tablessutils log_debugsfetchallsdataslensdusdrs _setUserNamesNonesidspasswords password_typesemailsrealnames domains_strsstringssplitsstripsdomainss_dbConnection__query_list_fieldsrole_idssrolessrole_idsrolesappendssetup_user_roles(sSelfsusersby_idsrole_idssuidsquerysidsdusrealmscursdatasrole_idsroles password_typesemailsusernamesrealnames domains_strspasswordsdrsrolessdomains((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pys get_user_dataìst  (                   cCs&d}d}|i|||fƒSdS(Ns Realm = %ssUsers(swherestablesSelfs_dbConnection__query_countsrealm(sSelfsrealmswherestable((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pys count_usersGscCs&d}d}|i|||fƒSdS(Ns Realm = %ssRoles(swherestablesSelfs_dbConnection__query_countsrealm(sSelfsrealmswherestable((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pys count_rolesMscCsŸ|iddfgƒ|i|ƒ o|iƒdSn|iƒ}d}|i||||fƒ}| o d}n|i |ƒdj}|iƒ|SdS(NsUsersswis?update Users set Password = %s, PasswordType = %s where Id = %si(sSelfs_dbConnection__lock_tabless_dbConnection__check_usersusers_dbConnection__unlock_tablessgetDBIdsidsquerys_dbConnection__do_queryspasswordsptypescursrets_dbConnection__affected_rows(sSelfsuserspasswordsptypescursretsquerysid((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pyschange_user_passwordSs    c Cs|iddfddfddfgƒ|i|ƒ o|iƒdSn|iƒ}|iƒ}d}|i ||fƒxv|D]n}d}|i |||fƒ}|gjo)|\}d }|i |||fƒqƒ|iƒd |‚qƒW|iƒd SdS( NsUserssrsRoless UserRolesswis(delete from UserRoles where Id_User = %ss7Select Id from Roles where Rolename = %s and Realm = %ss8insert into UserRoles (Id_Role, Id_User) Values (%s, %s)sUnknown role: %si(sSelfs_dbConnection__lock_tabless_dbConnection__check_usersusers_dbConnection__unlock_tablessgetDBIdsuser_idsgetRealmsrealmsquerys_dbConnection__do_querysrolessroles_dbConnection__query_list_fieldsretsrole_id( sSelfsusersrolessrealmsretsrole_idsrolesquerysuser_id((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pyschange_user_roleshs((       cCsát|ƒtgƒjpt|ƒtfƒjoti|ƒ}n|iddfgƒ|i|ƒ o|iƒdSn|i ƒ}d}|i |||fƒ}| o d}n|i|ƒdj}|iƒ|SdS(NsUsersswis+update Users set Domains = %s where Id = %si(stypesdomainssstringsjoinsSelfs_dbConnection__lock_tabless_dbConnection__check_usersusers_dbConnection__unlock_tablessgetDBIdsidsquerys_dbConnection__do_queryscursrets_dbConnection__affected_rows(sSelfsusersdomainssretsquerysidscur((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pyschange_user_domains‡s2    cCsŸ|iddfgƒ|i|ƒ o|iƒdSn|iƒ}d}|i||||fƒ}| o d}n|i |ƒdj}|iƒ|SdS(NsUsersswis8update Users set Realname = %s, EMail = %s where Id = %si(sSelfs_dbConnection__lock_tabless_dbConnection__check_usersusers_dbConnection__unlock_tablessgetDBIdsidsquerys_dbConnection__do_querysrealnamesemailscursrets_dbConnection__affected_rows(sSelfsusersrealnamesemailsretsquerysidscur((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pyschange_user_otherœs    c Cs*|iddfddfddfgƒ|i||ƒo|iƒdSnd} |i| ||dti fƒ}t |i |ƒƒ}xŒ|D]„}d } |i| ||fƒ}|gjo)|\}d } |i| ||fƒq|iƒ|i||ƒd ||f‚qW|iƒd SdS( NsUsersswsRolessrs UserRolesisSinsert into Users (Username, Realm, Password, PasswordType) values (%s, %s, %s, %s)ss7Select Id from Roles where Rolename = %s and Realm = %ss8insert into UserRoles (Id_Role, Id_User) Values (%s, %s)sUnknown role: (%s, %s)i(sSelfs_dbConnection__lock_tabless_dbConnection__check_user_existsusernamesrealms_dbConnection__unlock_tablessquerys_dbConnection__do_queryscfgsVDB_INVALID_PASSWORD_TYPEscursints_dbConnection__autoincrement_idsuser_idsrolessroles_dbConnection__query_list_fieldsretsrole_idsdel_user( sSelfsusernamesrealmsrolesscursuser_idsretsrole_idsrolesquery((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pys create_user°s(( !    c CsJ|iddfddfddfddfddfgƒd}|i|||fƒ}|gjo|iƒdSn|\}d }|i||fƒ}x!|D]}|i d ||ƒq¢W|i d ||ƒd }|i ||fƒd }|i ||fƒd}|i ||fƒ|o|i||ƒn|iƒdSdS(NsUserssws UserRolessMiscDatasSessionssTokenss7select Id from Users where Username = %s and Realm = %sis*select Id from Sessions where Id_User = %sssessionsusers'delete from Sessions where Id_User = %ss(delete from UserRoles where Id_User = %ssdelete from Users where Id = %si(sSelfs_dbConnection__lock_tablessquerys_dbConnection__query_list_fieldsusernamesrealmsrets_dbConnection__unlock_tablessidssidsssids del_tokens_dbConnection__do_querysmclasssdel_misc_data_class( sSelfsusernamesrealmsmclassssidssretssidsquerysid((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pysdel_userÔs.:    cCs$d}|i|||fƒdSdS(Ns3insert into Roles (Rolename, Realm) values (%s, %s)i(squerysSelfs_dbConnection__do_querysrolesrealm(sSelfsrolesrealmsquery((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pys create_roleùscCs©|iddfddfgƒd}|i|||fƒ}|gjo|iƒdSn|\}d}|i ||fƒd}|i ||fƒ|iƒdSdS( NsRolessws UserRoless7Select Id from Roles where Rolename = %s and Realm = %sisdelete from Roles where Id = %ss(delete from UserRoles where Id_Role = %si( sSelfs_dbConnection__lock_tablessquerys_dbConnection__query_list_fieldsrolesrealmsrets_dbConnection__unlock_tablessrole_ids_dbConnection__do_query(sSelfsrolesrealmsretsrole_idsquery((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pysdel_roleÿs    cCsM|iƒ}d}|i||fƒ}t|i|ƒƒ}|i |ƒdS(Ns*insert into Sessions (id_user) values (%s)( ssessions getUserIdsuser_idsquerysSelfs_dbConnection__do_queryscursints_dbConnection__autoincrement_idsids_setId(sSelfssessionsuser_idscursquerysid((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pyscreate_sessions  cCs†|iƒ}d}|i||fƒ}| o(|iti ƒ|i ti ƒ|Snt |ƒdjpt ‚|i |dƒdS(Ns*select Id_User from Sessions where Id = %sii( ssesssgetIdsidsquerysSelfs_dbConnection__query_list_fieldsress_setIdscfgsVDB_INVALID_IDs _setUserIdslensAssertionError(sSelfssesssressquerysid((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pys get_session"s cCs&d}|i|||iƒfƒdS(Ns.update Sessions set Id_User = %s where Id = %s(squerysSelfs_dbConnection__do_querysuser_idssessionsgetId(sSelfssessionsuser_idsquery((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pyssession_set_user_id1scCs#d}|i||||fƒdS(Ns>delete from Tokens where Class = %s and Id = %s and Realm = %s(squerysSelfs_dbConnection__do_querysclass_idstoken_idsrealm(sSelfsclass_idstoken_idsrealmsquery((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pys del_token;sc Csk|iddfgƒ|i|||ƒd} ||||||||f} |i | | ƒ|iƒdS(NsTokensswsvinsert into Tokens (Class, Id, Value, Created, Accessed, Timeout, Life, Realm) values (%s, %s, %s, %s, %s, %s, %s, %s)(sSelfs_dbConnection__lock_tabless del_tokensclass_idstoken_idsrealmsquerys token_values created_times accessed_times token_timeouts token_lifesvaluess_dbConnection__do_querys_dbConnection__unlock_tables( sSelfsclass_idstoken_ids token_values token_timeouts token_lifes created_times accessed_timesrealmsvaluessquery((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pys create_tokenAs cCs~d}|i||||fƒ}| otSn|iƒ}t |ƒdjotSnt |ƒdjpt ‚|dSdS(Nsfselect Value, Created, Accessed, Timeout, Life from Tokens where Class = %s and Id = %s and Realm = %sii( squerysSelfs_dbConnection__do_querysclass_idstoken_idsrealmscursNonesfetchallsdataslensAssertionError(sSelfsclass_idstoken_idsrealmscursquerysdata((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pys get_tokenSs cCs&d}|i|||||fƒdS(NsKupdate Tokens set Accessed = %s where Class = %s and Id = %s and Realm = %s(squerysSelfs_dbConnection__do_querystimesclass_idstoken_idsrealm(sSelfsclass_idstoken_idstimesrealmsquery((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pysupdate_token_accessedbsc CsÆt|ƒtfƒjo dd‚n|\}}|iddfgƒ|i|||ddƒ}|o)d}|i ||||||fƒn&d}|i ||||||fƒ|i ƒdS( Ns API Errors/save_misc_data () should be called with tuple. sMiscDataswscheckisaupdate MiscData set Value_int = %s, Value_string = %s where OId = %s and OClass = %s and MId = %ss\insert into MiscData (OId, OClass, MId, Value_int, Value_string) values (%s, %s, %s, %s, %s)(stypes misc_tuplesivssvsSelfs_dbConnection__lock_tabless get_misc_datas obj_classsobj_idsmisc_idsdatasquerys_dbConnection__do_querys_dbConnection__unlock_tables( sSelfs obj_classsobj_idsmisc_ids misc_tuplesdatassvsivsquery((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pyssave_misc_dataks  #c Cs®d}|i||||fƒ}| o| o ti SqDdSn|i ƒ}| o| o ti SqsdSnt |ƒdjpt ‚|d}|odSn|SdS(NsXselect Value_int, Value_string from MiscData where OId = %s and OClass = %s and MId = %sii(squerysSelfs_dbConnection__do_querysoidsoclasssmidscurscheckscfgsMISC_DATA_EMPTYsfetchallsdataslensAssertionErrorsr( sSelfsoclasssoidsmidscheckscursrsquerysdata((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pys get_misc_data„s     cCs#d}|i||||fƒdS(Ns@delete from MiscData where OId = %s and OClass = %s and MId = %s(squerysSelfs_dbConnection__do_querysoidsoclasssmid(sSelfsoclasssoidsmidsquery((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pys del_misc_datašscCs d}|i|||fƒdS(Ns3delete from MiscData where OId = %s and OClass = %s(squerysSelfs_dbConnection__do_querysoidsoclass(sSelfsoclasssoidsquery((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pysdel_misc_data_class scCs#d}|i||||fƒdS(NsFinsert delayed into Log (Realm, Id_Session, Event) values (%s, %s, %s)(squerysSelfs_dbConnection__do_querysrealmssidsevent(sSelfsrealmssidseventsquery((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pyslog_sql_simple¨sc Cs2d} |i| ||||||||fƒdS(Ns€insert delayed into Log (Realm, Id_Session, Event, EValue, EValue2, OType, OSize, RAddr) values (%s, %s, %s, %s, %s, %s, %s, %s)( squerysSelfs_dbConnection__do_querysrealmssidseventse_valuese_value2so_typeso_sizesr_addr( sSelfsrealmssidseventse_valuese_value2so_typeso_sizesr_addrsquery((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pyslog_sql­s(,s__name__s __module__s__doc__s__init__s_dbConnection__autoincrement_ids_dbConnection__lock_tabless_dbConnection__unlock_tabless_dbConnection__do_querys_dbConnection__query_list_fieldsNones_dbConnection__query_counts_dbConnection__affected_rowssconnects disconnects has_errorss_dbConnection__check_users_dbConnection__check_user_existslist_rolenamesslist_usernamesslist_usernames_with_roles get_user_datas count_userss count_rolesschange_user_passwordschange_user_rolesschange_user_domainsschange_user_others create_usersdel_users create_rolesdel_rolescreate_sessions get_sessionssession_set_user_ids del_tokens create_tokens get_tokensupdate_token_accessedssave_misc_datas get_misc_datas del_misc_datasdel_misc_data_classslog_sql_simpleslog_sql(((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pys dbConnection)sR               [       $ %           (s__doc__s __version__sstringsMySQLdbsMySQLdb.constants.CRsutilscfgs constantssCRsSERVER_GONE_ERRORs SERVER_LOSTsDB_HOSED_CONNECTIONssetup_user_roless dbConnection(sstrings dbConnectionscfgsDB_HOSED_CONNECTIONsutilssetup_user_rolessMySQLdbs __version__((sF/mnt/gmirror/ports/www/zope-mysqluserfolder/work/mysqlUserFolder/db.pys?s