Celia Shahnaz

74 papers C 21Misc 2Journal 23Unranked 28
YearRankTypeTitle / Venue / Authors
2025 J jnl
IEEE Access
Faiyaz Fahim, Celia Shahnaz
2024 C conf
TENCON
Angkon Deb, Asaduzzaman, Rudra Roy, Asif Islam, Celia Shahnaz, Mohammad Saquib
2022 Misc conf
ICASSP
K. M. Naimul Hassan, Md. Shamiul Alam Hridoy, Naima Tasnim, Atia Faria Chowdhury, Tanvir Alam Roni, Sheikh Tabrez, Arik Subhana, Celia Shahnaz
2022 conf
EMBC
Shahed Ahmed, Md. Tariqul Islam, Soumav Biswas, Rayhan Hayther Samrat, Tafhimul Islam Akash, Arik Subhana, Celia Shahnaz
2021 J jnl
IEEE Trans. Artif. Intell.
A. F. M. Saif, Tamjid Imtiaz, Shahriar Rifat, Celia Shahnaz, Wei-Ping Zhu, M. Omair Ahmad
2021 J jnl
IEEE Access
A. F. M. Saif, Tamjid Imtiaz, Celia Shahnaz, Wei-Ping Zhu, M. Omair Ahmad
2021 J jnl
Biomed. Signal Process. Control.
Tanima Tasmin Chowdhury, Shaikh Anowarul Fattah, Celia Shahnaz
2019 C conf
TENCON
Lamiya Rahman, Jannatul Adan, Quazi Mutasim Billah, Md. Kamrul Islam, A. H. M. Mostafa Kamal, Sazzad Hossain, Celia Shahnaz, Arik Subhana
2019 J jnl
IEEE Access
A. F. M. Saif, Celia Shahnaz, Wei-Ping Zhu, M. Omair Ahmad
2019 C conf
TENCON
Shamima Hossain, Bidya Debnath, Adrita Anika, Md. Junaed-Al-Hossain, Sabyasachi Biswas, Celia Shahnaz
2019 C conf
TENCON
Quazi Mutasim Billah, Lamiya Rahman, Jannatul Adan, A. H. M. Mostafa Kamal, Md. Kamrul Islam, Celia Shahnaz, Arik Subhana
2019 conf
GHTC
Abdul Muntakim Rafi, Nowshin Nawal, Nur Sultan Nazar Bayev, Lusain Nima, Celia Shahnaz, Shaikh Anowarul Fattah
2019 conf
GHTC
Md. Messal Monem Miah, Rafat Jamal Tazim, Fatema Tuj Johora, Md. Ibrahim Al Imran, Sanzida Sayedul Surma, Fariba Islam, Rashid Shabab, Celia Shahnaz, Arik Subhana
2019 conf
GHTC
Tasfin Mahmud, Arik Subhana, Celia Shahnaz, Mehedi Hossen Limon, Sabbir Ahmed, Mohammad Zunaed Rafi, Borhan Ahamed, Shadman Shahriar Nitol, Md. Yeasin Mia, Rafat Emtiaz Choudhury, Adnan Sakib
2019 J jnl
Medical Biol. Eng. Comput.
Mohammad Tariqul Islam, Sk. Tanvir Ahmed, Celia Shahnaz, Shaikh Anowarul Fattah
2018 J jnl
CoRR
Md Tauhidul Islam, Celia Shahnaz, Wei-Ping Zhu, M. Omair Ahmad
2018 C conf
TENCON
Parama Sridevi, Pritam Kundu, Tahmida Islam, Celia Shahnaz, Shaikh Anowarul Fattah
2018 C conf
TENCON
Bidya Debnath, Adrita Anika, Mohammed Abid Abrar, Tanney Chowdhury, Rajat Chakraborty, Asir Intisar Khan, Shaikh Anowarul Fattah, Celia Shahnaz
2018 C conf
TENCON
Rafat Jamal Tazim, Md. Messal Monem Miah, Sanzida Sayedul Surma, Mohammad Tariqul Islam, Celia Shahnaz, Shaikh Anowarul Fattah
2018 C conf
TENCON
Biswajit Saha, Shakil Khan, Celia Shahnaz, Shaikh Anowarul Fattah, Mohammad Tariqul Islam, Asir Intisar Khan
2018 J jnl
CoRR
Md Tauhidul Islam, Celia Shahnaz
2018 J jnl
CoRR
Md Tauhidul Islam, Celia Shahnaz, Wei-Ping Zhu, M. Omair Ahmad
2018 J jnl
CoRR
Md Tauhidul Islam, Celia Shahnaz, Wei-Ping Zhu, M. Omair Ahmad
2018 C conf
TENCON
Shadman Shahriar, Ashraf Siddiquee, Tanveerul Islam, Abesh Ghosh, Rajat Chakraborty, Asir Intisar Khan, Celia Shahnaz, Shaikh Anowarul Fattah
2018 J jnl
CoRR
Md Tauhidul Islam, Udoy Saha, K. T. Shahid, Ahmed Bin Hussain, Celia Shahnaz
2018 J jnl
CoRR
Md Tauhidul Islam, Asaduzzaman, Celia Shahnaz, Wei-Ping Zhu, M. Omair Ahmad
2018 C conf
IAS
Md Toaha Anas, Shah Akibur Rahman, Celia Shahnaz, Aminul Hoque
2018 conf
GHTC
Shahruk Hossain, Abdullah Abyad Raied, Asifur Rahman, Zaowad Rahabin Abdullah, Dipanjan Adhikary, Ahsan Rabby Khan, Arnab Bhattacharjee, Celia Shahnaz, Shaikh Anowarul Fattah
2017 J jnl
Biomed. Signal Process. Control.
Mohammad Tariqul Islam, Ishmam Zabir, Sk. Tanvir Ahamed, Md. Tahmid Yasar, Celia Shahnaz, Shaikh Anowarul Fattah
2017 J jnl
Circuits Syst. Signal Process.
Shamima Najnin, Celia Shahnaz
2017 J jnl
CoRR
Tahsin Reasat, Celia Shahnaz
2017 conf
MWSCAS
M. Imtiaz Rashid, Mohd. Hasan, N. Yeasmin, Celia Shahnaz, Shaikh Anowarul Fattah, Wei-Ping Zhu, M. Omair Ahmed
2017 C conf
ISTAS
Celia Shahnaz, Ahmed Maksud, Shaikh Anowarul Fattah, Sayeed Shafayet Chowdhury
2017 J jnl
Speech Commun.
Md Tauhidul Islam, Celia Shahnaz, Wei-Ping Zhu, M. Omair Ahmad
2017 conf
GHTC
Tamim Ahmed, Khandker Sadia Rahman, Sk Subrina Shawlin, Mohammad Hasan, Arnab Bhattacharjee, Shaikh Anowarul Fattah, Celia Shahnaz
2017 conf
MWSCAS
Md Awsafur Rahman, M. T. Haque, Celia Shahnaz, Shaikh Anowarul Fattah, Wei-Ping Zhu, M. Omair Ahmed
2017 C conf
ISTAS
Celia Shahnaz, Md. Julker Neyen Sampad, Dimitri Adhikary, Sajid Mahfuz Uchayash, Marjana Mahdia, Sayeed Shafayet Chowdhury, Shaikh Anowarul Fattah
2017 conf
GHTC
Shaikh Anowarul Fattah, Nael Mizanur Rahman, Ahmed Maksud, Shariful Islam Foysal, Rakibul Islam Chowdhury, Sayeed Shafayet Chowdhury, Celia Shahnaz
2017 conf
MWSCAS
Celia Shahnaz, Tanmoy Sarker, Sudip Paul, M. Omair Ahmad, Wei-Ping Zhu
2017 conf
GHTC
Shaikh Anowarul Fattah, Mohammad Mahinur Rahman, Nafis Mustakin, Mohammad Tariqul Islam, Asir Intisar Khan, Celia Shahnaz
2016 conf
GHTC
Shaikh Anowarul Fattah, Mohammad Zakaria Haider, Dhiman Chowdhury, Mrinmoy Sarkar, Rakibul Islam Chowdhury, Md Shariful Islam, Rezaul Karim, Adibuzzaman Rahi, Celia Shahnaz
2015 J jnl
Int. J. Speech Technol.
Shamima Najnin, Celia Shahnaz
2015 conf
DSP
Tonmoy Ghosh, Shaikh Anowarul Fattah, Syed Khairul Bashar, Celia Shahnaz, Khan A. Wahid, Wei-Ping Zhu, M. Omair Ahmad
2015 conf
DSP
Celia Shahnaz, Sharifa Sultana, Shaikh Anowarul Fattah, R. H. Md. Rafi, Istak Ahmmed, Wei-Ping Zhu, M. Omair Ahmad
2015 C conf
ISCAS
Celia Shahnaz, R. H. Md. Rafi, Shaikh Anowarul Fattah, Wei-Ping Zhu, M. Omair Ahmad
2015 J jnl
IEEE ACM Trans. Audio Speech Lang. Process.
Md Tauhidul Islam, Celia Shahnaz, Wei-Ping Zhu, M. Omair Ahmad
2014 conf
MWSCAS
Celia Shahnaz, Sharifa Sultana
2014 conf
ISSPIT
Tonmoy Ghosh, Syed Khairul Bashar, Shaikh Anowarul Fattah, Celia Shahnaz, Khan A. Wahid
2014 conf
MWSCAS
Shaikh Anowarul Fattah, M. M. I. Ullah, M. Ahmed, Istak Ahmmed, Celia Shahnaz
2014 conf
EMBC
Tonmoy Ghosh, Shaikh Anowarul Fattah, Celia Shahnaz, Khan A. Wahid
2014 C conf
ISCAS
Sharifa Sultana, Celia Shahnaz, Shaikh Anowarul Fattah, Istak Ahmmed, Wei-Ping Zhu, M. Omair Ahmad
2014 conf
MWSCAS
Md. T. Islam, Celia Shahnaz, Shaikh Anowarul Fattah
2013 C conf
ISCAS
Celia Shahnaz, Shamima Najnin, Shaikh Anowarul Fattah, Wei-Ping Zhu, M. Omair Ahmad
2013 J jnl
EURASIP J. Audio Speech Music. Process.
Tahsina Farah Sanam, Celia Shahnaz
2013 C conf
ISCAS
Shaikh Anowarul Fattah, Abul Barkat Mollah Sayeed Ud Doulah, Md. Asif Iqbal, Celia Shahnaz, Wei-Ping Zhu, M. Omair Ahmad
2013 J jnl
Digit. Signal Process.
Tahsina Farah Sanam, Celia Shahnaz
2012 J jnl
Biomed. Signal Process. Control.
Md. Ashfanoor Kabir, Celia Shahnaz
2012 C conf
ISCAS
Celia Shahnaz, Shaikh Anowarul Fattah, Upal Mahbub, Wei-Ping Zhu, M. Omair Ahmad
2012 J jnl
Int. J. Speech Technol.
Tahsina Farah Sanam, Celia Shahnaz
2012 J jnl
IEEE Trans. Speech Audio Process.
Celia Shahnaz, Wei-Ping Zhu, M. Omair Ahmad
2010 conf
ISSPIT
Syed Bahauddin Alam, Md. Nazmus Sakib, A. B. M. Rafi Sazzad, Celia Shahnaz, Shaikh Anowarul Fattah
2010 conf
ISSPIT
A. B. M. Rafi Sazzad, Syed Bahauddin Alam, Md. Nazmus Sakib, Celia Shahnaz, Shaikh Anowarul Fattah
2010 conf
EMS
Md. Nazmus Sakib, A. B. M. Rafi Sazzad, Syed Bahauddin Alam, Celia Shahnaz, Shaikh Anowarul Fattah
2009 C conf
ISCAS
Celia Shahnaz, Wei-Ping Zhu, M. Omair Ahmad
2008 Misc conf
ICASSP
Celia Shahnaz, Wei-Ping Zhu, M. Omair Ahmad
2008 C conf
ISCAS
Celia Shahnaz, Wei-Ping Zhu, M. Omair Ahmad
2007 conf
ICASSP (4)
Celia Shahnaz, Wei-Ping Zhu, M. Omair Ahmad
2007 C conf
ISCAS
Celia Shahnaz, Wei-Ping Zhu, M. Omair Ahmad
2006 conf
CCECE
Celia Shahnaz, Wei-Ping Zhu, M. Omair Ahmad
2006 C conf
ISCAS
Celia Shahnaz, Wei-Ping Zhu, M. Omair Ahmad
2005 conf
ISCAS (4)
Celia Shahnaz, Wei-Ping Zhu, M. Omair Ahmad
2005 conf
ICASSP (1)
Celia Shahnaz, Wei-Ping Zhu, M. Omair Ahmad
2004 conf
EUSIPCO
Celia Shahnaz, Md. Rokanuzzaman, Md. M. Adnan, B. P. Shrestha, Shaikh Anowarul Fattah
2003 conf
ISCAS (2)
Md. Kamrul Hasan, Celia Shahnaz, S. A. Fatath
redb/extractors/database_exporters.py
← Index redb/extractors/database_exporters.py python
from abc import ABC, abstractmethod
from datetime import datetime, timezone
from dataclasses import asdict
import hashlib
import json
import inspect
from typing import Any, Dict, List, Union
from redb import settings
import traceback
from contextlib import contextmanager

