]> git.sesse.net Git - vlc/commitdiff
SQL/SQLite: Fix GetColumn functions in SQLite and implement a GetColumnSize function
authorSrikanth Raju <srikiraju@gmail.com>
Mon, 30 Nov 2009 08:58:00 +0000 (14:28 +0530)
committerJean-Baptiste Kempf <jb@videolan.org>
Fri, 4 Dec 2009 11:50:15 +0000 (12:50 +0100)
Add a GetColumnSize function in the SQL API.

Signed-off-by: Jean-Baptiste Kempf <jb@videolan.org>
include/vlc_sql.h
modules/misc/sqlite.c

index ad325f5d14810fb12823a4af2acb3c4ad8ac212e..ef4ebca93b9592da6ce94756adbe5020963338df 100644 (file)
@@ -136,6 +136,9 @@ struct sql_t
     /** Get the data from a specified column */
     int (*pf_getcolumn) ( sql_t* p_sql, sql_stmt_t* p_stmt, int i_col,
                           int type, sql_value_t *p_res );
+
+    /** Get column size of a specified column */
+    int (*pf_getcolumnsize) ( sql_t* p_sql, sql_stmt_t* p_stmt, int i_col );
 };
 
 /*****************************************************************************
@@ -557,6 +560,19 @@ static inline int sql_GetColumnBlob( sql_t* p_sql, sql_stmt_t* p_stmt,
     return i_ret;
 }
 
+/**
+ * @brief Get the size of the column in bytes
+ * @param p_sql The SQL object
+ * @param p_stmt The sql statement object
+ * @param i_col The column
+ * @return Size of the column in bytes, excluding the zero terminator
+ */
+static inline int sql_GetColumnSize( sql_t* p_sql, sql_stmt_t* p_stmt,
+        int i_col )
+{
+    return p_sql->pf_getcolumnsize( p_sql, p_stmt, i_col );
+}
+
 # ifdef __cplusplus
 }
 # endif /* C++ extern "C" */
index 7eb182fabd8c52448d8769a32eae47ec8b9fd9c4..6b47b1c5ba50d78d585f0d4c30c2e4bdefccf0af 100644 (file)
@@ -104,6 +104,9 @@ static int GetColumnTypeFromStatement( sql_t* p_sql,
                                        sql_stmt_t* p_stmt,
                                        int i_col,
                                        int* pi_type );
+static int GetColumnSize( sql_t* p_sql,
+                          sql_stmt_t* p_stmt,
+                          int i_col );
 
 /*****************************************************************************
  * Module description
@@ -160,6 +163,7 @@ static int load( vlc_object_t *p_this )
     p_sql->pf_finalize = StatementFinalize;
     p_sql->pf_gettype = GetColumnTypeFromStatement;
     p_sql->pf_getcolumn = GetColumnFromStatement;
+    p_sql->pf_getcolumnsize = GetColumnSize;
 
     return VLC_SUCCESS;
 }
@@ -657,6 +661,9 @@ static int GetColumnFromStatement( sql_t* p_sql, sql_stmt_t* p_stmt, int i_col,
     assert( p_stmt->p_sqlitestmt );
     int i_ret = VLC_SUCCESS;
     vlc_mutex_lock( &p_sql->p_sys->lock );
+    const unsigned char* psz;
+    const void* ptr;
+    int size;
     switch( type )
     {
         case SQL_INT:
@@ -666,10 +673,22 @@ static int GetColumnFromStatement( sql_t* p_sql, sql_stmt_t* p_stmt, int i_col,
             p_res->value.dbl = sqlite3_column_double( p_stmt->p_sqlitestmt, i_col );
             break;
         case SQL_TEXT:
-            p_res->value.psz = sqlite3_column_text( p_stmt->p_sqlitestmt, i_col );
+            psz = sqlite3_column_text( p_stmt->p_sqlitestmt, i_col );
+            if( psz )
+                p_res->value.psz = strdup( (const char* ) psz );
             break;
         case SQL_BLOB:
-            p_res->value.ptr = sqlite3_column_blob( p_stmt->p_sqlitestmt, i_col );
+            ptr = sqlite3_column_blob( p_stmt->p_sqlitestmt, i_col );
+            size = sqlite3_column_bytes( p_stmt->p_sqlitestmt, i_col );
+            if( ptr )
+            {
+                p_res->value.ptr = malloc( size );
+                p_res->length = size;
+                if( p_res->value.ptr )
+                    memcpy( p_res->value.ptr, ptr, size );
+                else
+                    i_ret = VLC_ENOMEM;
+            }
             break;
         case SQL_NULL:
         default:
@@ -720,3 +739,17 @@ static int GetColumnTypeFromStatement( sql_t* p_sql, sql_stmt_t* p_stmt, int i_c
     vlc_mutex_unlock( &p_sql->p_sys->lock );
     return i_ret;
 }
+
+/**
+ * @brief Get the size of the column in bytes
+ * @param p_sql The SQL object
+ * @param p_stmt The sql statement object
+ * @param i_col The column
+ * @return Size of the column in bytes, undefined for invalid columns
+ */
+static int GetColumnSize( sql_t* p_sql, sql_stmt_t* p_stmt, int i_col )
+{
+    assert( p_sql->p_sys->db );
+    assert( p_stmt->p_sqlitestmt );
+    return sqlite3_column_bytes( p_stmt->p_sqlitestmt, i_col );
+}