Xׯdj ddlmZddlZddlmZddlmZddlmZeddd Z d Z d Z iZ d Z d ZdZdfdZe ejejdZe ejejjdZe ejejjejdZe ejejjdZe ejejjdZe ejdZe ejjejjdZe ejejjdZ e ejejjejdZ!e ejejjejejdZ"e ejejjejejdZ#e ejejjejejdZ$e ejejjejejdZ%e ejejjejejdZ&e ejj'ejjejejejfej(dZ)e ejejjejj*d Z+e ejejjejj,d!Z-e ejejjejj.d"Z/e ejejjejj.d#Z0e ejejjejj.d$Z1e ejejjejj.d%Z2e ejejjejj,d&Z3e ejejjejj,d'Z4e ejejjejj,d(Z5e ejejjejj,d)Z6e ejj7d*Z8e ejejfd+Z9e ejejfd,Z:e ejejjd-Z;dS).) DefineModuleN) db_driver)NotConnectedError)find_object_with_name DbSybaseREz Oracle Corp.z1.0)nameauthorversioncRtjrtjdS)zChecks if the user is requesting to cancel an operation in progress. Call this from time to time so that the actual cancel requests can be handled N)grt query_status UserInterrupt..\modules\db_sybase_re_grt.pycheck_interruptionr#s.  "!!!""rcdd}tjjjjD]}|jdkr|}n|SNSybase)r rootwb rdbmsMgmtrdbmsr)sybase_rdbms_instancers rget_sybase_rdbms_instancer,sF &, : ! !$) ! E " ! rc||jtvrt|jdStd|jz)N connectionzNo open connection to %s)__id__ _connectionsrhostIdentifier)connection_objects rget_connectionr"8s<<//-45lCC :=N=] ]^^^rc tjdd|d|d|dt|j|g|Ri|S)zRetrieves a connection and executes the given query returning a cursor to iterate over results. The remaining positional and keyword arguments are passed with the query to the execute function db.sybasezexecute   )r log_debug3r"cursorexecute)r!queryargskwargss r execute_queryr-?sc N;;tttVVV LMMM =>+ , , 3 3 5 5 =e Ud U U Uf U UUrcfd}|S)z(Decorator). Needed because a Sybase issue with DDL statements inside transactions. More info here: http://manuals.sybase.com/onlinebooks/group-as/asg1250e/sqlug/@Generic__BookTextView/53037 cd}|D]%}t|tjjr|}n&|stjddSt |} |dd}n#t$rd}YnwxYw|d|d|d|dkr|d |~|i|}t |}|d|d |d|dkr|d ||S) Nr$zBCannot find a connection object to apply the allow-ddl-in-tran fixzSELECT db_name()rmasterz USE masterz&sp_dboption tempdb,"ddl in tran", truezCHECKPOINT tempdbzUSE ?z'sp_dboption tempdb,"ddl in tran", false) isinstancer classesdb_mgmt_Connection log_errorr"r(r)fetchone Exception)r+r,connargr( current_dbresfuncs rwrapper_functionz+allow_ddl_in_tran..wrapper_functionNs  C# >??    M+'k l l lK%%,,.. "(:;;DDFFqIJJ " " "!JJJ "|$$$?@@@*+++  ! ! NN7J / / / dD#F##%%,,..|$$$@AAA*+++  ! ! NN7J / / / s'-B B$#B$r)r;r<s` rallow_ddl_in_tranr=Is$ > rcdSNr)_s rrAosPTrc#Kd}d}g}tdt|jD}|D]m}||||||} } |r| |kr2|||r||d|fV| }| g}|dz }X|| n|r||d|fVdSdS)aGenerator to join definition columns that are split across several rows In Sybase, object definitions in syscomments can be split into several rows. For example, a stored procedure can have several row entries in syscomments each having the same object name and containing the chunks of the procedure's code in the "text" column. The order of the rows is determined by the "colid" value (a sequence of integers: 1, 2, 3, etc.). Arguments: name_column -- string with the name of the column that has the object name split_column -- string with the name of the column that has the fragments cursor -- the resultset to iterate through callback -- an optional callable that will be called with the row corresponding to the first row of each distinct object Returns: idx, name, definition where idx tracks the count of different objects as they are found, name is the name of the current object and definition is the joint definition for the object. Note: This functions assumes that the rows are ordered properly, i.e. sorted by name, colid. rNc30K|]\}}|d|fVdS)rNr).0poscol_descriptions r z)join_multiline_content..s1nn7KsO/!,c2nnnnnnr)dict enumerate descriptionjoinappend) name_column split_columnr(callbackidxcurrent_objectcurrent_object_chunks column_indexrow object_nameobject_definitions rjoin_multiline_contentrYos#( CNnnyY_YkOlOlnnnnnL 8 8),\+-F)G\ZfMgIh&  !>!> HSMMM J>2773H+I+IIIII(N%6$7 ! 1HC $$%67777B>277+@#A#AAAAAAABBrc d|zS)Nz[%s]rrs rquoteIdentifierr\s D=rc|j}|rt|tjjru|jrmt|jtjjrIt |jjdzt |jzdzt |jzSnM|rKt|tjjr,t |jdzt |jzSt |jS)N.)ownerr1r r2 db_Schema db_Catalogr\r)objr_s rfullyQualifiedObjectNamercs IE IE3;#899I ; s:ek3;3IJJ s"5;#344S89T9TTUXXYhiliqYrYrr r I:eS[%;<<Iuz**3.sx/H/HHH 38 $ $$rcd}|j} t|} |dst dn=#t$r0}t jd|jztdd}~wwxYwnT#t$rF}t jd|zddl} tj ||}d|_ nl#|j $r_}t|jd kr=|jdd vr.d |jd vrt j|jd Yd}~nd}~wwxYw|s#t jd t#|d|it$|j<t)|t$|jd<t+|dd}t jd||fYd}~nd}~wwxYwd S)aEstablishes a connection to the server and stores the connection object in the connections pool. It first looks for a connection with the given connection parameters in the connections pool to reuse existent connections. If such connection is found it queries the server to ensure that the connection is alive and reestablishes it if is dead. If no suitable connection is found in the connections pool, a new one is created and stored in the pool. Parameters: =========== connection: an object of the class db_mgmt_Connection storing the parameters for the connection. password: a string with the password to use for the connection. NzSELECT 1zconnection errorz1Connection to %s apparently lost, reconnecting...zConnection errorzConnecting to %s...rT)2800042000z(18456)rIzConnection failedrr SELECT @@versionzConnected to %s, %s)r r"r(r)r6r send_inforpyodbcrconnect autocommitErrorlenr+ DBLoginError send_errorstrrrgetServerVersionr-r5)rpasswordconhost_identifierexcrjodbc_errr s rrkrks- C /O)IZ(( 8::<<'' 33 4 2333 4 8 8 8 MMPZPii j j j#$677 7 8 4 !I!I!I +o=>>>  9#J99C!CNN| 9 9 98=!!Q&&8=+;?Q+Q+QV_ckcpqrcsVsVs&x}Q'7888  9   N.C 9 9 9 +7#*? Z&'5Ej5Q5Q Z&' 2 -?@@IIKKAN +ow-GHHHHHHHHC!ID 1sfB6AB B +BB  B G"G8CG D>AD94G9D>>BGG"c<|jtvr t|j=dS)Nrrrrs r disconnectr{s L(( * + 1rc&|jtvrdndSNrIrryrzs r isConnectedr~s!\1111q8rcdSrrrrrgetTargetDBMSNamers 8rctj}t|dd} |ddd}n#t $rd}YnwxYwd|dDd dgzz}|d d \|_|_|_ |_ |S) zNReturns a GrtVersion instance containing information about the server version.rhr/rerI15c,g|]}t|Sr)int)rDparts r z$getServerVersion..s???#d))???rr^N) r r2 GrtVersionr-r5split IndexError majorNumber minorNumber releaseNumber buildNumber)rr ver_string ver_partss rrrrrsk$$&&Gz+=>>GGII!LJ%%c1--a0  ?? (8(8(=(=???!aE'II[degfgeg[hXG,g.CWEX NsA%% A43A4c:d}dt||DS)zlReturns a list of the available catalogs. [NOTE] A catalog is equivalent to a databases in Sybase. zexec sp_databasescg|] }|d SrrrDrVs rrz#getCatalogNames..s A A ASV A A Ar)r-)rr*s rgetCatalogNamesrs' E A A}Z?? A A AArc t|dt|zttdt|dDS)z;Returns a list of schemata for the given connection object.USE %sc3&K|] }|dV dS)rINrrs rrGz!getSchemaNames..s&OOc!fOOOOOOr sp_tables)r-r\sortedset)r catalog_names rgetSchemaNamesrsP*h)F)FFGGG #OO j+(N(NOOOOO P PPrc|t|dt|zfdt|dDS)Nrc8g|]}|dk|dSrIrerrDrV schema_names rrz!getTableNames..s/ x x xsbefgbhlwbwbwCFbwbwbwrzsp_tables @table_type="'TABLE'"r-r\rrrs `r getTableNamesrsE*h)F)FFGGG x x x xmJ8]^^ x x xxrc|t|dt|zfdt|dDS)Nrc8g|]}|dk|dSrrrs rrz getViewNames..#s/ w w wsadefagkvavavCFavavavrzsp_tables @table_type="'VIEW'"rrs `r getViewNamesr sE*h)F)FFGGG w w w wmJ8\]] w w wwrc|t|dt|zd}dt|||DS)Nrz@SELECT name FROM sysobjects WHERE type='TR' AND uid = user_id(?)cg|] }|d Srrrs rrz#getTriggerNames..+ N N NSV N N Nrrrrrr*s rgetTriggerNamesr%sI*h)F)FFGGG (E O N}Z LL N N NNrc|t|dt|zd}dt|||DS)Nrz?SELECT name FROM sysobjects WHERE type='P' AND uid = user_id(?)cg|] }|d Srrrs rrz%getProcedureNames..4rrrrs rgetProcedureNamesr.sI*h)F)FFGGG 'E O N}Z LL N N NNrcgSr?rrs rgetFunctionNamesr7s Irc tjddtj}||_|j|j|jj jd|_ tjddtt||tjddii}i}i}i}| dd } | d d } | d d } | d d } d } d}d}|D]<}t| rtt|||nd|<| rtt!|||nd||<t| r=tt#|||tt%|||znd||<| rtt'|||nd||<|||z||z||zd z||<| ||z } tj|d|t|d zz zzd|z|dz }>d}tjtj||dzd}|D]}| |d| z }tj|||zd}tj}||_ ||_|j |_ |j||||d zz }| rttjd||fztj|||zt4|jdt;}|d|zt?||tj ||z }tj|d|z||||d zz }| rhttjd|||fztj|||ztC||tj ||z }tj|d|z||||d zz }| rttjd|||fztj|||dz z|j"tG||tj ttj||dz z||ztI||tj ||z }tj|d|z||||d zz }| rhttjd|||fztj|||ztK||tj ||z }tj|d|z||z }tj tj d}| rtMfd|jD}|jD]}td|j|d zz z}tjd |jztj|||zt?||tj ||z }tj|d!|ztjdd"|S)#aReverse engineers a Sybase ASE database. This is the function that will be called by the Migration Wizard to reverse engineer a Sybase database. All the other reverseEngineer* functions are not actually required and should not be considered part of this module API even though they are currently being exposed. This function calls the other reverseEngineer* functions to complete the full reverse engineer process. rz'Reverse engineering catalog informationrHg?z&Reverse engineering User Data Types...g?z Preparing...reverseEngineerTablesTreverseEngineerTriggersreverseEngineerViewsreverseEngineerRoutines绽|=?zGathered stats for %sg?g333333?z%Reverse engineering %i tables from %s_rev_eng_progress_flags%s_tables_first_passz@First pass of table reverse engineering for schema %s completed!z$Reverse engineering %i views from %sz5Reverse engineering of views for schema %s completed!z'Reverse engineering %i routines from %srez8Reverse engineering of routines for schema %s completed!z'Reverse engineering %i triggers from %sz8Reverse engineering of triggers for schema %s completed!g?c32K|]}|jVdSr?r[)rDschematable_count_per_schemas rrGz"reverseEngineer..s+^^61&+>^^^^^^rz8Reverse engineering foreign keys for tables in schema %szASecond pass of table reverse engineering for schema %s completed!zReverse engineering completed!)'r send_progressr2db_sybase_CatalogrsimpleDatatypes remove_allextenddriverr_defaultCollationNamerreverseEngineerUserDatatypesgetrnrrrrrreset_progress_stepsbegin_progress_stepdb_sybase_SchemaschematarNrirr setdefaultrdiscardrend_progress_steprroutinesreverseEngineerProceduresreverseEngineerFunctionsrsum)rr schemata_listoptionscatalogview_count_per_schemaroutine_count_per_schematrigger_count_per_schematotal_count_per_schema get_tables get_triggers get_views get_routinestotaliaccumulated_progressraccumulated_schema_progressschema_progress_sharethis_schema_progressrstep_progress_shareprogress_flags total_tablesrs @rreverseEngineerr>saBCCCk++--GGL &&((( "":#4#:#JKKK#%G dDEEE W555c>***!!4d;;J;;8$??L 2D99I;;8$??L E A$   ku.|c- LZe2f2f.g.g.g{|{+ir-ySj,Xc1d1d-e-e-exyk*q}1D4EjR^`k4l4l0m0mpsuEFPR^`kululqmqm1m1mCD -o{1COJP\^i4j4j0k0k0kBC -/Ek/RUjkvUw/w/G /T0UWop{W|0}@E0E{+ ' 44 .S=O=ORW=W8X1ZZ\swB]B C C C S02F2LMMM"%$F F 6 : :; L Lu T  ;=X[p=pqqq"--// ! &-&B#'''5[AE[\gEhkpEpq  $  MAE[\gEhjuDvv w w w  #$8:NQd:d e e e)**;<GGHacfchchiiN  " "#9K#G H H H !*f 5 5 5  ! # # # 33 .0rvA1A B B B4K@DZ[fDgjoDop  $  M@DYZeDfhsCtt u u u  #$8:NQd:d e e e V 4 4 4  ! # # # 33 .0gju0uvvv7{CG]^iGjmrGrs  $  MCG_`kGlnyFzz { { {  #$8:NQdefQf:f g g g O & & ( ( ( %j& 9 9 9  ! # # #   #$8;Nq;P$PRfi|R| } } } $Z 8 8 8  ! # # # 33 .0jmx0xyyy7{CG]^iGjmrGrs  $  MCG_`kGlnyFzz { { {  #$8:NQd:d e e e #J 7 7 7  ! # # # 33 .0jmx0xyyy#'<<#  G^^^^WM]^^^^^ & G GF  "%)? )LP\_dPd)e"f  MTW]Wbb c c c  #$8:NQd:d e e e !*f 5 5 5  ! # # # $7 7  24w{F5F G G G Gc;<<< Nrc Ptd}d}t|dt|jzt }|jt||D]\}}}}} } tj } | | _|| _ || _ || _ | | _t|j|| } | r| | _ntjdd| d|d|j| dS) N),)"IMAGE)#TEXT)$z EXTENDED TYPE)% TIMESTAMP)&INTN)'VARCHAR)-BINARY)/CHAR)0TINYINT)1DATE)2BIT)3TIME)4SMALLINT)7DECIMAL)8INT): SMALLDATETIME);REAL)<MONEY)=DATETIME)>FLOAT)?NUMERIC)A USMALLINT)BUINT)CUBIGINT)DUINTN)jDECIMALN)lNUMERICN)mFLOATN)nMONEYN)oDATETIMN)z SMALLMONEY){DATEN)UNICHAR)TIMEN) UNIVARCHAR) TEXT_LOCATOR) IMAGE_LOCATOR)UNITEXT_LOCATOR)UNITEXT) BIGDATETIMEN)BIGTIMEN) BIGDATETIME)BIGTIME)BIGINTzYSELECT name, length, prec, scale, allownulls, type FROM systypes WHERE accessrule != NULLrz#Sybase reverseEngineerUserDatatypeszCould not found base type "z" for user defined type ""r)rJr-r\rr userDatatypesrr r2db_sybase_UserDatatypeuppercharacterMaximumLengthnumericPrecision numericScale isNullablerr actualType send_warningrN) rr base_typesr*rrlength precisionscale is_nullable base_typedatatype simple_types rrrsf- - - J^ E*h)F)FFGGG577 $$&&&BOPZ\aBbBb / />fi Y;5577  *0'$-! %)+,A,QS]^gShii  V"-H    BBDMDMDMOSOSOSET V V V$$X.... 1rc t|jdt}d|jz|v}|rL|j}t |dt|jz|j dt||j|jD}t|dz}d}|D]\}} tj ||z d|jd|d tj} || _|j| || _| pd | _t%|| t'|| t)|| |d z }|d|jznad }t|jdz}|jD]@} t-|| tj ||z d |jd| jd |d z }AdS)Nrrrcg|]}|dfS)rHr)rD table_names rrz)reverseEngineerTables..+spppJ B'ppprrrzRetrieving table r^z...rHrz-Reverse engineering of foreign keys in table z completedr)rrrrrr_r-r\tablesrrrnr rr2db_sybase_TablerNcommentreverseEngineerTableColumnsreverseEngineerTablePKreverseEngineerTableIndicesaddreverseEngineerTableFKs) rrr is_first_passr table_namesrrrV table_commenttables rrrs*"*"34??@Y[^[`[`aaN/&+=.PM,j(_W\-J-J"JKKK   """pp- T[T`bhbm:n:nppp K  5( )4   %J  a%ii U_U_U_)` a a aK//11E#EJ M  ' ' ' EK)/REM ' E : : : ":u 5 5 5 ' E : : : HAA1FK?@@@@ FM""U*]  E #J 6 6 6  a%iikqkvkvkvx}yCyCyC*D E E E HAA 1rc |j}|j}t|dt|jzd}t|||j|j}t }d|jD}d|jD}d|jD} |D]B} tdt| | D} tj } | dpd| _| d  | _ | d d| _| d pd | _| d | d nd| _| d| dnd| _| dd| _| dpd | _d} || d}n#t.$r |j|| d} d}| | _n#t.t2f$rld} |d}d| _d| dd| jd|jd|jd }tjd|YnwxYwYnwxYw||j|| _| d}|$|dr|dd| _|| Dd S)Nra'SELECT ISNULL(C.name, '') AS COLUMN_NAME, T.name AS DATA_TYPE, C.length AS CHARACTER_MAXIMUM_LENGTH, C.prec AS NUMERIC_PRECISION, C.scale AS NUMERIC_SCALE, CONVERT(BIT, (C.status & 0x08)) AS IS_NULLABLE, CONVERT(BIT, (C.status & 0x80)) AS IS_IDENTITY_COLUMN, K.text AS COLUMN_DEFAULT FROM syscolumns C, systypes T, sysobjects A, syscomments K WHERE USER_NAME(A.uid) = ? AND A.id = C.id AND C.id = OBJECT_ID(?) AND C.usertype *= T.usertype AND C.cdefault *= K.id ORDER BY C.colidcg|] }|j Srr[rDrRs rrz/reverseEngineerTableColumns..Zs#j#j#jxX]#j#j#jrcg|] }|j Srr[res rrz/reverseEngineerTableColumns..[sQQQhHMQQQrcg|] }|d Srr)rDrFs rrz/reverseEngineerTableColumns..]sNNN/!$NNNrc3K|]}|VdSr?r)rDnamevals rrGz.reverseEngineerTableColumns.._s"GGw7GGGGGGr COLUMN_NAMErH IS_NULLABLECOLLATION_NAMECHARACTER_MAXIMUM_LENGTHrNUMERIC_PRECISION NUMERIC_SCALECOLUMN_COMMENTIS_IDENTITY_COLUMN DATA_TYPErzColumn datatype "z" for column " " in table "r^z$" reverse engineered as VARCHAR(255)z"Sybase reverseEngineerTableColumnsCOLUMN_DEFAULTzDEFAULT )r_r-r\rrrrCrLrJzipr r2db_sybase_Column isNotNullr collationNamerMrNrOrYidentityindexrE ValueErroruserType TypeErrorrK simpleType startswith defaultValue addColumn)rrbrrr*rowsrsybase_simple_datatypes_listuser_datatypes_list col_namesrV row_valuescolumn user_datatyperRmsg default_values rrZrZGs [FlG*h)F)FFGGG E UFK D DD577#j#jCXCh#j#j#j QQ':OQQQNNDCC"#=>C! >HI\>]>i:&9::oq6@6Q6]z/22ce #(8"==$%9:?a  0399:k;R;X;X;Z;Z\\HH 0 0 0 0 ' 56I6O6OQ[\gQhQnQnQpQp6r6r s  "/ * L L L $ 7==iHH # t~@KuLuRuRuTuTuTuTV\VaVaVacicncncnpupzpzpz{ !EsKKKKK  L 0   5 Eh OF "#34  $)A)A*)M)M $"/"3F   1s7?-F-- I=88G:0 I=:A:I74I=6I77I=<I=c|j}|j}t|d|jzd}t|jdkr(t jdd|jd|jddSd t|||j|jD}|D].}t|j|}|r||/dS) z6Reverse engineers the primary key for the given table.rzSELECT sc.name FROM sysobjects so JOIN syskeys sk ON so.id=sk.id JOIN syscolumns sc ON sc.id=sk.id AND sc.colid IN (sk.key1, sk.key2, sk.key3, sk.key4, sk.key5, sk.key6, sk.key7, sk.key8) WHERE so.uid=USER_ID(?) AND sk.id=OBJECT_ID(?) AND sk.type=1rzSybase reverseEngineerTablePKzReverse engineer of table's r^zA primary key was attempted but the table has no columns attributerIcg|] }|d Srrrs rrz*reverseEngineerTablePK..sbbbSVbbbr) r_r-rrncolumnsr rpraddPrimaryKeyColumn)rrbrrr* pk_col_names pk_columnrs rr[r[s[FlG*h5666 @E  5=Q 66agalalalnsnxnxnx9y { { {qbb}Z UZU_'`'`bbbL!.. &u}i@@  .  % %f - - - 1rc"|j}|j}t|jdkr(tjdd|jd|jddSt |d|jzd}t |||j|jD]}tj}|d|_|d|_ |d |_ |d |_ |j rd nd |_ |d |_ ||d|ddD}|D]j}t|j|} | rQtj} |jdz|z| _| | _|j| k dS)z2Reverse engineers the indices for the given table.rz"Sybase reverseEngineerTableIndiceszReverse engineer of table r^5 was attempted but the table has no columns attributerIra; SELECT INDEX_NAME = A.name, IS_CLUSTERED = CASE WHEN ((A.status&16) = 16 OR (A.status2&512) = 512) THEN 1 ELSE 0 END, IS_PRIMARY = CASE WHEN ((A.status&0x800) = 0x800) THEN 1 ELSE 0 END, IS_UNIQUE = CASE WHEN ((A.status&2) = 2) THEN 1 ELSE 0 END, IGNORE_DUP = CASE WHEN ((A.status&4) = 4) THEN 1 ELSE 0 END, INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 1), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 2), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 3), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 4), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 5), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 6), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 7), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 8), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 9), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 10), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 11), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 12), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 13), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 14), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 15), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 16), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 17), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 18), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 19), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 20), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 21), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 22), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 23), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 24), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 25), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 26), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 27), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 28), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 29), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 30), INDEX_COL(USER_NAME(B.uid) + '.' + B.name, indid, 31) FROM sysindexes A, sysobjects B WHERE A.indid > 0 AND A.indid < 255 AND A.status2 & 2 != 2 AND B.id = A.id AND B.type = 'U' AND USER_NAME(B.uid) = ? AND B.name=? ORDER BY 1, 2, 3reUNIQUEINDEXrcg|]}||Sr?r)rDcolnames rrz/reverseEngineerTableIndices..sZZZ'gFYgFYFYFYrN)r_rnrr rprr-r2db_sybase_Index clustered isPrimaryunique indexTypeignoreDuplicateRowsaddIndexrdb_sybase_IndexColumnreferencedColumnrN) rrbrrr* index_rowr}index_column_names column_namer index_columns rr\r\s[FlG 5=Q ;;X^XcXcXcejeoeoeo>p r r rq*h56663 6Ej#:ufk5:NN33  ++--q\ #A,#A, | &+l?(($-aL! u[ZYqrr]ZZZ- 3 3K*5=+FFF 3"{@@BB $)J$4{$B !06 - $$\222  3 1rc |j}|j}t|d|jzd|jd|jd}t|jdkr(t jdd|jd|jdd S|jt||D]}d |d d D}d |d dD}t j }|jd|jdd |d|_||_dx|_ |_ d|_t|j|d } | s)t jdd|jd|jdd St| j|d|_|js*t jdd|dd|jdd St'||D]\} } t|j| } | s-t jdd| d|jd|jdd St|jj| } | s2t jdd| d| jd|jjdd S|j| |j| |j|!dS)z7Reverse engineers the foreign keys for the given table.ra"SELECT so.name, USER_NAME(so.uid), COL_NAME(sk.id, key1), COL_NAME(sk.id, key2), COL_NAME(sk.id, key3), COL_NAME(sk.id, key4), COL_NAME(sk.id, key5), COL_NAME(sk.id, key6), COL_NAME(sk.id, key7), COL_NAME(sk.id, key8), COL_NAME(sk.depid, depkey1), COL_NAME(sk.depid, depkey2), COL_NAME(sk.depid, depkey3), COL_NAME(sk.depid, depkey4), COL_NAME(sk.depid, depkey5), COL_NAME(sk.depid, depkey6), COL_NAME(sk.depid, depkey7), COL_NAME(sk.depid, depkey8) FROM syskeys sk JOIN sysobjects so ON sk.depid = so.id WHERE sk.type = 2 AND sk.id = OBJECT_ID('r^z')rzSybase reverseEngineerTableFKsz+Reverse engineer of foreign keys for table rrIcg|]}||SrrrDcol_names rrz+reverseEngineerTableFKs..sEEE8HEhEEErre cg|]}||Srrrs rrz+reverseEngineerTableFKs..sHHHxxH(HHHrNr@_fkRESTRICTzCould not find schema "z" in catalog "rBz!Could not find referenced table "z " in schema "zCould not find column "ru)r_r-rrnrr rp foreignKeysrr2db_sybase_ForeignKeyrM deleteRule updateRule modelOnlyrrrWreferencedTablerxrNreferencedColumns)rrbrrr*rV fk_columnsfk_ref_columns foreign_keyreferenced_schemarreferenced_column_namerreferenced_columns rr^r^sx[FlG*h56666(8>{{{EJJJ% PE( 5=Q 77ekepepeprwr|r|r|:}   q   """Z//".".EEs1R4yEEE HH3rss8HHHk6688 ,2KKKSXXjEYEYEYEYZ ! :DD !7 ! 1'2BCFKK   N;;"KKK>7 9 9 911&;1 3 3 31136z>3R3R D D /K/*5=+FFF ?? + V[[[%***BFHHHqqq 5k6Q6Y[q r r $ ?? 6 6 68I8N8N8NP[PkPpPpPpBrtttqqq   & &v . . .  ) 0 01B C C C C   ---- 1rc t|d|jjzd}|jdt t ||jj|jdzz }t|||j}|rtdd|D]x\}}}tj ||zd|jd|tj }||_|pd |_||_ |j |yd S) NrzSELECT so.name AS view_name, sc.text AS view_definition FROM sysobjects so JOIN syscomments sc on so.id=sc.id WHERE so.uid=USER_ID(?) AND so.type='V' ORDER BY so.name, sc.colidrr view_nameview_definitionzReverse engineering view r^rHr)r-r_rviewsrrnrrYr rr2db_sybase_View sqlDefinitionrN) rrr*stepr(rRrrviews rrrAs*h)::;;; E  L #l:v|/@&+NNOORWW XD :ufk : :F &/EkSdfl/m/m & & +CO  cDjjfkkk[d[d*e f f f;--//DDJ!RDI!0D  L   % % % % 1rc6t|d|jjzd}dtt ||jj|jdzz }t|||j}|rt dd|D]\}}}t j||zd|jd|t j }||_|pd |_d |_ ||_ |j |t jdd |jzd S) NrzSELECT so.name AS procedure_name, sc.text as procedure_definition FROM sysobjects so INNER JOIN syscomments sc ON so.id=sc.id WHERE so.uid = USER_ID(?) AND so.type = 'P' ORDER BY so.name, sc.colidrrprocedure_nameprocedure_definitionzReverse engineering procedure r^rH PROCEDUREz=Finished reverse engineering of procedures for the %s schema.r)r-r_rrnrrYr rr2db_sybase_Routine routineTyperrrN) rrr*rr(rRrr procedures rrrXs9*h)::;;; E #' FL4Ev{SSTTW\\ ]D :ufk : :F .9OP`bx{A:B:B . . 5C!5  cDjjSYS^S^S^`n`n*o p p p 5577I$IO+1rIN$/I !&:I # O " "9 - - - -cZ]c]hhiii 1rc@tjdd|jzdS)Nrz.s*NtNt`gsSZ||NtNtNtNtNtNtrc*|d|d<dSr}r)rVtrigger_name2ids rregister_trigger_namez6reverseEngineerTriggers..register_trigger_names"%a&Ar trigger_nametrigger_definitionzReverse engineering trigger r^AFTER;zSybase reverseEngineerTriggersz'Parent table not found for trigger "%s"z;Finished reverse engineering of triggers for the %s schema.)r-r_rrrnrrMrYr rr2db_sybase_TriggerrtimingenabledstripeventrrWtriggersrNrK)rrtables_with_triggers_querytrigger_details_queryrrVr all_triggersrrRrrtrigger trigger_tabletrigger_eventsrs @rrrws*h)::;;;"5  HZ)CV[QQFF q6Q;;   AQ 5 5a 8 8 8I E 8 8 8 q6Q;;   AQ 5 5a 8 8 8I E 8 8 8 q6Q;;   AQ 5 5a 8 8 8I E 8 8 8 #oj&,2CV[QQRRUZZ [DzBL=-BTYYNtNtksNtNtNtEtEt-tuuuHLLO)))))}5KN\pLXZo6q6q } } 1C1  cDjjQWQ\Q\Q\^j^j*k l l lk3355G'-2GL$6G !$GNGO,4_\5R,S )M>*0055GM1&-OOGM} } &--g6666 !AClovo{C{||||cX[a[ffggg 1rctjtjdz}tjjjj||S)Nz/sybase_rdbms_info.xml) r unserialize ModuleInfomoduleDataDirectoryrrrrrN)rs rinitializeDBMSInfors= OJ:=UU V VEHK&&u--- Lrc tjtj}ddl}|}t |D]#\}}||d|d|d$|S)Nr|z ())r ListSTRINGrj dataSourceslistitemsrN)resultrjsourceskeyvalues rgetDataSourceNamesrs} Xcj ! !FMMM  ""G7==??++88 U ccc33367777 Mrcltjtj}|d|S)Nz.4.1|Sybase Adaptive Server Enterprise 15 (4.1))r rrrN)rs rgetTDSProtocolVersionChoicesrs+ Xcj ! !F MMBCCC Mrc0gt|jd<dS)Nrr)rrrzs rresetProgressFlagsrsACL"#$=> 1r)rs|, 222222111111\ ne T T T """!!! ___VVV$$$LHU}%B%B%B%BR 3:sz**+* 3:s{9::%%;:% 37CK:CJGG: : HG: z 37CK:;;  <;  37CK:;;99<;9  3: 3;)3;+IJJ  KJ  38S[;<<BB=<B 38S[;SZHHQQIHQ 38S[;SZTTyyUTy  38S[;SZTTxxUTx 38S[;SZTTOOUTO 38S[;SZTTOOUTO 38S[;SZTTUT  3;)3;+I3:X[X`beblWmorowxxTTyxTn 37CK:CK