class DatabaseExporter(ABC):
    @abstractmethod
    def export(self, data: Any, **kwargs) -> bool:
        """Export data to the database"""
        pass

class ElasticsearchExporter(DatabaseExporter):
    def __init__(self, logger: Any, index_prefix: str):
        self.client = settings.get_elasticsearch_client()
        self.index_prefix = index_prefix
        self.log = logger

    def export(self, data: Any, **kwargs) -> bool:
        self.log.debug(inspect.currentframe().f_code.co_name)
        if not isinstance(data, list):
            data = [data]
            
        now_t = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S")
        index = kwargs.get('index')
        tag = kwargs.get('tag')
        hashes = kwargs.get('hashes')
        
        for dataclass_ in data:
            try:
                # Convert dataclass to dict and filter out None values
                document = {k: v for k, v in asdict(dataclass_).items() if v is not None}
                
                if tag:
                    document["tag"] = tag
                document |= hashes
                document["timestamp_utc"] = now_t
                document["known_benign"] = kwargs.get('known_benign', False)
                document["known_malicious"] = kwargs.get('known_malicious', False)

                if "_id" in document:
                    tmp_id = document.pop("_id") + document["sha256"]
                    _id = hashlib.sha256(tmp_id.encode()).hexdigest()
                else:
                    _id = document["sha256"]

                doc_dump = json.dumps(document)
                self.client.index(index=index, id=_id, document=doc_dump)
                
            except Exception as e:
                self.log.error(f"Failed to export to Elasticsearch: {e}")
                return False
                
        return True

