@Qc@sddlmZddlZddlmZddlmZeddddd d Zd Zd Z iZ d Z dZ dZ dZejejejdZejejejjdZejejejjejdZejejejjdZejejejjdZejejdZejejjejjdZejejejjdZejejejjejdZejejejjejejdZ ejejejjejejdZ!ejejejjejejdZ"ejejejjejejdZ#ejejejjejejdZ$ejejj%ejjejejejfej&dZ'ejejejjejj(d Z)ejejj(ejjejd!Z*ejejejjejj+d"Z,ejejejjejj-d#Z.ejejejjejj-d$Z/ejejejjejj-d%Z0ejejejjejj-d&Z1ejejejjejj+d'Z2ejejj3ejjejj+ejd(Z4ejejejjejj+d)Z5ejejejjejj+d*Z6ejejejjejj+d+Z7ejejj8d,Z9ejejejfd-Z:ejejejfd.Z;dS(/i(t DefineModuleN(t db_driver(tNotConnectedErrortnamet DbMssqlREtauthors Oracle Corp.tversions1.0cCstjrtjndS(N(tgrtt query_statust UserInterrupt(((s..\modules\db_mssql_grt.pytcheck_interruptions cCs@d}x3tjjjjD]}|jdkr|}PqqW|S(NtMssql(tNoneRtroottwbt rdbmsMgmttrdbmsR(tmssql_rdbms_instanceR((s..\modules\db_mssql_grt.pytget_mssql_rdbms_instance"s cCs5|jtkrt|jdStd|jdS(Nt connectionsNo open connection to %s(t__id__t _connectionsRthostIdentifier(tconnection_object((s..\modules\db_mssql_grt.pytget_connection,scCs5|jtkrt|jdStd|jdS(NRsNo open connection to %s(RRRR(R((s..\modules\db_mssql_grt.pytconnected_server_version2scOs<tjdd|||ft|jj|||S(sRetrieves 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 sdb.mssqlsexecute %s %s %s (Rt log_debug3Rtcursortexecute(Rtquerytargstkwargs((s..\modules\db_mssql_grt.pyt execute_query8scCs(x!|D]}|j|kr|SqWdS(sFinds an object with the given name within a collection of GRT objects (such as grt.List). Returns the found object or None if there was no object with the given name in the collection. N(RR (Rt collectiontobj((s..\modules\db_mssql_grt.pytfind_grt_objectAs cCsd|S(Ns[%s]((R((s..\modules\db_mssql_grt.pytquoteIdentifierMscCs|j}|rzt|tjjrz|jrt|jtjjrt|jjdt|jdt|jSn9|rt|tjjrt|jdt|jSt|jS(Nt.(townert isinstanceRtclassest db_Schemat db_CatalogR$R(R"R&((s..\modules\db_mssql_grt.pytfullyQualifiedObjectNameQs !5c Cs<d}ynt|}y(|jjds<tdnWn3tk rr}tjd|jtdnXWntk r7}tjd|jddl }yt j ||}|j j dkrl|j}|jd jd }t|jd d d }|d krC|jdd|jd dql|jdd|jd dnWnj|jk r}t|jdkr|jd dkrd|jd krtj|jd qnX|stjdt|ntjdi|d6t|jscSs|dkr|S|jdS(Nsutf-16(R R-(R.((s..\modules\db_mssql_grt.pyR/scSs|dkr|St|S(N(R tstr(R.((s..\modules\db_mssql_grt.pyR/scSs|dkr|St|S(N(R R0(R.((s..\modules\db_mssql_grt.pyR/sit28000t42000s(18456)sConnection failedt ConnectedRR(R1R2(R RRRt ExceptionRt send_infoRRR,RtconnecttdrivertdriverLibraryNametfetchonetinttsplittadd_output_convertertErrortlenRt DBLoginErrort send_errorR0RRtgetServerVersion( RtpasswordtcontexcR,RRt majorVersiontodbc_err((s..\modules\db_mssql_grt.pyR6^sB    ; cCs |jtkrt|j=ndS(Ni(RR(R((s..\modules\db_mssql_grt.pyt disconnects cCs|jtkrdSdS(Nii(RR(R((s..\modules\db_mssql_grt.pyt isConnectedscCsdS(NR ((((s..\modules\db_mssql_grt.pytgetTargetDBMSNamescCstjj}t|djd}g|jdD]}t|^q8ddg}|d \|_|_|_ |_ |S(sNReturns a GrtVersion instance containing information about the server version.s8SELECT CAST(SERVERPROPERTY('ProductVersion') AS VARCHAR)iR%i( RR(t GrtVersionR R9R;R:t majorNumbert minorNumbert releaseNumbert buildNumber(RRt ver_stringtpartt ver_parts((s..\modules\db_mssql_grt.pyRAs 3"cCs*d}gt||D]}|d^qS(s}Returns a list of the available catalogs. [NOTE] From MSDN: [A catalog] is equivalent to a databases in SQL Server. sexec sp_databasesi(R (RRtrow((s..\modules\db_mssql_grt.pytgetCatalogNamesscCsvt|dt|d|}d|}t|}|jdkrL|n|}gt||D]}|d^qbS(s;Returns a list of schemata for the given connection object.sUSE %ss5SELECT TABLE_SCHEMA AS SCHEMANAME, max(TABLE_CATALOG) AS CATALOGNAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_CATALOG = '%s' GROUP BY TABLE_SCHEMA UNION SELECT ROUTINE_SCHEMA AS SCHEMANAME, max(ROUTINE_CATALOG) AS CATALOGNAME FROM INFORMATION_SCHEMA.ROUTINES GROUP BY ROUTINE_SCHEMA;sSELECT TABLE_SCHEMA AS SCHEMANAME, max(TABLE_CATALOG) AS CATALOGNAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_CATALOG = '%s' GROUP BY TABLE_SCHEMA;ii(R R$RRK(Rt catalog_namet query_post70t query_pre70t serverVersionRRR((s..\modules\db_mssql_grt.pytgetSchemaNamess    cCsvt|dt|d|}d|}t|}|jdkrL|n|}gt||D]}|d^qbS(NsUSE %ss=SELECT name FROM sys.tables WHERE schema_id = SCHEMA_ID('%s')sdSELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' AND TABLE_SCHEMA='%s'i i(R R$RRK(RRTt schema_namet query_post_90t query_pre_90RWRt table_name((s..\modules\db_mssql_grt.pyt getTableNamess    cCst|dt|d|}d||f}t|}|jdkrPgS|jdkre|n|}gt||D]}|d^q{S(NsUSE %ss?SELECT name FROM sys.views WHERE SCHEMA_NAME(schema_id) = '%s';s^SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_CATALOG='%s' AND TABLE_SCHEMA='%s'ii i(R R$RRK(RRTRYRZR[RWRt views_info((s..\modules\db_mssql_grt.pyt getViewNamess  cCst|dt|d}d}t|}|jdkrBgS|jdkrW|n|}gt|||D]}|d^qqS(NsUSE %ssHSELECT name FROM sys.triggers WHERE OBJECT_SCHEMA_NAME(object_id) = '%s'sSELECT OBJECT_NAME(id) FROM sysobjects WHERE OBJECTPROPERTY(id, 'IsTrigger') = 1 AND uid = SCHEMA_ID('%s') GROUP BY OBJECT_NAME(id)ii i(R R$RRK(RRTRYRZR[RWRt trigger_info((s..\modules\db_mssql_grt.pytgetTriggerNamess cCst|dt|d}d}t|}|jdkrBgS|jdkrW|n|}gt|||D]}|d^qqS(NsUSE %ssASELECT name FROM sys.procedures WHERE schema_id = SCHEMA_ID('%s')ssSELECT ROUTINE_NAME as name FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_SCHEMA='%s' AND ROUTINE_TYPE='PROCEDURE'ii i(R R$RRK(RRTRYRZR[RWRt proc_info((s..\modules\db_mssql_grt.pytgetProcedureNamess cCst|dt|d}d}t|}|jdkrBgS|jdkrW|n|}gt|||D]}|d^qpS(NsUSE %ss[SELECT name FROM sys.objects WHERE type_desc LIKE '%FUNCTION%' AND schema_id = SCHEMA_ID(?)soSELECT ROUTINE_NAME as name FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_SCHEMA=? AND ROUTINE_TYPE='FUNCTION'ii i(R R$RRK(RRTRYRZR[RWRt func_info((s..\modules\db_mssql_grt.pytgetFunctionNames!s cs{tjddtjj}||_|jj|jj|jj jt |d|j }|r|dpyd|_ ntjddt t||tjddii}i}i}i} |jd t} |jd t} |jd t} |jd t} d }d}d}x>|D]6}t | r`tt|||nd|<| rtt|||nd||ss8Reverse engineering foreign keys for tables in schema %ssASecond pass of table reverse engineering for schema %s completed!sReverse engineering completed!(%Rt send_progressR(tdb_mssql_CatalogRtsimpleDatatypest remove_alltextendR7R&R R9tdefaultCollationNameR treverseEngineerUserDatatypestgettTrueR>R]R_RcReRatreset_progress_stepstbegin_progress_steptdb_mssql_SchematschematatappendR5Rgtend_progress_stepRitroutinestreverseEngineerProcedurestreverseEngineerFunctionsRhtsum(RRTt schemata_listtoptionstcatalogt collation_rowtview_count_per_schematroutine_count_per_schemattrigger_count_per_schemattotal_count_per_schemat get_tablest get_triggerst get_viewst get_routinesttotaltitaccumulated_progressRYtaccumulated_schema_progresstschema_progress_sharetthis_schema_progressRltstep_progress_sharet total_tables((Rms..\modules\db_mssql_grt.pytreverseEngineer6s    ((>(**                         cCsDt|dt|jd}t|}|jdkr@t}|jjxt||D]\}}}}} } tj j } |j | _|| _ || _ | | _| | _t} x9|jD].} | j|j kr| | _t} PqqW| s tjdd||fn|| _|jj| qaWndS(NsUSE %sszSELECT name, TYPE_NAME(system_type_id), max_length, precision, scale, is_nullable FROM sys.types WHERE is_user_defined = 1i s"MSSQL reverseEngineerUserDatatypess8Could not find base type "%s" for user defined type "%s"i(R R$RRRKRt userDatatypesRqRR(tdb_mssql_UserDatatypetuppertcharacterMaximumLengthtnumericPrecisiont numericScalet isNullabletFalseRpt actualTypeRvt send_warningR&R{(RRRRWRRt base_typetlengtht precisiontscalet is_nullabletdatatypetactual_type_foundt simple_type((s..\modules\db_mssql_grt.pyRts0   (      cCstjj}||_|jj|jj|jjjt ||t ||}|j jx?|D]7}tjj }||_||_|j j |qnW|S(N(RR(RoRRpRqRrR7R&RtRXRzRyR{(RRTRtschemata_namesRYRl((s..\modules\db_mssql_grt.pytreverseEngineerCatalogs       cCst|jjdg}d|j|k}|r|j}t|dt|jd}d}t|}|jdkr|n|}|j j gt|||jD]} | d| df^q} t | d } d } x| D]\} }t j | | d |j| ft jj}| |_|j j|||_|pPd |_t||t||t||| d 7} qW|jd|jnhd } t |j d } xL|j D]A}t||t j | | d|j|jf| d 7} qWdS(Nt_rev_eng_progress_flagss%s_tables_first_passsUSE %ssSELECT t.name, p.value FROM sys.tables t LEFT JOIN sys.extended_properties p ON p.major_id = t.object_id AND p.minor_id = 0 AND p.name = 'MS_Description' AND p.class_desc = 'OBJECT_OR_COLUMN' WHERE schema_id = SCHEMA_ID('%s')sSELECT TABLE_NAME, '' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' AND TABLE_SCHEMA='%s'i iig|=gsRetrieving table %s.%s...Rfg?s<Reverse engineering of foreign keys in table %s.%s completed(RRt setdefaultRR&R R$RRKttablesRqR>RRnR(tdb_mssql_TableR{tcommenttreverseEngineerTableColumnstreverseEngineerTablePKtreverseEngineerTableIndicestreverseEngineerTableFKs(RRltprogress_flagst is_first_passRRZR[RWRRRt table_namesRRR\t table_commentttable((s..\modules\db_mssql_grt.pyRg s@   7!      $c s)|j}|j}t|dt|jd}d}t|}|jdkrY|n|}t|||j|jf}t} g| jD]} | j^q} g|jD]} | j^q} g|j D]} | d^q}x>|D]6}t dt ||D}t j j}|dp,d|_|jdkrQ|d d kn|d  |_|d pld|_|d pd|_|d pd|_|dpd|_|dpd|_|d|_d}y| j|dj} Wntk ry$|j| j|dj}Wnnttfk rd}| jd} d|_d|dj|j|j|jf}t jd|qXd} ||_nX| dk r| j| |_n|d}|dk rfd|dkrt|_q||_ n|j!|qWdS(NsUSE %ssSELECT sys.columns.name AS COLUMN_NAME, sys.columns.is_nullable AS IS_NULLABLE, sys.types.name AS DATA_TYPE, sys.columns.max_length AS CHARACTER_MAXIMUM_LENGTH, sys.columns.precision AS NUMERIC_PRECISION, sys.columns.scale AS NUMERIC_SCALE, sys.columns.collation_name AS COLLATION_NAME, is_identity AS IS_IDENTITY_COLUMN, CAST (sys.default_constraints.definition as NVARCHAR(max)) as COLUMN_DEFAULT, sys.extended_properties.value as COLUMN_COMMENT FROM sys.columns JOIN sys.types ON sys.columns.user_type_id=sys.types.user_type_id JOIN sys.objects ON sys.columns.object_id = sys.objects.object_id LEFT JOIN sys.default_constraints ON (sys.columns.column_id=sys.default_constraints.parent_column_id AND sys.columns.object_id=sys.default_constraints.parent_object_id) LEFT JOIN sys.extended_properties ON sys.extended_properties.major_id = sys.columns.object_id and sys.extended_properties.minor_id = sys.columns.column_id and sys.extended_properties.name = 'MS_Description' and sys.extended_properties.class_desc = 'OBJECT_OR_COLUMN' WHERE sys.objects.schema_id=SCHEMA_ID(?) AND sys.objects.name=? ORDER BY sys.columns.column_ids~SELECT COLUMN_NAME, COLUMN_DEFAULT, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE, DATETIME_PRECISION, CHARACTER_SET_CATALOG, CHARACTER_SET_SCHEMA, CHARACTER_SET_NAME, COLLATION_NAME, DOMAIN_CATALOG, DOMAIN_SCHEMA, DOMAIN_NAME, (c.status & 128) / 128 AS IS_IDENTITY_COLUMN, '' AS COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS, sysobjects t, sysusers u, syscolumns c WHERE TABLE_SCHEMA=? AND TABLE_NAME=? AND u.name=TABLE_SCHEMA AND t.name=TABLE_NAME AND u.uid=t.uid AND c.id=t.id AND c.name=COLUMN_NAME ORDER BY ORDINAL_POSITIONi icss|] }|VqdS(N((Rktnameval((s..\modules\db_mssql_grt.pys ist COLUMN_NAMERft IS_NULLABLEtYEStCOLLATION_NAMEtCHARACTER_MAXIMUM_LENGTHt NUMERIC_SCALEtNUMERIC_PRECISIONtCOLUMN_COMMENTtIS_IDENTITY_COLUMNt DATA_TYPEtVARCHARisXColumn datatype "%s" for column "%s" in table "%s.%s" reverse engineered as VARCHAR(255)s!MSSQL reverseEngineerTableColumnstCOLUMN_DEFAULTcs8|jdr4|jdr4|dd!}n|S(Nt(t)ii(t startswithtendswith(tdata(tremove_parenthesis(s..\modules\db_mssql_grt.pyRss(NULL)("R&R R$RRRKRRpRt descriptiontdicttzipRR(tdb_mssql_Columnt isNotNullt collationNameRRRRtidentityR tindexRt ValueErrort TypeErrorRtuserTypet simpleTypeRvtdefaultValueIsNullt defaultValuet addColumn(RRRlRt query_post90t query_pre90RWRtrowsRRtmssql_simple_datatypes_listtuser_datatypes_listtcol_descriptiont col_namesRRt row_valuestcolumnt user_datatypetmsgt default_value((Rs..\modules\db_mssql_grt.pyR?s^       -  $ )      c Cs|j}|j}t|d|jd|j|jf}t|jdkrutjdd|j|jfdSgt||D]}|d^q}x6|D].}t||j}|r|j|qqWdS(s9Reverse engineers the primary key(s) for the given table.sUSE %ssexec sp_pkeys '%s', '%s'is!Migration: reverseEngineerTablePKsTReverse engineer of table %s.%s was attempted but the table has no columns attributeii( R&R RR>tcolumnsRR@R#taddPrimaryKeyColumn( RRRlRRRRt pk_col_namest pk_columnR((s..\modules\db_mssql_grt.pyRs   & c CsM|j}|j}t|jdkrKtjdd|j|jfdSt|}t|d|j|jdkrd|j|jf}t||j }d}x|D]\ }} } } } } }}}} |s| s|j| krStj j }| |_||_ | |_| r(dnd |_||_||_|j|nt| |j}|rtj j}| d | |_||_|jj|qqqWnd |j|jf}d }t||j }xd|D]\\ }} }}} }}}}| dkrqn| r| rtj j }| |_||_ | |_|d krfd n| rrdnd |_t|dk|_||_|r|nd|_xt||||fD]i\} }t| |j}|rtj j}| d | |_||_||_|jj|qqW|j|qqWdS(s2Reverse engineers the indices for the given table.is&Migration: reverseEngineerTableIndicessTReverse engineer of table %s.%s was attempted but the table has no columns attributeisUSE %si sSELECT u.name as TABLE_SCHEMA, o.name as TABLE_NAME, i.name AS INDEX_NAME, c.name AS COLUMN_NAME, (i.status & 1) AS IGNORE_DUPLICATE_KEYS, (i.status & 2) / 2 AS IS_UNIQUE, (i.status & 4) / 4 AS IGNORE_DUPLICATE_ROWS, (i.status & 16) / 16 AS IS_CLUSTERED, (i.status & 2048) / 2048 AS IS_PRIMARY_KEY, (i.status & 4096) / 4096 AS IS_UNIQUE_KEY FROM sysindexes i, sysobjects o, sysusers u, sysindexkeys k, syscolumns c WHERE u.uid=o.uid AND i.id = o.id AND k.indid=i.indid AND k.id=i.id AND c.id=i.id AND c.colid=k.colid AND i.indid > 0 AND i.indid < 255 AND o.type = 'U' AND (i.status & 64)=0 AND (i.status & 8388608)=0 AND (i.status & 2048)=0 AND u.name='%s' AND o.name='%s' ORDER BY i.name, k.keynotUNIQUEtINDEXR%sSELECT object_id, name, index_id, CAST (type_desc AS NVARCHAR) AS type_desc, is_unique, is_primary_key, is_disabled, has_filter, CAST (filter_definition AS NVARCHAR) AS filter_definition FROM sys.indexes WHERE sys.indexes.object_id = OBJECT_ID('%s.%s')sSELECT c.name, ic.is_descending_key FROM sys.index_columns ic JOIN sys.columns c on (ic.column_id=c.column_id and ic.object_id=c.object_id) WHERE ic.object_id=%i and ic.index_id=%itSPATIALt CLUSTEREDRfN(R&R>RRR@RRR RKtfetchallR R(tdb_mssql_Indext isPrimarytuniquet indexTypet clusteredtignoreDuplicateRowstaddIndexR#tdb_mssql_IndexColumntreferencedColumnR{R:t hasFiltertfilterDefinitiontdescend(RRRlRRtget_indices_query_pre90t index_rowsRt table_schemaR\t index_namet column_nametignore_dup_keyst is_uniquetignore_dup_rowst is_clusteredtis_primary_keyRt index_columntget_indices_querytget_index_columns_queryttable_idtindex_idt type_desct is_disabledt has_filtertfilter_definitiontis_descending_key((s..\modules\db_mssql_grt.pyRsl    (      (    ' &  cCs|j}|j}t|d|jt|}|jdkrud}t|||j|jfj}d}x|D]\}} } } } } }|dks|j|kr|r|jj|nt j j }|pd|_||_|pd|_ | pd|_ d|_t| |j}|rBt| |j}n*t jdd|j|j| |fdS|st jdd |j|j| | |fdS||_nt| |j}|st jdd |j|j| |fdSt| |j}|s5t jdd |j|j| || | fdS|jj||jj|qxW|r|jj|qnsd |j|jf}d }t|jdkrt jdd|j|jfdSt||j}|jjx|D]\}}}}}|st j j }|p&d|_||_|p>d|_ |pMd|_ d|_d}xct|||D]O\} } } } |st| |j}|rt| |j}qt jdd|j|j| |fdSn|st jdd |j|j| | |fdSt| |j}|s\t jdd |j|j| |fdSt| |j}|st jdd |j|j| || | fdS|jj||jj|quW||_|jj|qqWdS(s7Reverse engineers the foreign keys for the given table.sUSE %si s0SELECT fk.name AS CONSTRAINT_NAME, c.name AS COLUMN_NAME, ref_u.name AS REF_SCHEMA_NAME, ref_tbl.name AS REF_TABLE_NAME, ref_c.name AS REF_COLUMN_NAME, CASE WHEN (ObjectProperty(sfk.constid, 'CnstIsUpdateCascade')=1) THEN 'CASCADE' ELSE 'NO ACTION' END as UPDATE_RULE, CASE WHEN (ObjectProperty(sfk.constid, 'CnstIsDeleteCascade')=1) THEN 'CASCADE' ELSE 'NO ACTION' END as DELETE_RULE FROM sysusers u, sysobjects t, sysobjects fk, sysforeignkeys sfk, syscolumns c, sysobjects ref_tbl, sysusers ref_u, syscolumns ref_c WHERE u.name=? AND t.name=? AND t.uid=u.uid AND t.xtype='U' AND sfk.fkeyid=t.id AND fk.id=sfk.constid AND c.id=t.id AND c.colid=sfk.fkey AND ref_tbl.id=sfk.rkeyid AND ref_tbl.uid=ref_u.uid AND ref_c.id=ref_tbl.id AND ref_c.colid=sfk.rkey ORDER BY sfk.constid, sfk.keynoRfis"Migration: reverseEngineerTableFKsskWhile reverse engineering table %s.%s: Referenced schema %s in foreign key %s not found in catalog schemataisYWhile reverse engineering table %s.%s: Referenced table %s.%s in foreign key %s not foundsfWhile reverse engineering table %s.%s: Foreign key column %s in foreign key %s not found in this tablesgWhile reverse engineering table %s.%s: Foreign key column %s in foreign key %s not found in table %s.%ssSELECT object_id as fk_id, name, delete_referential_action_desc, update_referential_action_desc, is_disabled FROM sys.foreign_keys WHERE parent_object_id=OBJECT_ID('%s.%s')sSELECT COL_NAME(fkc.parent_object_id, fkc.parent_column_id) as parent_column, OBJECT_SCHEMA_NAME(fkc.referenced_object_id) as referenced_schema, OBJECT_NAME(fkc.referenced_object_id) as referenced_table, COL_NAME(fkc.referenced_object_id, fkc.referenced_column_id) as referenced_column FROM sys.foreign_key_columns fkc JOIN sys.foreign_keys fk ON fkc.constraint_object_id = fk.object_id WHERE fk.object_id=?; sTReverse engineer of table %s.%s was attempted but the table has no columns attributeN(R&R RRRKRR t foreignKeysR{RR(tdb_mssql_ForeignKeyt deleteRulet updateRulet modelOnlyR#RzRR@treferencedTableRtreferencedColumnsR>Rq(RRRlRRtget_fks_query_pre9tfk_rowst foreign_keytfk_nameRtreferenced_schema_nametreferenced_table_nametreferenced_column_namet update_rulet delete_ruletreferenced_schematreferenced_tableRtreferenced_columnt get_fks_querytget_fk_mapping_querytfk_idtdelete_referential_actiontupdate_referential_actionR ((s..\modules\db_mssql_grt.pyRs   $"  &) &,    %&)&, c Cst|d|jjd}d}t|}|jdkrD|n|}t|||j}|r|jj|j}dt|d}xt |D]s\} \} } t j | |d|j| ft j j } | pd| _|| _| | _|jj| qWnd S( NsUSE %ssqSELECT OBJECT_NAME(object_id) as name, definition FROM sys.sql_modules WHERE OBJECT_SCHEMA_NAME(object_id) = '%s'snSELECT TABLE_NAME as name, VIEW_DEFINITION AS definition FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA='%s'i g?g|=sReverse engineering view %s.%sRfi(R R&RRRKtviewsRqRR>t enumerateRRnR(t db_mssql_Viewt sqlDefinitionR{( RRlRZR[RWRRt resultsettsteptidxt view_nametview_definitiontview((s..\modules\db_mssql_grt.pyRis$   !  c Cst|d|jjd}d}t|}|jdkrD|n|}t|||j|f}|rtjj}|pd|_||_|dd|_n|S(sReverse engineers a view for the given schema. Parameters: =========== connection: an object of the class :class:`db_mgmt_Connection` storing the parameters for the connection. schema: a schema object (an instance of :class:`grt.classes.db_mssql_Schema`). This object must have its ``owner`` and ``name`` attributes properly set. view_name: the name of the view to reverse engineer. Return value: ============= view: an object of the class :class:`grt.classes.db_mssql_View` with the retrieved information. sUSE %ssLSELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('%s.%s') snSELECT VIEW_DEFINITION AS definition FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA='%s' AND TABLE_NAME='%s'i Rfi( R R&RRRKRR(R)R*( RRlR.RZR[RWRR+R0((s..\modules\db_mssql_grt.pytreverseEngineerViews  c Cs1t|d|jjd}d}t|}|jdkrD|n|}t|||j}|r|j}dt|d}xt|D]|\} \} } tj | |d|j| ftj j } | pd| _|| _d | _ | | _ |jj| qWntj dd |jd S( NsUSE %ssSELECT OBJECT_NAME(M.object_id) as name, definition FROM sys.sql_modules M JOIN sys.procedures P ON M.object_id=P.object_id WHERE OBJECT_SCHEMA_NAME(M.object_id) = '%s'sSELECT ROUTINE_NAME as name, ROUTINE_DEFINITION as definition FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA='%s' AND ROUTINE_TYPE='PROCEDURE'i g?g|=s#Reverse engineering procedure %s.%sRft PROCEDUREs=Finished reverse engineering of procedures for the %s schema.i(R R&RRRKRR>R(RRnR(tdb_mssql_Routinet routineTypeR*R}R{( RRlRZR[RWRRR+R,R-t proc_nametproc_definitiontproc((s..\modules\db_mssql_grt.pyR~s&  !   c Cs0t|d|jjd}d}t|}|jdkrD|n|}t|||j}|r|j}dt|d}xt|D]|\} \} } tj | |d|j| ftj j } | pd| _|| _d | _ | | _ |jj| qWntj dd |jd S( NsUSE %ssSELECT OBJECT_NAME(M.object_id) as name, definition FROM sys.sql_modules M JOIN sys.objects O ON M.object_id=O.object_id WHERE type_desc LIKE '%FUNCTION%' AND schema_id = SCHEMA_ID(?)sSELECT ROUTINE_NAME as name, ROUTINE_DEFINITION as definition FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA=? AND ROUTINE_TYPE='FUNCTION'i g?g|=s"Reverse engineering function %s.%sRftFUNCTIONs<Finished reverse engineering of functions for the %s schema.i(R R&RRRKRR>R(RRnR(R3R4R*R}R{( RRlRZR[RWRRR+R,R-t func_nametfunc_definitionR7((s..\modules\db_mssql_grt.pyRs&  !   cCst|d|jjd}d}t|}|jdkrD|n|}t|||j}|rx|jD]}|jjqpW|j}dt |d} d} x-t |D]\} \} } }}}}}t j | | d|j| ft jj}| |_||_| |_|jdkrK|jd|_n)djd t|d | D|_|rd nd |_| s| j|krt||j} n| r| |_| jj|qqWnt j dd |jdS(NsUSE %ssVSELECT st.object_id, st.name AS trigger_name, OBJECT_NAME(st.parent_id) AS table_name, sm.definition as trigger_code, is_disabled, is_instead_of_trigger, '' FROM sys.triggers st JOIN sys.sql_modules sm ON st.object_id = sm.object_id WHERE st.parent_class = 1 AND OBJECT_SCHEMA_NAME(st.object_id) = '%s' ORDER BY st.parent_idshSELECT so.id, so.name AS trigger_name, OBJECT_NAME(so.parent_obj) AS table_name, sc.text AS sql_code, OBJECTPROPERTY(so.id, 'ExecIsTriggerDisabled') AS is_disabled, so.instrig as is_instead_of_trigger, event = ( CASE WHEN OBJECTPROPERTY(so.id, 'ExecIsInsertTrigger')=1 THEN 'INSERT;' ELSE '' END + CASE WHEN OBJECTPROPERTY(so.id, 'ExecIsDeleteTrigger')=1 THEN 'DELETE;' ELSE '' END + CASE WHEN OBJECTPROPERTY(so.id, 'ExecIsUpdateTrigger')=1 THEN 'UPDATE' ELSE '' END) FROM sysobjects so LEFT JOIN syscomments sc ON so.id = sc.id LEFT JOIN sysusers su ON so.uid = su.uid WHERE so.type = 'TR' AND su.name='%s'i g?g|=s!Reverse engineering trigger %s.%st;css|]}|dVqdS(iN((RkRR((s..\modules\db_mssql_grt.pys MssPSELECT type_desc FROM sys.trigger_events WHERE sys.trigger_events.object_id = %dt INSTEADOFtAFTERs;Finished reverse engineering of triggers for the %s schema.i(R R&RRRKRttriggersRqRR>R R(RRnR(tdb_mssql_TriggerR*tenabledtstripteventtjointtimingR#R{(RRlRZR[RWRRRR+R,t trigger_tableR-t trigger_idt trigger_nameR\t trigger_codeR tis_instead_of_triggerRBttrigger((s..\modules\db_mssql_grt.pyRh"s<   .!    cCs3tjtjd}tjjjjj||S(Ns/mssql_rdbms_info.xml( Rt unserializet ModuleInfotmoduleDataDirectoryR RRRR{(R((s..\modules\db_mssql_grt.pytinitializeDBMSInfo]scCsetjtj}ddl}|j}x4|jD]&\}}|jd|||fq7W|S(Nis %s|%s (%s)(RtListtSTRINGR,t dataSourcestitemsR{(tresultR,tsourcestkeyR.((s..\modules\db_mssql_grt.pytgetDataSourceNamesfs   cCsJtjtj}|jd|jd|jd|jd|S(Ns#7.1|Microsoft SQL Server 2000 (7.1)s#7.2|Microsoft SQL Server 2005 (7.2)s#7.2|Microsoft SQL Server 2008 (7.2)s#7.2|Microsoft SQL Server 2012 (7.2)(RRORPR{(RS((s..\modules\db_mssql_grt.pytgetTDSProtocolVersionChoicesps     (<RRRt workbenchRtworkbench.exceptionsRRLR RRRRR R#texportRPR$R(tGrtNamedObjectR+tINTtdb_mgmt_ConnectionR6RGRHRIRJRAtLISTRSRXR]R_RaRcReR*tDICTRRoRtRRyRgRRRRRRiR)R1R~RRht db_mgmt_RdbmsRNRVRW(((s..\modules\db_mssql_grt.pytsR      !$ *9$$' $ *00000B-!-!-5-b--`--"6)---; $