* Allocate storage for rows in existing * result structure. */
| 149 | * result structure. |
| 150 | */ |
| 151 | int db_allocate_rows(db_res_t* _res, const unsigned int rows) |
| 152 | { |
| 153 | unsigned int i; |
| 154 | |
| 155 | RES_ROWS(_res) = (struct db_row*)pkg_malloc |
| 156 | (rows * (sizeof(db_row_t) + sizeof(db_val_t) * RES_COL_N(_res)) ); |
| 157 | if (!RES_ROWS(_res)) { |
| 158 | LM_ERR("no memory left\n"); |
| 159 | return -1; |
| 160 | } |
| 161 | memset( RES_ROWS(_res), 0 , |
| 162 | rows * (sizeof(db_row_t) + sizeof(db_val_t) * RES_COL_N(_res))); |
| 163 | |
| 164 | LM_DBG("allocate %d bytes for result rows and values at %p\n", |
| 165 | (int)(rows * (sizeof(db_row_t) + sizeof(db_val_t) * RES_COL_N(_res))), |
| 166 | RES_ROWS(_res)); |
| 167 | |
| 168 | for( i=0 ; i<rows ; i++ ) |
| 169 | /* the values of the row i */ |
| 170 | ROW_VALUES( &(RES_ROWS(_res)[i]) ) = |
| 171 | ((db_val_t*)(void *)(RES_ROWS(_res)+rows)) + RES_COL_N(_res)*i; |
| 172 | |
| 173 | return 0; |
| 174 | } |
| 175 | |
| 176 | /* |
| 177 | * Extend storage for rows in existing result structure. |
no outgoing calls
no test coverage detected