class PrintExporter(DatabaseExporter):
    """Exporter that prints results instead of uploading to database (for dry-run mode)"""
    def __init__(self, logger: Any, index_prefix: str):
        self.index_prefix = index_prefix
        self.log = logger
        self.log.debug(f"PrintExporter initialized with index_prefix: {index_prefix}")

    def export(self, data: Any, **kwargs) -> bool:
        try:
            import json
            from dataclasses import asdict, is_dataclass

            self.log.debug(f"PrintExporter.export called with data type: {type(data)}")

            if data is None:
                self.log.debug("PrintExporter.export: data is None, returning True")
                return True

            if not isinstance(data, list):
                data = [data]

            for i, item in enumerate(data):
                if is_dataclass(item) and not isinstance(item, type):
                    # Convert dataclass instance to dict
                    try:
                        item_dict = asdict(item)
                        print(json.dumps(item_dict, indent=2, default=str))
                    except Exception as e:
                        self.log.error(f"PrintExporter.export: Error converting dataclass: {e}")
                        print(str(item))
                elif isinstance(item, dict):
                    # Already a dict, print as JSON
                    print(json.dumps(item, indent=2, default=str))
                else:
                    # Fallback for other types
                    print(json.dumps(item, indent=2, default=str) if not isinstance(item, str) else item)

            self.log.debug("PrintExporter.export: completed successfully")
            return True
        except Exception as e:
            self.log.error(f"PrintExporter.export: Failed to print data: {e}")
            return False


