Compare commits
23 Commits
v3.0.0-bet
...
v3.0.0-bet
Author | SHA1 | Date | |
---|---|---|---|
4cf635d001 | |||
b7e7cc232a | |||
b6ab792ceb | |||
ddea5a2964 | |||
30852ab7d5 | |||
4d0299904e | |||
eef5156d95 | |||
e62c991bbc | |||
1218eed7fd | |||
cd9cea8c97 | |||
98cfb70d73 | |||
b9f68c76c8 | |||
0b98371688 | |||
f0d152fcbd | |||
8019dee68e | |||
0b4a234671 | |||
d32cfdcce5 | |||
219c0d6fdc | |||
dc9f897917 | |||
bb72682f7d | |||
52920c3c71 | |||
18c22cecf9 | |||
1bfb96023c |
@ -1,4 +1,3 @@
|
|||||||
#/usr/bin/env bash
|
|
||||||
|
|
||||||
_obi_comp ()
|
_obi_comp ()
|
||||||
{
|
{
|
@ -266,9 +266,9 @@ def run(config):
|
|||||||
# If the input and the output DMS are different, delete the temporary result view in the input DMS
|
# If the input and the output DMS are different, delete the temporary result view in the input DMS
|
||||||
if i_dms != o_dms:
|
if i_dms != o_dms:
|
||||||
View.delete_view(i_dms, o_view_name)
|
View.delete_view(i_dms, o_view_name)
|
||||||
o_dms.close()
|
o_dms.close(force=True)
|
||||||
|
|
||||||
i_dms.close()
|
i_dms.close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
|
@ -247,10 +247,10 @@ def run(config):
|
|||||||
#print("\n\nOutput view:\n````````````", file=sys.stderr)
|
#print("\n\nOutput view:\n````````````", file=sys.stderr)
|
||||||
#print(repr(view), file=sys.stderr)
|
#print(repr(view), file=sys.stderr)
|
||||||
|
|
||||||
input[0].close()
|
input[0].close(force=True)
|
||||||
if two_views:
|
if two_views:
|
||||||
rinput[0].close()
|
rinput[0].close(force=True)
|
||||||
output[0].close()
|
output[0].close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
|
@ -379,7 +379,7 @@ def run(config):
|
|||||||
# If the input and the output DMS are different, delete the temporary imported view used to create the final view
|
# If the input and the output DMS are different, delete the temporary imported view used to create the final view
|
||||||
if i_dms != o_dms:
|
if i_dms != o_dms:
|
||||||
View.delete_view(o_dms, imported_view_name)
|
View.delete_view(o_dms, imported_view_name)
|
||||||
o_dms.close()
|
o_dms.close(force=True)
|
||||||
i_dms.close()
|
i_dms.close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
@ -97,9 +97,9 @@ def run(config):
|
|||||||
# If the input and the output DMS are different, delete the temporary result view in the input DMS
|
# If the input and the output DMS are different, delete the temporary result view in the input DMS
|
||||||
if i_dms != o_dms:
|
if i_dms != o_dms:
|
||||||
View.delete_view(i_dms, o_view_name)
|
View.delete_view(i_dms, o_view_name)
|
||||||
o_dms.close()
|
o_dms.close(force=True)
|
||||||
|
|
||||||
i_dms.close()
|
i_dms.close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
|
||||||
|
@ -87,6 +87,23 @@ def run(config):
|
|||||||
Column.new_column(o_view, REVERSE_SEQUENCE_COLUMN, OBI_SEQ)
|
Column.new_column(o_view, REVERSE_SEQUENCE_COLUMN, OBI_SEQ)
|
||||||
Column.new_column(o_view, REVERSE_QUALITY_COLUMN, OBI_QUAL, associated_column_name=REVERSE_SEQUENCE_COLUMN, associated_column_version=o_view[REVERSE_SEQUENCE_COLUMN].version)
|
Column.new_column(o_view, REVERSE_QUALITY_COLUMN, OBI_QUAL, associated_column_name=REVERSE_SEQUENCE_COLUMN, associated_column_version=o_view[REVERSE_SEQUENCE_COLUMN].version)
|
||||||
|
|
||||||
|
# Initialize multiple elements columns
|
||||||
|
dict_cols = {}
|
||||||
|
for v in iview_list:
|
||||||
|
for coln in v.keys():
|
||||||
|
if v[coln].nb_elements_per_line > 1:
|
||||||
|
if coln not in dict_cols:
|
||||||
|
dict_cols[coln] = {}
|
||||||
|
dict_cols[coln]['eltnames'] = set(v[coln].elements_names)
|
||||||
|
dict_cols[coln]['nbelts'] = v[coln].nb_elements_per_line
|
||||||
|
dict_cols[coln]['obitype'] = v[coln].data_type_int
|
||||||
|
else:
|
||||||
|
dict_cols[coln]['eltnames'] = set(v[coln].elements_names + list(dict_cols[coln]['eltnames']))
|
||||||
|
dict_cols[coln]['nbelts'] = len(dict_cols[coln]['eltnames'])
|
||||||
|
for coln in dict_cols:
|
||||||
|
Column.new_column(o_view, coln, dict_cols[coln]['obitype'],
|
||||||
|
nb_elements_per_line=dict_cols[coln]['nbelts'], elements_names=list(dict_cols[coln]['eltnames']))
|
||||||
|
|
||||||
# Initialize the progress bar
|
# Initialize the progress bar
|
||||||
pb = ProgressBar(total_len, config, seconde=5)
|
pb = ProgressBar(total_len, config, seconde=5)
|
||||||
|
|
||||||
@ -116,7 +133,7 @@ def run(config):
|
|||||||
#print(repr(view), file=sys.stderr)
|
#print(repr(view), file=sys.stderr)
|
||||||
|
|
||||||
for d in idms_list:
|
for d in idms_list:
|
||||||
d.close()
|
d.close(force=True)
|
||||||
o_dms.close()
|
o_dms.close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
@ -124,8 +124,8 @@ def run(config):
|
|||||||
# If the input and the output DMS are different, delete the temporary result view in the input DMS
|
# If the input and the output DMS are different, delete the temporary result view in the input DMS
|
||||||
if i_dms != o_dms:
|
if i_dms != o_dms:
|
||||||
View.delete_view(i_dms, o_view_name)
|
View.delete_view(i_dms, o_view_name)
|
||||||
o_dms.close()
|
o_dms.close(force=True)
|
||||||
|
|
||||||
i_dms.close()
|
i_dms.close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
@ -56,3 +56,5 @@ def run(config):
|
|||||||
print(count2)
|
print(count2)
|
||||||
else:
|
else:
|
||||||
print(count1)
|
print(count1)
|
||||||
|
|
||||||
|
input[0].close(force=True)
|
||||||
|
@ -35,13 +35,13 @@ def addOptions(parser):
|
|||||||
action="store", dest="ecopcr:primer1",
|
action="store", dest="ecopcr:primer1",
|
||||||
metavar='<PRIMER>',
|
metavar='<PRIMER>',
|
||||||
type=str,
|
type=str,
|
||||||
help="Forward primer.")
|
help="Forward primer, length must be less than or equal to 32")
|
||||||
|
|
||||||
group.add_argument('--primer2', '-R',
|
group.add_argument('--primer2', '-R',
|
||||||
action="store", dest="ecopcr:primer2",
|
action="store", dest="ecopcr:primer2",
|
||||||
metavar='<PRIMER>',
|
metavar='<PRIMER>',
|
||||||
type=str,
|
type=str,
|
||||||
help="Reverse primer.")
|
help="Reverse primer, length must be less than or equal to 32")
|
||||||
|
|
||||||
group.add_argument('--error', '-e',
|
group.add_argument('--error', '-e',
|
||||||
action="store", dest="ecopcr:error",
|
action="store", dest="ecopcr:error",
|
||||||
@ -203,6 +203,7 @@ def run(config):
|
|||||||
#print("\n\nOutput view:\n````````````", file=sys.stderr)
|
#print("\n\nOutput view:\n````````````", file=sys.stderr)
|
||||||
#print(repr(o_dms[o_view_name]), file=sys.stderr)
|
#print(repr(o_dms[o_view_name]), file=sys.stderr)
|
||||||
|
|
||||||
o_dms.close()
|
i_dms.close(force=True)
|
||||||
|
o_dms.close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
@ -64,9 +64,9 @@ def run(config):
|
|||||||
ref_view_name = ref[1]
|
ref_view_name = ref[1]
|
||||||
|
|
||||||
# Check that the threshold demanded is greater than or equal to the threshold used to build the reference database
|
# Check that the threshold demanded is greater than or equal to the threshold used to build the reference database
|
||||||
if config['ecotag']['threshold'] < eval(i_dms[ref_view_name].comments["ref_db_threshold"]) :
|
if config['ecotag']['threshold'] < eval(ref_dms[ref_view_name].comments["ref_db_threshold"]) :
|
||||||
print("Error: The threshold demanded (%f) is lower than the threshold used to build the reference database (%f).",
|
print("Error: The threshold demanded (%f) is lower than the threshold used to build the reference database (%f).",
|
||||||
config['ecotag']['threshold'], i_dms[ref_view_name].comments["ref_db_threshold"])
|
config['ecotag']['threshold'], ref_dms[ref_view_name].comments["ref_db_threshold"])
|
||||||
|
|
||||||
# Open the output: only the DMS
|
# Open the output: only the DMS
|
||||||
output = open_uri(config['obi']['outputURI'],
|
output = open_uri(config['obi']['outputURI'],
|
||||||
@ -126,9 +126,11 @@ def run(config):
|
|||||||
# If the input and the output DMS are different, delete the temporary result view in the input DMS
|
# If the input and the output DMS are different, delete the temporary result view in the input DMS
|
||||||
if i_dms != o_dms:
|
if i_dms != o_dms:
|
||||||
View.delete_view(i_dms, o_view_name)
|
View.delete_view(i_dms, o_view_name)
|
||||||
o_dms.close()
|
o_dms.close(force=True)
|
||||||
|
|
||||||
i_dms.close()
|
taxo_dms.close(force=True)
|
||||||
|
ref_dms.close(force=True)
|
||||||
|
i_dms.close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
|
||||||
|
@ -86,7 +86,7 @@ def run(config):
|
|||||||
if not BrokenPipeError and not IOError:
|
if not BrokenPipeError and not IOError:
|
||||||
output_object.close()
|
output_object.close()
|
||||||
iview.close()
|
iview.close()
|
||||||
input[0].close()
|
input[0].close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
|
||||||
|
@ -370,7 +370,7 @@ def run(config):
|
|||||||
# If the input and the output DMS are different, delete the temporary imported view used to create the final view
|
# If the input and the output DMS are different, delete the temporary imported view used to create the final view
|
||||||
if i_dms != o_dms:
|
if i_dms != o_dms:
|
||||||
View.delete_view(i_dms, o_view_name)
|
View.delete_view(i_dms, o_view_name)
|
||||||
o_dms.close()
|
o_dms.close(force=True)
|
||||||
i_dms.close()
|
i_dms.close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
@ -103,7 +103,7 @@ def run(config):
|
|||||||
# If the input and the output DMS are different, delete the temporary imported view used to create the final view
|
# If the input and the output DMS are different, delete the temporary imported view used to create the final view
|
||||||
if i_dms != o_dms:
|
if i_dms != o_dms:
|
||||||
View.delete_view(i_dms, o_view_name)
|
View.delete_view(i_dms, o_view_name)
|
||||||
o_dms.close()
|
o_dms.close(force=True)
|
||||||
i_dms.close()
|
i_dms.close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
@ -55,3 +55,4 @@ def run(config):
|
|||||||
else:
|
else:
|
||||||
raise Exception("ASCII history only available for views")
|
raise Exception("ASCII history only available for views")
|
||||||
|
|
||||||
|
input[0].close(force=True)
|
||||||
|
@ -11,6 +11,7 @@ from obitools3.dms.column.column cimport Column
|
|||||||
from obitools3.dms.obiseq cimport Nuc_Seq
|
from obitools3.dms.obiseq cimport Nuc_Seq
|
||||||
from obitools3.dms import DMS
|
from obitools3.dms import DMS
|
||||||
from obitools3.dms.taxo.taxo cimport Taxonomy
|
from obitools3.dms.taxo.taxo cimport Taxonomy
|
||||||
|
from obitools3.files.uncompress cimport CompressedFile
|
||||||
|
|
||||||
|
|
||||||
from obitools3.utils cimport tobytes, \
|
from obitools3.utils cimport tobytes, \
|
||||||
@ -65,6 +66,14 @@ def addOptions(parser):
|
|||||||
addTaxdumpInputOption(parser)
|
addTaxdumpInputOption(parser)
|
||||||
addMinimalOutputOption(parser)
|
addMinimalOutputOption(parser)
|
||||||
|
|
||||||
|
group = parser.add_argument_group('obi import specific options')
|
||||||
|
|
||||||
|
group.add_argument('--preread',
|
||||||
|
action="store_true", dest="import:preread",
|
||||||
|
default=False,
|
||||||
|
help="Do a first readthrough of the dataset if it contains huge dictionaries (more than 100 keys) for "
|
||||||
|
"a much faster import.")
|
||||||
|
|
||||||
|
|
||||||
def run(config):
|
def run(config):
|
||||||
|
|
||||||
@ -170,8 +179,6 @@ def run(config):
|
|||||||
if entry_count >= 0:
|
if entry_count >= 0:
|
||||||
pb = ProgressBar(entry_count, config, seconde=5)
|
pb = ProgressBar(entry_count, config, seconde=5)
|
||||||
|
|
||||||
entries = input[1]
|
|
||||||
|
|
||||||
NUC_SEQS_view = False
|
NUC_SEQS_view = False
|
||||||
if isinstance(output[1], View) :
|
if isinstance(output[1], View) :
|
||||||
view = output[1]
|
view = output[1]
|
||||||
@ -188,6 +195,60 @@ def run(config):
|
|||||||
|
|
||||||
dcols = {}
|
dcols = {}
|
||||||
|
|
||||||
|
# First read through the entries to prepare columns with dictionaries as they are very time-expensive to rewrite
|
||||||
|
if config['import']['preread']:
|
||||||
|
logger("info", "First readthrough...")
|
||||||
|
entries = input[1]
|
||||||
|
i = 0
|
||||||
|
dict_dict = {}
|
||||||
|
for entry in entries:
|
||||||
|
PyErr_CheckSignals()
|
||||||
|
|
||||||
|
if entry is None: # error or exception handled at lower level, not raised because Python generators can't resume after any exception is raised
|
||||||
|
if config['obi']['skiperror']:
|
||||||
|
i-=1
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
raise Exception("obi import error in first readthrough")
|
||||||
|
|
||||||
|
if pb is not None:
|
||||||
|
pb(i)
|
||||||
|
elif not i%50000:
|
||||||
|
logger("info", "Read %d entries", i)
|
||||||
|
|
||||||
|
for tag in entry :
|
||||||
|
if type(entry[tag]) == dict :
|
||||||
|
if tag in dict_dict:
|
||||||
|
dict_dict[tag][0].update(entry[tag].keys())
|
||||||
|
else:
|
||||||
|
dict_dict[tag] = [set(entry[tag].keys()), get_obitype(entry[tag])]
|
||||||
|
i+=1
|
||||||
|
|
||||||
|
if pb is not None:
|
||||||
|
pb(i, force=True)
|
||||||
|
print("", file=sys.stderr)
|
||||||
|
|
||||||
|
for tag in dict_dict:
|
||||||
|
dcols[tag] = (Column.new_column(view, tag, dict_dict[tag][1], \
|
||||||
|
nb_elements_per_line=len(dict_dict[tag][0]), \
|
||||||
|
elements_names=list(dict_dict[tag][0])), \
|
||||||
|
value_obitype)
|
||||||
|
|
||||||
|
|
||||||
|
# Reinitialize the input
|
||||||
|
if isinstance(input[0], CompressedFile):
|
||||||
|
input_is_file = True
|
||||||
|
if entry_count >= 0:
|
||||||
|
pb = ProgressBar(entry_count, config, seconde=5)
|
||||||
|
try:
|
||||||
|
input[0].close()
|
||||||
|
except AttributeError:
|
||||||
|
pass
|
||||||
|
input = open_uri(config['obi']['inputURI'], force_file=input_is_file)
|
||||||
|
if input is None:
|
||||||
|
raise Exception("Could not open input URI")
|
||||||
|
|
||||||
|
entries = input[1]
|
||||||
i = 0
|
i = 0
|
||||||
for entry in entries :
|
for entry in entries :
|
||||||
|
|
||||||
|
@ -46,5 +46,5 @@ def run(config):
|
|||||||
process.wait()
|
process.wait()
|
||||||
|
|
||||||
iview.close()
|
iview.close()
|
||||||
input[0].close()
|
input[0].close(force=True)
|
||||||
|
|
||||||
|
@ -36,6 +36,7 @@ def run(config):
|
|||||||
l = []
|
l = []
|
||||||
for view in input[0]:
|
for view in input[0]:
|
||||||
l.append(tostr(view) + "\t(Date created: " + str(bytes2str_object(dms[view].comments["Date created"]))+")")
|
l.append(tostr(view) + "\t(Date created: " + str(bytes2str_object(dms[view].comments["Date created"]))+")")
|
||||||
|
dms[view].close()
|
||||||
l.sort()
|
l.sort()
|
||||||
for v in l:
|
for v in l:
|
||||||
print(v)
|
print(v)
|
||||||
@ -52,3 +53,4 @@ def run(config):
|
|||||||
print("\n### Comments:")
|
print("\n### Comments:")
|
||||||
print(str(input[1].comments))
|
print(str(input[1].comments))
|
||||||
|
|
||||||
|
input[0].close(force=True)
|
||||||
|
@ -42,7 +42,8 @@ def addOptions(parser):
|
|||||||
metavar="<URI>",
|
metavar="<URI>",
|
||||||
type=str,
|
type=str,
|
||||||
default=None,
|
default=None,
|
||||||
help="URI to the view containing the samples definition (with tags, primers, sample names,...)")
|
help="URI to the view containing the samples definition (with tags, primers, sample names,...)"
|
||||||
|
"Warning: primer lengths must be less than or equal to 32")
|
||||||
|
|
||||||
group.add_argument('-R', '--reverse-reads',
|
group.add_argument('-R', '--reverse-reads',
|
||||||
action="store", dest="ngsfilter:reverse",
|
action="store", dest="ngsfilter:reverse",
|
||||||
@ -172,6 +173,13 @@ cdef read_info_view(info_view, max_errors=2, verbose=False, not_aligned=False):
|
|||||||
primer_list = []
|
primer_list = []
|
||||||
i=0
|
i=0
|
||||||
for p in info_view:
|
for p in info_view:
|
||||||
|
|
||||||
|
# Check primer length: should not be longer than 32, the max allowed by the apat lib
|
||||||
|
if len(p[b'forward_primer']) > 32:
|
||||||
|
raise RollbackException("Error: primers can not be longer than 32bp, rollbacking views")
|
||||||
|
if len(p[b'reverse_primer']) > 32:
|
||||||
|
raise RollbackException("Error: primers can not be longer than 32bp, rollbacking views")
|
||||||
|
|
||||||
forward=Primer(p[b'forward_primer'],
|
forward=Primer(p[b'forward_primer'],
|
||||||
len(p[b'forward_tag']) if (b'forward_tag' in p and p[b'forward_tag']!=None) else None,
|
len(p[b'forward_tag']) if (b'forward_tag' in p and p[b'forward_tag']!=None) else None,
|
||||||
True,
|
True,
|
||||||
@ -594,7 +602,13 @@ def run(config):
|
|||||||
pb = ProgressBar(entries_len, config, seconde=5)
|
pb = ProgressBar(entries_len, config, seconde=5)
|
||||||
|
|
||||||
# Check and store primers and tags
|
# Check and store primers and tags
|
||||||
infos, primer_list = read_info_view(info_view, max_errors=config['ngsfilter']['error'], verbose=False, not_aligned=not_aligned) # TODO obi verbose option
|
try:
|
||||||
|
infos, primer_list = read_info_view(info_view, max_errors=config['ngsfilter']['error'], verbose=False, not_aligned=not_aligned) # TODO obi verbose option
|
||||||
|
except RollbackException, e:
|
||||||
|
if unidentified is not None:
|
||||||
|
raise RollbackException("obi ngsfilter error, rollbacking views: "+str(e), o_view, unidentified)
|
||||||
|
else:
|
||||||
|
raise RollbackException("obi ngsfilter error, rollbacking view: "+str(e), o_view)
|
||||||
|
|
||||||
aligner = Primer_search(primer_list, config['ngsfilter']['error'])
|
aligner = Primer_search(primer_list, config['ngsfilter']['error'])
|
||||||
|
|
||||||
@ -652,11 +666,11 @@ def run(config):
|
|||||||
#print("\n\nOutput view:\n````````````", file=sys.stderr)
|
#print("\n\nOutput view:\n````````````", file=sys.stderr)
|
||||||
#print(repr(o_view), file=sys.stderr)
|
#print(repr(o_view), file=sys.stderr)
|
||||||
|
|
||||||
input[0].close()
|
input[0].close(force=True)
|
||||||
output[0].close()
|
output[0].close(force=True)
|
||||||
info_input[0].close()
|
info_input[0].close(force=True)
|
||||||
if unidentified is not None:
|
if unidentified is not None:
|
||||||
unidentified_input[0].close()
|
unidentified_input[0].close(force=True)
|
||||||
aligner.free()
|
aligner.free()
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
@ -141,7 +141,7 @@ def run(config):
|
|||||||
# If the input and the output DMS are different, delete the temporary imported view used to create the final view
|
# If the input and the output DMS are different, delete the temporary imported view used to create the final view
|
||||||
if i_dms != o_dms:
|
if i_dms != o_dms:
|
||||||
View.delete_view(i_dms, o_view_name)
|
View.delete_view(i_dms, o_view_name)
|
||||||
o_dms.close()
|
o_dms.close(force=True)
|
||||||
i_dms.close()
|
i_dms.close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
@ -251,7 +251,7 @@ def run(config):
|
|||||||
for i in range(len(sorted_stats)):
|
for i in range(len(sorted_stats)):
|
||||||
c = sorted_stats[i][0]
|
c = sorted_stats[i][0]
|
||||||
for v in c:
|
for v in c:
|
||||||
if v is not None:
|
if type(v) == bytes:
|
||||||
print(pcat % tostr(v)+"\t", end="")
|
print(pcat % tostr(v)+"\t", end="")
|
||||||
else:
|
else:
|
||||||
print(pcat % str(v)+"\t", end="")
|
print(pcat % str(v)+"\t", end="")
|
||||||
@ -268,6 +268,6 @@ def run(config):
|
|||||||
print("%7d" %catcount[c], end="")
|
print("%7d" %catcount[c], end="")
|
||||||
print("%9d" %totcount[c])
|
print("%9d" %totcount[c])
|
||||||
|
|
||||||
input[0].close()
|
input[0].close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
@ -106,7 +106,7 @@ def run(config):
|
|||||||
# If the input and the output DMS are different, delete the temporary imported view used to create the final view
|
# If the input and the output DMS are different, delete the temporary imported view used to create the final view
|
||||||
if i_dms != o_dms:
|
if i_dms != o_dms:
|
||||||
View.delete_view(i_dms, o_view_name)
|
View.delete_view(i_dms, o_view_name)
|
||||||
o_dms.close()
|
o_dms.close(force=True)
|
||||||
i_dms.close()
|
i_dms.close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
@ -529,7 +529,7 @@ def run(config):
|
|||||||
test_taxo(config, infos)
|
test_taxo(config, infos)
|
||||||
|
|
||||||
infos['view'].close()
|
infos['view'].close()
|
||||||
infos['dms'].close()
|
infos['dms'].close(force=True)
|
||||||
shutil.rmtree(config['obi']['defaultdms']+'.obidms', ignore_errors=True)
|
shutil.rmtree(config['obi']['defaultdms']+'.obidms', ignore_errors=True)
|
||||||
|
|
||||||
print("Done.")
|
print("Done.")
|
||||||
|
@ -102,7 +102,7 @@ cdef extern from "obiview.h" nogil:
|
|||||||
const_char_p comments,
|
const_char_p comments,
|
||||||
bint create)
|
bint create)
|
||||||
|
|
||||||
int obi_view_delete_column(Obiview_p view, const_char_p column_name)
|
int obi_view_delete_column(Obiview_p view, const_char_p column_name, bint delete_file)
|
||||||
|
|
||||||
OBIDMS_column_p obi_view_get_column(Obiview_p view, const_char_p column_name)
|
OBIDMS_column_p obi_view_get_column(Obiview_p view, const_char_p column_name)
|
||||||
|
|
||||||
|
@ -94,16 +94,16 @@ cdef class DMS(OBIWrapper):
|
|||||||
return dms
|
return dms
|
||||||
|
|
||||||
|
|
||||||
def close(self) :
|
def close(self, force=False) :
|
||||||
'''
|
'''
|
||||||
Closes the DMS instance and free the associated memory
|
Closes the DMS instance and free the associated memory (no counter, closing is final)
|
||||||
|
|
||||||
The `close` method is automatically called by the object destructor.
|
The `close` method is automatically called by the object destructor.
|
||||||
'''
|
'''
|
||||||
cdef OBIDMS_p pointer = self.pointer()
|
cdef OBIDMS_p pointer = self.pointer()
|
||||||
if self.active() :
|
if self.active() :
|
||||||
OBIWrapper.close(self)
|
OBIWrapper.close(self)
|
||||||
if (obi_close_dms(pointer, False)) < 0 :
|
if (obi_close_dms(pointer, force=force)) < 0 :
|
||||||
raise Exception("Problem closing an OBIDMS")
|
raise Exception("Problem closing an OBIDMS")
|
||||||
|
|
||||||
|
|
||||||
@ -254,7 +254,8 @@ cdef class DMS(OBIWrapper):
|
|||||||
# bash command history property getter
|
# bash command history property getter
|
||||||
@property
|
@property
|
||||||
def bash_history(self):
|
def bash_history(self):
|
||||||
s = b"#!/bin/bash\n\n"
|
#s = b"#!${bash}/bin/bash\n\n"
|
||||||
|
s = b""
|
||||||
first = True
|
first = True
|
||||||
for command in self.command_line_history:
|
for command in self.command_line_history:
|
||||||
s+=b"#"
|
s+=b"#"
|
||||||
|
@ -22,7 +22,8 @@ cdef class View(OBIWrapper):
|
|||||||
cdef inline Obiview_p pointer(self)
|
cdef inline Obiview_p pointer(self)
|
||||||
|
|
||||||
cpdef delete_column(self,
|
cpdef delete_column(self,
|
||||||
object column_name)
|
object column_name,
|
||||||
|
bint delete_file=*)
|
||||||
|
|
||||||
cpdef rename_column(self,
|
cpdef rename_column(self,
|
||||||
object current_name,
|
object current_name,
|
||||||
|
@ -227,7 +227,8 @@ cdef class View(OBIWrapper) :
|
|||||||
|
|
||||||
|
|
||||||
cpdef delete_column(self,
|
cpdef delete_column(self,
|
||||||
object column_name) :
|
object column_name,
|
||||||
|
bint delete_file=False) :
|
||||||
|
|
||||||
cdef bytes column_name_b = tobytes(column_name)
|
cdef bytes column_name_b = tobytes(column_name)
|
||||||
|
|
||||||
@ -239,7 +240,7 @@ cdef class View(OBIWrapper) :
|
|||||||
col.close()
|
col.close()
|
||||||
|
|
||||||
# Remove the column from the view which closes the C structure
|
# Remove the column from the view which closes the C structure
|
||||||
if obi_view_delete_column(self.pointer(), column_name_b) < 0 :
|
if obi_view_delete_column(self.pointer(), column_name_b, delete_file) < 0 :
|
||||||
raise RollbackException("Problem deleting column %s from a view",
|
raise RollbackException("Problem deleting column %s from a view",
|
||||||
bytes2str(column_name_b), self)
|
bytes2str(column_name_b), self)
|
||||||
|
|
||||||
@ -307,7 +308,7 @@ cdef class View(OBIWrapper) :
|
|||||||
new_column[i] = old_column[i]
|
new_column[i] = old_column[i]
|
||||||
|
|
||||||
# Remove old column from view
|
# Remove old column from view
|
||||||
self.delete_column(column_name_b)
|
self.delete_column(column_name_b, delete_file=True)
|
||||||
|
|
||||||
# Rename new
|
# Rename new
|
||||||
new_column.name = column_name_b
|
new_column.name = column_name_b
|
||||||
@ -525,7 +526,7 @@ cdef class View(OBIWrapper) :
|
|||||||
# bash command history property getter
|
# bash command history property getter
|
||||||
@property
|
@property
|
||||||
def bash_history(self):
|
def bash_history(self):
|
||||||
s = b"#!/bin/bash\n\n"
|
s = b""
|
||||||
first = True
|
first = True
|
||||||
for level in self.view_history:
|
for level in self.view_history:
|
||||||
command_list = [level[input][b"command_line"] for input in level.keys()]
|
command_list = [level[input][b"command_line"] for input in level.keys()]
|
||||||
|
@ -156,6 +156,9 @@ def emblIterator_file(lineiterator,
|
|||||||
yield seq
|
yield seq
|
||||||
read+=1
|
read+=1
|
||||||
|
|
||||||
|
# Last sequence
|
||||||
|
seq = emblParser(entry)
|
||||||
|
|
||||||
yield seq
|
yield seq
|
||||||
|
|
||||||
free(entry)
|
free(entry)
|
||||||
|
@ -153,6 +153,9 @@ def genbankIterator_file(lineiterator,
|
|||||||
yield seq
|
yield seq
|
||||||
read+=1
|
read+=1
|
||||||
|
|
||||||
|
# Last sequence
|
||||||
|
seq = genbankParser(entry)
|
||||||
|
|
||||||
yield seq
|
yield seq
|
||||||
|
|
||||||
free(entry)
|
free(entry)
|
||||||
|
7
python/obitools3/uri/decode.pyx
Executable file → Normal file
7
python/obitools3/uri/decode.pyx
Executable file → Normal file
@ -171,7 +171,8 @@ Reads an URI and returns a tuple containing:
|
|||||||
def open_uri(uri,
|
def open_uri(uri,
|
||||||
bint input=True,
|
bint input=True,
|
||||||
type newviewtype=View,
|
type newviewtype=View,
|
||||||
dms_only=False):
|
dms_only=False,
|
||||||
|
force_file=False):
|
||||||
|
|
||||||
cdef bytes urib = tobytes(uri)
|
cdef bytes urib = tobytes(uri)
|
||||||
cdef bytes scheme
|
cdef bytes scheme
|
||||||
@ -195,9 +196,9 @@ def open_uri(uri,
|
|||||||
if 'obi' not in config:
|
if 'obi' not in config:
|
||||||
config['obi']={}
|
config['obi']={}
|
||||||
|
|
||||||
try:
|
if not force_file and "defaultdms" in config["obi"]:
|
||||||
default_dms=config["obi"]["defaultdms"]
|
default_dms=config["obi"]["defaultdms"]
|
||||||
except KeyError:
|
else:
|
||||||
default_dms=None
|
default_dms=None
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -72,7 +72,7 @@ cpdef int count_entries(file, bytes format):
|
|||||||
return -1
|
return -1
|
||||||
mmapped_file = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
|
mmapped_file = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
|
||||||
total_count += len(re.findall(sep, mmapped_file))
|
total_count += len(re.findall(sep, mmapped_file))
|
||||||
if format != b"ngsfilter" and format != b"tabular":
|
if format != b"ngsfilter" and format != b"tabular" and format != b"embl" and format != b"genbank":
|
||||||
total_count += 1 # adding +1 for 1st entry because separators include \n (ngsfilter and tabular already count one more because of last \n)
|
total_count += 1 # adding +1 for 1st entry because separators include \n (ngsfilter and tabular already count one more because of last \n)
|
||||||
|
|
||||||
except:
|
except:
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
major = 3
|
major = 3
|
||||||
minor = 0
|
minor = 0
|
||||||
serial= '0-beta8'
|
serial= '0-beta13'
|
||||||
|
|
||||||
version ="%d.%02d.%s" % (major,minor,serial)
|
version ="%d.%02d.%s" % (major,minor,serial)
|
||||||
|
42
src/obi_ecopcr.c
Executable file → Normal file
42
src/obi_ecopcr.c
Executable file → Normal file
@ -105,7 +105,8 @@ static int create_output_columns(Obiview_p o_view, bool kingdom_mode);
|
|||||||
* @param o_temp1_column A pointer on the output column for the temperature for the first primer.
|
* @param o_temp1_column A pointer on the output column for the temperature for the first primer.
|
||||||
* @param o_temp2_column A pointer on the output column for the temperature for the second primer.
|
* @param o_temp2_column A pointer on the output column for the temperature for the second primer.
|
||||||
*
|
*
|
||||||
* @retval 0 if the operation was successfully completed.
|
* @retval 0 if the sequence was skipped (taxid not found, warning printed).
|
||||||
|
* @retval 1 if the sequence was successfully printed to the output.
|
||||||
* @retval -1 if an error occurred.
|
* @retval -1 if an error occurred.
|
||||||
*
|
*
|
||||||
* @since July 2018
|
* @since July 2018
|
||||||
@ -366,6 +367,17 @@ static int print_seq(Obiview_p i_view, Obiview_p o_view,
|
|||||||
|
|
||||||
// TODO add check for primer longer than MAX_PAT_LEN (32)
|
// TODO add check for primer longer than MAX_PAT_LEN (32)
|
||||||
|
|
||||||
|
// Get sequence id
|
||||||
|
seq_id = obi_get_str_with_elt_idx_and_col_p_in_view(i_view, i_id_column, i_idx, 0);
|
||||||
|
|
||||||
|
// Get the taxon structure
|
||||||
|
main_taxon = obi_taxo_get_taxon_with_taxid(taxonomy, taxid);
|
||||||
|
if (main_taxon == NULL)
|
||||||
|
{
|
||||||
|
obidebug(1, "\nWarning: error reading the taxonomic information of a sequence. Seq id: %s, taxid: %d. Probably deprecated taxid. Skipping this sequence.", seq_id, taxid);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
ldelta = (pos1 <= keep_nucleotides)?pos1:keep_nucleotides;
|
ldelta = (pos1 <= keep_nucleotides)?pos1:keep_nucleotides;
|
||||||
rdelta = ((pos2+keep_nucleotides)>=seq_len)?seq_len-pos2:keep_nucleotides;
|
rdelta = ((pos2+keep_nucleotides)>=seq_len)?seq_len-pos2:keep_nucleotides;
|
||||||
|
|
||||||
@ -431,16 +443,7 @@ static int print_seq(Obiview_p i_view, Obiview_p o_view,
|
|||||||
if (isnan(tm2))
|
if (isnan(tm2))
|
||||||
tm2 = OBIFloat_NA;
|
tm2 = OBIFloat_NA;
|
||||||
|
|
||||||
// Get the taxon structure
|
|
||||||
main_taxon = obi_taxo_get_taxon_with_taxid(taxonomy, taxid);
|
|
||||||
if (main_taxon == NULL)
|
|
||||||
{
|
|
||||||
obidebug(1, "\nError reading the taxonomic information of a sequence");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write sequence id
|
// Write sequence id
|
||||||
seq_id = obi_get_str_with_elt_idx_and_col_p_in_view(i_view, i_id_column, i_idx, 0);
|
|
||||||
if (obi_set_str_with_elt_idx_and_col_p_in_view(o_view, o_id_column, o_idx, 0, seq_id) < 0)
|
if (obi_set_str_with_elt_idx_and_col_p_in_view(o_view, o_id_column, o_idx, 0, seq_id) < 0)
|
||||||
{
|
{
|
||||||
obidebug(1, "\nError writing the sequence id");
|
obidebug(1, "\nError writing the sequence id");
|
||||||
@ -629,7 +632,7 @@ static int print_seq(Obiview_p i_view, Obiview_p o_view,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -698,6 +701,7 @@ int obi_ecopcr(const char* i_dms_name,
|
|||||||
|
|
||||||
obiint_t taxid;
|
obiint_t taxid;
|
||||||
char* sequence;
|
char* sequence;
|
||||||
|
int printed;
|
||||||
|
|
||||||
SeqPtr apatseq=NULL;
|
SeqPtr apatseq=NULL;
|
||||||
int32_t o1Hits;
|
int32_t o1Hits;
|
||||||
@ -1064,7 +1068,7 @@ int obi_ecopcr(const char* i_dms_name,
|
|||||||
(!max_len || (length <= max_len)))
|
(!max_len || (length <= max_len)))
|
||||||
{
|
{
|
||||||
// Print the found amplicon
|
// Print the found amplicon
|
||||||
if (print_seq(i_view, o_view,
|
printed = print_seq(i_view, o_view,
|
||||||
i_idx, o_idx,
|
i_idx, o_idx,
|
||||||
taxonomy,
|
taxonomy,
|
||||||
sequence,
|
sequence,
|
||||||
@ -1090,12 +1094,14 @@ int obi_ecopcr(const char* i_dms_name,
|
|||||||
o_strand_column,
|
o_strand_column,
|
||||||
o_primer1_column, o_primer2_column,
|
o_primer1_column, o_primer2_column,
|
||||||
o_error1_column, o_error2_column,
|
o_error1_column, o_error2_column,
|
||||||
o_temp1_column, o_temp2_column) < 0)
|
o_temp1_column, o_temp2_column);
|
||||||
|
if (printed < 0)
|
||||||
{
|
{
|
||||||
obidebug(1, "\nError writing the ecopcr result");
|
obidebug(1, "\nError writing the ecopcr result");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
o_idx++;
|
else if (printed > 0)
|
||||||
|
o_idx++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1152,7 +1158,7 @@ int obi_ecopcr(const char* i_dms_name,
|
|||||||
(!max_len || (length <= max_len)))
|
(!max_len || (length <= max_len)))
|
||||||
{
|
{
|
||||||
// Print the found amplicon
|
// Print the found amplicon
|
||||||
if (print_seq(i_view, o_view,
|
printed = print_seq(i_view, o_view,
|
||||||
i_idx, o_idx,
|
i_idx, o_idx,
|
||||||
taxonomy,
|
taxonomy,
|
||||||
sequence,
|
sequence,
|
||||||
@ -1178,12 +1184,14 @@ int obi_ecopcr(const char* i_dms_name,
|
|||||||
o_strand_column,
|
o_strand_column,
|
||||||
o_primer1_column, o_primer2_column,
|
o_primer1_column, o_primer2_column,
|
||||||
o_error1_column, o_error2_column,
|
o_error1_column, o_error2_column,
|
||||||
o_temp1_column, o_temp2_column) < 0)
|
o_temp1_column, o_temp2_column);
|
||||||
|
if (printed < 0)
|
||||||
{
|
{
|
||||||
obidebug(1, "\nError writing the ecopcr result");
|
obidebug(1, "\nError writing the ecopcr result");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
o_idx++;
|
else if (printed > 0)
|
||||||
|
o_idx++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -81,8 +81,8 @@
|
|||||||
* @param o_dms_name The path to the output DMS.
|
* @param o_dms_name The path to the output DMS.
|
||||||
* @param o_view_name The name of the output view.
|
* @param o_view_name The name of the output view.
|
||||||
* @param o_view_comments The comments to associate with the output view.
|
* @param o_view_comments The comments to associate with the output view.
|
||||||
* @param primer1 The first primer.
|
* @param primer1 The first primer, length must be less than or equal to 32 (because of apat lib limitation).
|
||||||
* @param primer2 The second primer.
|
* @param primer2 The second primer, length must be less than or equal to 32 (because of apat lib limitation).
|
||||||
* @param error_max The maximum number of errors allowed per primer for amplification.
|
* @param error_max The maximum number of errors allowed per primer for amplification.
|
||||||
* @param min_len The minimum length of an amplicon.
|
* @param min_len The minimum length of an amplicon.
|
||||||
* @param max_len The maximum length of an amplicon.
|
* @param max_len The maximum length of an amplicon.
|
||||||
|
@ -100,35 +100,35 @@ int print_assignment_result(Obiview_p output_view, index_t line,
|
|||||||
static int create_output_columns(Obiview_p o_view)
|
static int create_output_columns(Obiview_p o_view)
|
||||||
{
|
{
|
||||||
// Score column
|
// Score column
|
||||||
if (obi_view_add_column(o_view, ECOTAG_SCORE_COLUMN_NAME, -1, NULL, OBI_FLOAT, 0, 1, NULL, false, false, false, NULL, NULL, -1, ECOTAG_SCORE_COLUMN_NAME, true) < 0)
|
if (obi_view_add_column(o_view, ECOTAG_SCORE_COLUMN_NAME, -1, NULL, OBI_FLOAT, 0, 1, NULL, false, false, false, NULL, NULL, -1, "{}", true) < 0)
|
||||||
{
|
{
|
||||||
obidebug(1, "\nError creating the column for the score in ecotag");
|
obidebug(1, "\nError creating the column for the score in ecotag");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assigned taxid column
|
// Assigned taxid column
|
||||||
if (obi_view_add_column(o_view, ECOTAG_TAXID_COLUMN_NAME, -1, NULL, OBI_INT, 0, 1, NULL, false, false, false, NULL, NULL, -1, ECOTAG_TAXID_COLUMN_NAME, true) < 0)
|
if (obi_view_add_column(o_view, ECOTAG_TAXID_COLUMN_NAME, -1, NULL, OBI_INT, 0, 1, NULL, false, false, false, NULL, NULL, -1, "{}", true) < 0)
|
||||||
{
|
{
|
||||||
obidebug(1, "\nError creating the column for the assigned taxid in ecotag");
|
obidebug(1, "\nError creating the column for the assigned taxid in ecotag");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assigned scientific name column
|
// Assigned scientific name column
|
||||||
if (obi_view_add_column(o_view, ECOTAG_NAME_COLUMN_NAME, -1, NULL, OBI_STR, 0, 1, NULL, false, false, false, NULL, NULL, -1, ECOTAG_NAME_COLUMN_NAME, true) < 0)
|
if (obi_view_add_column(o_view, ECOTAG_NAME_COLUMN_NAME, -1, NULL, OBI_STR, 0, 1, NULL, false, false, false, NULL, NULL, -1, "{}", true) < 0)
|
||||||
{
|
{
|
||||||
obidebug(1, "\nError creating the column for the assigned scientific name in ecotag");
|
obidebug(1, "\nError creating the column for the assigned scientific name in ecotag");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assignement status column
|
// Assignement status column
|
||||||
if (obi_view_add_column(o_view, ECOTAG_STATUS_COLUMN_NAME, -1, NULL, OBI_BOOL, 0, 1, NULL, false, false, false, NULL, NULL, -1, ECOTAG_STATUS_COLUMN_NAME, true) < 0)
|
if (obi_view_add_column(o_view, ECOTAG_STATUS_COLUMN_NAME, -1, NULL, OBI_BOOL, 0, 1, NULL, false, false, false, NULL, NULL, -1, "{}", true) < 0)
|
||||||
{
|
{
|
||||||
obidebug(1, "\nError creating the column for the assignment status in ecotag");
|
obidebug(1, "\nError creating the column for the assignment status in ecotag");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Column for array of best match ids
|
// Column for array of best match ids
|
||||||
if (obi_view_add_column(o_view, ECOTAG_BEST_MATCH_IDS_COLUMN_NAME, -1, NULL, OBI_STR, 0, 1, NULL, false, true, false, NULL, NULL, -1, ECOTAG_BEST_MATCH_IDS_COLUMN_NAME, true) < 0)
|
if (obi_view_add_column(o_view, ECOTAG_BEST_MATCH_IDS_COLUMN_NAME, -1, NULL, OBI_STR, 0, 1, NULL, false, true, false, NULL, NULL, -1, "{}", true) < 0)
|
||||||
{
|
{
|
||||||
obidebug(1, "\nError creating the column for the array of ids of the best match in ecotag");
|
obidebug(1, "\nError creating the column for the array of ids of the best match in ecotag");
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -1407,7 +1407,7 @@ static char* view_check_qual_match_seqs(Obiview_p view)
|
|||||||
// Test that the lengths of the quality and the sequence are equal
|
// Test that the lengths of the quality and the sequence are equal
|
||||||
if ((size_t)qual_len != strlen(seq))
|
if ((size_t)qual_len != strlen(seq))
|
||||||
{
|
{
|
||||||
obidebug(1, "\nError checking the predicate for view %s: The sequences and sequence quality arrays match.", (view->infos)->name);
|
obidebug(1, "\nError checking the predicate for view %s: The sequences and sequence quality arrays match (index %lld, seq=%s, quality length = %d).", (view->infos)->name, j, seq, qual_len);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2380,11 +2380,12 @@ int obi_view_add_column(Obiview_p view,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int obi_view_delete_column(Obiview_p view, const char* column_name)
|
int obi_view_delete_column(Obiview_p view, const char* column_name, bool delete_file)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
bool found;
|
bool found;
|
||||||
OBIDMS_column_p column;
|
OBIDMS_column_p column;
|
||||||
|
char* col_to_delete_path;
|
||||||
|
|
||||||
// Check that the view is not read-only
|
// Check that the view is not read-only
|
||||||
if (view->read_only)
|
if (view->read_only)
|
||||||
@ -2406,8 +2407,31 @@ int obi_view_delete_column(Obiview_p view, const char* column_name)
|
|||||||
obidebug(1, "\nError getting a column from the linked list of column pointers of a view when deleting a column from a view");
|
obidebug(1, "\nError getting a column from the linked list of column pointers of a view when deleting a column from a view");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
// Keep column path if need to delete the file
|
||||||
|
if (delete_file)
|
||||||
|
{
|
||||||
|
col_to_delete_path = obi_column_full_path(view->dms, column->header->name, column->header->version);
|
||||||
|
if (col_to_delete_path == NULL)
|
||||||
|
{
|
||||||
|
obidebug(1, "\nError getting a column file path when deleting a column");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
obi_close_column(column);
|
obi_close_column(column);
|
||||||
|
|
||||||
|
// Delete file if needed
|
||||||
|
if (delete_file)
|
||||||
|
{
|
||||||
|
if (remove(col_to_delete_path) < 0)
|
||||||
|
{
|
||||||
|
obi_set_errno(OBICOL_UNKNOWN_ERROR);
|
||||||
|
obidebug(1, "\nError deleting a column file when deleting unfinished columns: file %s", col_to_delete_path);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
free(col_to_delete_path);
|
||||||
|
}
|
||||||
|
|
||||||
view->columns = ll_delete(view->columns, i);
|
view->columns = ll_delete(view->columns, i);
|
||||||
// TODO how do we check for error? NULL can be empty list
|
// TODO how do we check for error? NULL can be empty list
|
||||||
found = true;
|
found = true;
|
||||||
@ -3047,7 +3071,7 @@ int obi_create_auto_id_column(Obiview_p view, const char* prefix)
|
|||||||
// Delete old ID column if it exists
|
// Delete old ID column if it exists
|
||||||
if (obi_view_get_column(view, ID_COLUMN) != NULL)
|
if (obi_view_get_column(view, ID_COLUMN) != NULL)
|
||||||
{
|
{
|
||||||
if (obi_view_delete_column(view, ID_COLUMN) < 0)
|
if (obi_view_delete_column(view, ID_COLUMN, false) < 0)
|
||||||
{
|
{
|
||||||
obidebug(1, "Error deleting an ID column to replace it in a view");
|
obidebug(1, "Error deleting an ID column to replace it in a view");
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -440,6 +440,7 @@ int obi_view_add_column(Obiview_p view,
|
|||||||
*
|
*
|
||||||
* @param view A pointer on the view.
|
* @param view A pointer on the view.
|
||||||
* @param column_name The name of the column that should be deleted from the view.
|
* @param column_name The name of the column that should be deleted from the view.
|
||||||
|
* @param delete_file Whether the column file should be deleted. Use carefully re: dependencies.
|
||||||
*
|
*
|
||||||
* @returns A value indicating the success of the operation.
|
* @returns A value indicating the success of the operation.
|
||||||
* @retval 0 if the operation was successfully completed.
|
* @retval 0 if the operation was successfully completed.
|
||||||
@ -448,7 +449,7 @@ int obi_view_add_column(Obiview_p view,
|
|||||||
* @since February 2016
|
* @since February 2016
|
||||||
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
||||||
*/
|
*/
|
||||||
int obi_view_delete_column(Obiview_p view, const char* column_name);
|
int obi_view_delete_column(Obiview_p view, const char* column_name, bool delete_file);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user