diff --git a/config/datatypes_conf.xml.sample b/config/datatypes_conf.xml.sample index 4f9aca67bd4..50b55b28cca 100644 --- a/config/datatypes_conf.xml.sample +++ b/config/datatypes_conf.xml.sample @@ -181,7 +181,8 @@ - + + @@ -271,6 +272,7 @@ --> + diff --git a/lib/galaxy/datatypes/binary.py b/lib/galaxy/datatypes/binary.py index 8b45b610d53..19669f6dd02 100644 --- a/lib/galaxy/datatypes/binary.py +++ b/lib/galaxy/datatypes/binary.py @@ -20,7 +20,7 @@ eggs.require( "bx-python" ) from bx.seq.twobit import TWOBIT_MAGIC_NUMBER, TWOBIT_MAGIC_NUMBER_SWAP, TWOBIT_MAGIC_SIZE from galaxy.util import sqlite -from galaxy.datatypes.metadata import MetadataElement,ListParameter,DictParameter +from galaxy.datatypes.metadata import MetadataElement, MetadataParameter, ListParameter, DictParameter from galaxy.datatypes import metadata import dataproviders @@ -640,8 +640,66 @@ class SQlite ( Binary ): return dataproviders.dataset.SQliteDataDictProvider( dataset_source, **settings ) +#Binary.register_sniffable_binary_format("sqlite", "sqlite", SQlite) + + +class GeminiSQLite( SQlite ): + """Class describing a Gemini Sqlite database """ + MetadataElement( name="gemini_version", default='0.10.0' , param=MetadataParameter, desc="Gemini Version", + readonly=True, visible=True, no_value='0.10.0' ) + file_ext = "gemini.sqlite" + + def set_meta( self, dataset, overwrite = True, **kwd ): + super( GeminiSQLite, self ).set_meta( dataset, overwrite = overwrite, **kwd ) + try: + conn = sqlite.connect( dataset.file_name ) + c = conn.cursor() + tables_query = "SELECT version FROM version" + result = c.execute( tables_query ).fetchall() + for version, in result: + dataset.metadata.gemini_version = version + # TODO: Can/should we detect even more attributes, such as use of PED file, what was input annotation type, etc. + except Exception, e: + log.warn( '%s, set_meta Exception: %s', self, e ) + + def sniff( self, filename ): + if super( GeminiSQLite, self ).sniff( filename ): + gemini_table_names = [ "gene_detailed", "gene_summary", "resources", "sample_genotype_counts", "sample_genotypes", "samples", + "variant_impacts", "variants", "version" ] + try: + conn = sqlite.connect( filename ) + c = conn.cursor() + tables_query = "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name" + result = c.execute( tables_query ).fetchall() + result = map( lambda x: x[0], result ) + for table_name in gemini_table_names: + if table_name not in result: + return False + return True + except Exception, e: + log.warn( '%s, sniff Exception: %s', self, e ) + return False + + def set_peek( self, dataset, is_multi_byte=False ): + if not dataset.dataset.purged: + dataset.peek = "Gemini SQLite Database, version %s" % ( dataset.metadata.gemini_version or 'unknown' ) + dataset.blurb = data.nice_size( dataset.get_size() ) + else: + dataset.peek = 'file does not exist' + dataset.blurb = 'file purged from disk' + + def display_peek( self, dataset ): + try: + return dataset.peek + except: + return "Gemini SQLite Database, version %s" % ( dataset.metadata.gemini_version or 'unknown' ) + +Binary.register_sniffable_binary_format( "gemini.sqlite", "gemini.sqlite", GeminiSQLite ) +# FIXME: We need to register gemini.sqlite before sqlite, since register_sniffable_binary_format and is_sniffable_binary called in upload.py +# ignores sniff order declared in datatypes_conf.xml Binary.register_sniffable_binary_format("sqlite", "sqlite", SQlite) + class Xlsx(Binary): """Class for Excel 2007 (xlsx) files""" file_ext="xlsx" diff --git a/tools/data_source/upload.py b/tools/data_source/upload.py index 42fd67f5fc1..0c968f1e5ba 100644 --- a/tools/data_source/upload.py +++ b/tools/data_source/upload.py @@ -113,6 +113,8 @@ def add_file( dataset, registry, json_file, output_path ): ext = sniff.guess_ext( dataset.path, is_multi_byte=True ) # Is dataset content supported sniffable binary? else: + # FIXME: This ignores the declared sniff order in datatype_conf.xml + # resulting in improper behavior type_info = Binary.is_sniffable_binary( dataset.path ) if type_info: data_type = type_info[0]