@@ -21,7 +21,7 @@ xdb_row_vdata_get (xdb_tblm_t *pTblm, void *pRow)
21
21
{
22
22
uint8_t type ;
23
23
xdb_rowid vid = xdb_row_vdata_info (pTblm -> row_size , pRow , & type );
24
- return vid ? xdb_vdata_get (pTblm -> pVdatm , type , vid ) : NULL ;
24
+ return XDB_VTYPE_OK ( type ) ? xdb_vdata_get (pTblm -> pVdatm , type , vid ) : NULL ;
25
25
}
26
26
27
27
static inline void *
@@ -33,7 +33,7 @@ xdb_fld_vdata_get (xdb_field_t *pField, void *pRow)
33
33
}
34
34
uint8_t type ;
35
35
xdb_rowid vid = xdb_row_vdata_info (pField -> pTblm -> row_size , pRow , & type );
36
- if (xdb_unlikely (0 == vid )) {
36
+ if (xdb_unlikely (! XDB_VTYPE_OK ( type ) )) {
37
37
return NULL ;
38
38
}
39
39
void * pVdat = xdb_vdata_get (pField -> pTblm -> pVdatm , type , vid );
@@ -1418,11 +1418,11 @@ int xdb_fprint_dbrow (FILE *pFile, xdb_tblm_t *pTblm, void *pDbRow, int format)
1418
1418
{
1419
1419
for (int i = 0 ; i < pTblm -> fld_count ; ++ i ) {
1420
1420
xdb_field_t * pField = & pTblm -> pFields [i ];
1421
- void * pVal = pDbRow + pField -> fld_off ;
1422
- if (NULL == pVal ) {
1421
+ if (!XDB_IS_NOTNULL (pDbRow + pTblm -> null_off , i )) {
1423
1422
fprintf (pFile , "%s=NULL " , XDB_OBJ_NAME (pField ));
1424
1423
continue ;
1425
1424
}
1425
+ void * pVal = pDbRow + pField -> fld_off ;
1426
1426
switch (pField -> fld_type ) {
1427
1427
case XDB_TYPE_INT :
1428
1428
fprintf (pFile , "%s=%d " , XDB_OBJ_NAME (pField ), * (int32_t * )pVal );
@@ -2132,6 +2132,139 @@ __xdb_fetch_row (xdb_tblm_t *pTblm, void *pRow, uint64_t pRowFld[])
2132
2132
}
2133
2133
}
2134
2134
2135
+ static int
2136
+ xdb_sprint_field (xdb_field_t * pField , void * pRow , char * buf )
2137
+ {
2138
+ int len = 0 ;
2139
+ void * pVal = pRow + pField -> fld_off ;
2140
+
2141
+ switch (pField -> fld_type ) {
2142
+ case XDB_TYPE_INT :
2143
+ len = sprintf (buf , "%d" , * (int32_t * )pVal );
2144
+ break ;
2145
+ case XDB_TYPE_TINYINT :
2146
+ len = sprintf (buf , "%d" , * (int8_t * )pVal );
2147
+ break ;
2148
+ case XDB_TYPE_SMALLINT :
2149
+ len = sprintf (buf , "%d" , * (int16_t * )pVal );
2150
+ break ;
2151
+ case XDB_TYPE_BIGINT :
2152
+ len = sprintf (buf , "%" PRIi64 "" , * (int64_t * )pVal );
2153
+ break ;
2154
+ case XDB_TYPE_FLOAT :
2155
+ len = sprintf (buf , "%f" , * (float * )pVal );
2156
+ break ;
2157
+ case XDB_TYPE_DOUBLE :
2158
+ len = sprintf (buf , "%f" , * (double * )pVal );
2159
+ break ;
2160
+ case XDB_TYPE_VCHAR :
2161
+ pVal = xdb_fld_vdata_get (pField , pRow );
2162
+ if (NULL == pVal ) {
2163
+ return sprintf (buf , "NULL" );
2164
+ }
2165
+ // fall through
2166
+ case XDB_TYPE_CHAR :
2167
+ * (buf + len ++ ) = '\'' ;
2168
+ len += xdb_str_escape (buf + len , (char * )pVal , * (uint16_t * )(pVal - 2 ));
2169
+ * (buf + len ++ ) = '\'' ;
2170
+ break ;
2171
+ case XDB_TYPE_VBINARY :
2172
+ pVal = xdb_fld_vdata_get (pField , pRow );
2173
+ if (NULL == pVal ) {
2174
+ return sprintf (buf , "NULL" );
2175
+ }
2176
+ // fall through
2177
+ case XDB_TYPE_BINARY :
2178
+ * (buf + len ++ ) = 'X' ;
2179
+ * (buf + len ++ ) = '\'' ;
2180
+ for (int h = 0 ; h < * (uint16_t * )(pVal - 2 ); ++ h ) {
2181
+ * (buf + len ++ ) = s_xdb_hex_2_str [((uint8_t * )pVal )[h ]][0 ];
2182
+ * (buf + len ++ ) = s_xdb_hex_2_str [((uint8_t * )pVal )[h ]][1 ];
2183
+ }
2184
+ * (buf + len ++ ) = '\'' ;
2185
+ break ;
2186
+ }
2187
+
2188
+ return len ;
2189
+ }
2190
+
2191
+ static int
2192
+ xdb_dbrow_log (xdb_tblm_t * pTblm , uint32_t type , void * pNewRow , void * pOldRow , xdb_setfld_t set_flds [], int set_count )
2193
+ {
2194
+ return 0 ;
2195
+
2196
+ int len = 0 ;
2197
+ char buf [32768 ];
2198
+ xdb_field_t * * ppFields , * pField ;
2199
+ int count ;
2200
+
2201
+ if (pTblm -> pDbm -> bSysDb ) {
2202
+ return XDB_OK ;
2203
+ }
2204
+
2205
+ switch (type ) {
2206
+ case XDB_TRIG_AFT_INS :
2207
+ len = sprintf (buf , "INSERT INTO %s (" , XDB_OBJ_NAME (pTblm ));
2208
+ for (int i = 0 ; i < pTblm -> fld_count ; ++ i ) {
2209
+ pField = & pTblm -> pFields [i ];
2210
+ memcpy (buf + len , pField -> obj .obj_name , pField -> obj .nm_len );
2211
+ len += pField -> obj .nm_len ;
2212
+ buf [len ++ ]= ',' ;
2213
+ }
2214
+ buf [len - 1 ] = ')' ;
2215
+ len += sprintf (buf + len , " VALUES (" );
2216
+ for (int i = 0 ; i < pTblm -> fld_count ; ++ i ) {
2217
+ len += xdb_sprint_field (& pTblm -> pFields [i ], (void * )pNewRow , buf + len );
2218
+ buf [len ++ ]= ',' ;
2219
+ }
2220
+ buf [-- len ] = ')' ;
2221
+ buf [++ len ] = ';' ;
2222
+ buf [++ len ] = '\0' ;
2223
+ break ;
2224
+ case XDB_TRIG_AFT_UPD :
2225
+ len = sprintf (buf , "UPDATE %s SET " , XDB_OBJ_NAME (pTblm ));
2226
+ for (int i = 0 ; i < set_count ; ++ i ) {
2227
+ pField = set_flds [i ].pField ;
2228
+ memcpy (buf + len , pField -> obj .obj_name , pField -> obj .nm_len );
2229
+ len += pField -> obj .nm_len ;
2230
+ buf [len ++ ] = '=' ;
2231
+ len += xdb_sprint_field (pField , (void * )pNewRow , buf + len );
2232
+ buf [len ++ ] = ',' ;
2233
+ }
2234
+ buf [len - 1 ] = ' ' ;
2235
+ len += sprintf (buf + len , "WHERE " );
2236
+ // fall through
2237
+ case XDB_TRIG_AFT_DEL :
2238
+ if (XDB_TRIG_AFT_DEL == type ) {
2239
+ len = sprintf (buf , "DELETE FROM %s WHERE " , XDB_OBJ_NAME (pTblm ));
2240
+ }
2241
+ if (pTblm -> bPrimary ) {
2242
+ xdb_idxm_t * pIdxm = XDB_OBJM_GET (pTblm -> idx_objm , 0 );
2243
+ ppFields = pIdxm -> pFields ;
2244
+ count = pIdxm -> fld_count ;
2245
+ } else {
2246
+ ppFields = pTblm -> ppFields ;
2247
+ count = pTblm -> fld_count <= XDB_MAX_MATCH_COL ? pTblm -> fld_count : XDB_MAX_MATCH_COL ;
2248
+ }
2249
+ for (int i = 0 ; i < count ; ++ i ) {
2250
+ if (xdb_likely (i > 0 )) {
2251
+ memcpy (buf + len , " AND " , 5 );
2252
+ len += 5 ;
2253
+ }
2254
+ pField = ppFields [i ];
2255
+ memcpy (buf + len , pField -> obj .obj_name , pField -> obj .nm_len );
2256
+ len += pField -> obj .nm_len ;
2257
+ buf [len ++ ] = '=' ;
2258
+ len += xdb_sprint_field (pField , (void * )pOldRow , buf + len );
2259
+ }
2260
+ buf [len ++ ] = ';' ;
2261
+ buf [len ++ ] = '\0' ;
2262
+ }
2263
+
2264
+ printf ("DBLOG: %s\n" , buf );
2265
+ return 0 ;
2266
+ }
2267
+
2135
2268
XDB_STATIC xdb_rowid
2136
2269
xdb_row_insert (xdb_conn_t * pConn , xdb_tblm_t * pTblm , void * pRow , int bUpdOrRol )
2137
2270
{
@@ -2224,6 +2357,9 @@ xdb_row_insert (xdb_conn_t *pConn, xdb_tblm_t *pTblm, void *pRow, int bUpdOrRol)
2224
2357
if (xdb_unlikely (aft_trig_cnt && !bUpdOrRol )) {
2225
2358
xdb_call_trigger (pConn , pTblm , XDB_TRIG_AFT_INS , flds_ptr , flds_ptr );
2226
2359
}
2360
+ if (!bUpdOrRol ) {
2361
+ xdb_dbrow_log (pTblm , XDB_TRIG_AFT_INS , pRowDb , NULL , NULL , 0 );
2362
+ }
2227
2363
2228
2364
return rid ;
2229
2365
}
@@ -2269,6 +2405,10 @@ xdb_row_delete (xdb_conn_t *pConn, xdb_tblm_t *pTblm, xdb_rowid rid, void *pRow,
2269
2405
xdb_call_trigger (pConn , pTblm , XDB_TRIG_AFT_DEL , flds_ptr , flds_ptr );
2270
2406
}
2271
2407
2408
+ if (!bUpdOrRol ) {
2409
+ xdb_dbrow_log (pTblm , XDB_TRIG_AFT_DEL , NULL , pRow , NULL , 0 );
2410
+ }
2411
+
2272
2412
return 0 ;
2273
2413
}
2274
2414
@@ -2384,6 +2524,8 @@ xdb_row_update (xdb_conn_t *pConn, xdb_tblm_t *pTblm, xdb_rowid rid, void *pRow,
2384
2524
xdb_call_trigger (pConn , pTblm , XDB_TRIG_AFT_UPD , upd_flds_ptr , old_flds_ptr );
2385
2525
}
2386
2526
2527
+ xdb_dbrow_log (pTblm , XDB_TRIG_AFT_UPD , pUpdRow , pRow , set_flds , set_count );
2528
+
2387
2529
XDB_BUF_FREE (pUpdRow );
2388
2530
2389
2531
return 0 ;
@@ -2397,14 +2539,15 @@ static inline void
2397
2539
xdb_mark_dirty (xdb_tblm_t * pTblm )
2398
2540
{
2399
2541
if (xdb_unlikely (!pTblm -> bMemory )) {
2400
- xdb_stghdr_t * pStgHdr = pTblm -> stg_mgr . pStgHdr ;
2401
- if ( xdb_unlikely (! pStgHdr -> blk_dirty )) {
2402
- pStgHdr -> blk_dirty = true;
2542
+ xdb_tbl_t * pTbl = XDB_TBLPTR ( pTblm ) ;
2543
+ xdb_atomic_add ( & pTbl -> lastchg_id , 1 );
2544
+ if ( xdb_unlikely ( pTbl -> flush_id + 1 == pTbl -> lastchg_id )) {
2403
2545
xdb_stg_sync (& pTblm -> stg_mgr , 0 , 4094 , true);
2404
2546
}
2405
- pStgHdr = pTblm -> pDbm -> stg_mgr .pStgHdr ;
2406
- if (xdb_unlikely (!pStgHdr -> blk_dirty )) {
2407
- pStgHdr -> blk_dirty = true;
2547
+
2548
+ xdb_db_t * pDb = XDB_DBPTR (pTblm -> pDbm );
2549
+ xdb_atomic_add (& pDb -> lastchg_id , 1 );
2550
+ if (xdb_unlikely (pDb -> flush_id + 1 == pDb -> lastchg_id )) {
2408
2551
xdb_stg_sync (& pTblm -> pDbm -> stg_mgr , 0 , 4094 , true);
2409
2552
}
2410
2553
}
@@ -2430,10 +2573,6 @@ xdb_sql_insert (xdb_stmt_insert_t *pStmt)
2430
2573
}
2431
2574
}
2432
2575
2433
- if (count ) {
2434
- xdb_mark_dirty (pTblm );
2435
- }
2436
-
2437
2576
xdb_wrunlock_tblstg (pTblm );
2438
2577
2439
2578
return count ;
@@ -2473,10 +2612,6 @@ xdb_sql_update (xdb_stmt_select_t *pStmt)
2473
2612
2474
2613
xdb_rowset_clean (pRowSet );
2475
2614
2476
- if (count ) {
2477
- xdb_mark_dirty (pTblm );
2478
- }
2479
-
2480
2615
xdb_wrunlock_tblstg (pTblm );
2481
2616
2482
2617
return count ;
@@ -2508,10 +2643,6 @@ xdb_sql_delete (xdb_stmt_select_t *pStmt)
2508
2643
2509
2644
xdb_rowset_clean (pRowSet );
2510
2645
2511
- if (count ) {
2512
- xdb_mark_dirty (pTblm );
2513
- }
2514
-
2515
2646
xdb_wrunlock_tblstg (pTblm );
2516
2647
2517
2648
return count ;
0 commit comments