class ClickHouseExporter(DatabaseExporter):
    def __init__(self, logger: Any, index_prefix: str, client=None):
        self.index_prefix = index_prefix
        self.log = logger
        self.client = client

    @contextmanager
    def clickhouse_connection(self):
        client = settings.create_clickhouse_client()
        try:
            yield client
        finally:
            try:
                client.close()
            except:
                pass
    # def export(self, data: Any, **kwargs) -> bool:
    #     try:
    #         # Handle multi-table export case
    #         # if isinstance(data, dict) and 'multi_table' in data:
    #         #     for table_name, table_data in data.items():
    #         #         if table_name != 'multi_table' and isinstance(table_data, dict) and 'table' in table_data:
    #         #             self.log.debug(f"Exporting to table: {table_data['table']}")
    #         #             self.log.debug(f"Column names: {table_data['column_names']}")
    #         #             self.log.debug(f"Column types: {table_data['column_type_names']}")
    #         #             self.log.debug(f"Data sample: {table_data['data'][0] if table_data['data'] else 'No data'}")
                        
    #         #             try:
    #         #                 result = self.client.insert(
    #         #                     table_data['table'],
    #         #                     table_data['data'],
    #         #                     column_names=table_data['column_names'],
    #         #                     column_type_names=table_data['column_type_names']
    #         #                 )
    #         #                 if not result:
    #         #                     self.log.error(f"Failed to insert into table {table_data['table']}")
    #         #                     return False
    #         #             except Exception as e:
    #         #                 self.log.error(f"Error inserting into table {table_data['table']}: {e}")
    #         #                 self.log.error(f"Data that caused error: {table_data['data']}")
    #         #                 return False
    #         #     return True

    #         if isinstance(data, dict) and 'multi_table' in data:
    #             for table_name, table_data in data.items():
    #                 if table_name != 'multi_table' and isinstance(table_data, dict) and 'table' in table_data:
    #                     self.log.debug(f"Exporting to table: {table_data['table']}")
                        
    #                     # Validate each row before insert
    #                     for row in table_data['data']:
    #                         for val, col_name, col_type in zip(row, table_data['column_names'], 
    #                                                         table_data['column_type_names']):
    #                             # Check for empty strings
    #                             if isinstance(val, str) and not val:
    #                                 self.log.error(f"Empty string found for column {col_name}")
    #                                 raise ValueError(f"Empty string not allowed for column {col_name}")
                                
    #                             # Log all string values for certificate_serial_number
    #                             if col_name == 'certificate_serial_number':
    #                                 self.log.debug(f"Serial number value: '{val}', type: {type(val)}, "
    #                                             f"repr: {repr(val)}")
                        
    #                     try:
    #                         result = self.client.insert(
    #                             table_data['table'],
    #                             table_data['data'],
    #                             column_names=table_data['column_names'],
    #                             column_type_names=table_data['column_type_names']
    #                         )
    #                         if not result:
    #                             self.log.error(f"Failed to insert into table {table_data['table']}")
    #                             return False
    #                     except Exception as e:
    #                         self.log.error(f"Error inserting into table {table_data['table']}: {e}")
    #                         self.log.error(f"Data that caused error: {table_data['data']}")
    #                         return False
    #             return True

    #         # Handle single table case
    #         table = kwargs.get('table')
    #         if not table:
    #             raise ValueError("Table name must be provided for ClickHouse export")
            
    #         # Unpack the tuple returned by prepare_export_data
    #         if isinstance(data, tuple):
    #             if len(data) != 3:
    #                 raise ValueError("Data tuple must contain exactly 3 elements: (data, column_names, column_type_names)")
    #             insert_data, column_names, column_type_names = data
    #         else:
    #             # Use provided column names and types from kwargs
    #             insert_data = data
    #             column_names = kwargs.get('column_names')
    #             column_type_names = kwargs.get('column_type_names')
                
    #         if not (column_names and column_type_names):
    #             raise ValueError("column_names and column_type_names must be provided")

    #         # Ensure data is in list format for batch insert
    #         if not isinstance(insert_data, list):
    #             insert_data = [insert_data]
                
    #         self.client.insert(
    #             table,
    #             insert_data,
    #             column_names=column_names,
    #             column_type_names=column_type_names
    #         )
    #         return True
            
    #     except Exception as e:
    #         self.log.error(f"Failed to export to ClickHouse: {e}")
    #         return False

    def get_client(self):
        """Get existing client or create new one if needed"""
        if self.client:
            return self.client
        try:
            return settings.create_clickhouse_client() 
        except Exception as e:
            self.log.error(f"Failed to create ClickHouse client: {e}")
            return None
            
    # WORKING SIMPLE VERSION
    def export(self, data: Any, **kwargs) -> bool:
        try:
            # # Handle multi-table export case
            # # if isinstance(data, dict) and 'multi_table' in data:
            # #     for table_data in data.values():
            # #         if isinstance(table_data, dict) and 'table' in table_data:
            # #             result = self.client.insert(
            # #                 table_data['table'],
            # #                 table_data['data'],
            # #                 column_names=table_data['column_names'],
            # #                 column_type_names=table_data['column_type_names']
            # #             )
            # #             if not result:  # If any insert fails, return False
            # #                 return False
            # #     return True
            # if isinstance(data, dict) and 'multi_table' in data:
            #     for key, table_data in data.items():
            #         if key != 'multi_table' and isinstance(table_data, dict) and 'table' in table_data:
            #             # Add type hints
            #             typed_data = []
            #             for row in table_data['data']:
            #                 typed_row = []
            #                 for val, type_name in zip(row, table_data['column_type_names']):
            #                     if isinstance(val, str) and not val:
            #                         val = 'UNKNOWN'
            #                     if type_name == 'String' or 'LowCardinality(String)' in type_name:
            #                         val = str(val) if val is not None else 'UNKNOWN'
            #                     typed_row.append(val)
            #                 typed_data.append(typed_row)
                        
            #             table_data['data'] = typed_data
                        
            #             result = self.client.insert(
            #                 table_data['table'],
            #                 table_data['data'],
            #                 column_names=table_data['column_names'],
            #                 column_type_names=table_data['column_type_names'],
            #                 settings={'input_format_values_interpret_expressions': 0}  # Disable type inference
            #             )
            #             if not result:
            #                 return False
            #         return True

            # Get a new client connection for this export operation
            with self.clickhouse_connection() as client:
                if not client:
                    return False

                # LAST WORKING VERSION
                if isinstance(data, dict) and 'multi_table' in data:
                    for key, table_data in data.items():
                        if key != 'multi_table' and isinstance(table_data, dict) and 'table' in table_data:
                            # Debug logging
                            self.log.debug(f"Processing table: {table_data['table']}")
                            self.log.debug(f"Column names: {table_data['column_names']}")
                            self.log.debug(f"Column types: {table_data['column_type_names']}")
                            
                            typed_data = []
                            for row_idx, row in enumerate(table_data['data']):
                                typed_row = []
                                for val_idx, (val, type_name, col_name) in enumerate(
                                    zip(row, table_data['column_type_names'], table_data['column_names'])
                                ):
                                    try:
                                        # Handle different types
                                        if val is None:
                                            if 'Nullable' in type_name:
                                                val = None  # Keep None for Nullable columns
                                            elif 'Array' in type_name:
                                                val = []
                                            elif 'Int' in type_name or 'UInt' in type_name:
                                                val = 0
                                            elif 'FixedString(16)' in type_name:
                                                val = b'\x00' * 16  # Binary FixedString
                                            elif 'String' in type_name or 'LowCardinality' in type_name:
                                                val = 'UNKNOWN'
                                            elif 'DateTime' in type_name:
                                                val = datetime.now(timezone.utc)
                                            elif 'Boolean' in type_name:
                                                val = False
                                            else:
                                                self.log.error(f"Unhandled type {type_name} for null value")
                                                val = 'UNKNOWN'
                                        
                                        # Log problematic values
                                        if isinstance(val, str) and not val.strip():
                                            self.log.warning(f"Empty string found in table {table_data['table']}, "
                                                        f"column {col_name}, row {row_idx}")
                                        
                                        # Ensure array types are always lists
                                        if 'Array' in type_name and not isinstance(val, list):
                                            val = [val]
                                        
                                        typed_row.append(val)
                                    except Exception as e:
                                        self.log.error(f"Error processing value in table {table_data['table']}, "
                                                    f"column {col_name} ({type_name}), "
                                                    f"row {row_idx}, value: {repr(val)}")
                                        raise
                                        
                                typed_data.append(typed_row)
                            
                            table_data['data'] = typed_data

                            # Skip insert if there is nothing to insert
                            if not typed_data:
                                self.log.debug(f"No data to insert for table {table_data['table']}, skipping.")
                                continue

                            # Debug log the first row of data
                            self.log.debug(f"Sample row for {table_data['table']}: {typed_data[0]}")

                            result = client.insert(
                                table_data['table'],
                                table_data['data'],
                                column_names=table_data['column_names'],
                                column_type_names=table_data['column_type_names'],
                                settings={'input_format_values_interpret_expressions': 0}
                            )
                            if not result:
                                self.log.error(f"Insert failed for table {table_data['table']}")
                                return False
                    return True

                # Handle single table case
                table = kwargs.get('table')
                if not table:
                    raise ValueError("Table name must be provided for ClickHouse export")
                
                # Unpack the tuple returned by prepare_export_data
                if isinstance(data, tuple):
                    if len(data) != 3:
                        raise ValueError("Data tuple must contain exactly 3 elements: (data, column_names, column_type_names)")
                    insert_data, column_names, column_type_names = data
                else:
                    # Use provided column names and types from kwargs
                    insert_data = data
                    column_names = kwargs.get('column_names')
                    column_type_names = kwargs.get('column_type_names')
                    
                if not (column_names and column_type_names):
                    raise ValueError("column_names and column_type_names must be provided")

                # Ensure data is in list format for batch insert
                if not isinstance(insert_data, list):
                    insert_data = [insert_data]

                # Skip insert if there is nothing to insert
                if not insert_data:
                    self.log.debug(f"No data to insert for table {table}, skipping.")
                    return True

                client.insert(
                    table,
                    insert_data,
                    column_names=column_names,
                    column_type_names=column_type_names,
                    settings={'input_format_values_interpret_expressions': 0}  # Disable type inference
                )
                return True

        except TypeError as e:
            # Get the actual value causing the error from the exception traceback
            import sys
            exc_type, exc_value, exc_traceback = sys.exc_info()
            
            # Walk through the traceback to find the frame with the problematic value
            current = exc_traceback
            while current:
                if 'string.py' in current.tb_frame.f_code.co_filename and '_data_size' in current.tb_frame.f_code.co_name:
                    locals_dict = current.tb_frame.f_locals
                    problematic_value = locals_dict.get('x')
                    self.log.error(f"TypeError with value: {problematic_value} (type: {type(problematic_value)})")
                    self.log.error(f"Full locals at error: {locals_dict}")
                    break
                current = current.tb_next
            
            self.log.error(f"Failed to export to ClickHouse: {e}")
            self.log.error("Full traceback:")
            self.log.error(traceback.format_exc())
            return False
        except Exception as e:
            self.log.error(f"Failed to export to ClickHouse: {e}")
            self.log.error(traceback.format_exc())
            return False
        finally:
            # Only close if we created a new client
            if client and client != self.client:
                # Close the client connection
                try:
                    client.close()
                except:
                    pass