Skip to content

Commit 76bd434

Browse files
committed
Support WAL, SYNMODE
1 parent 7d10b53 commit 76bd434

23 files changed

+476
-222
lines changed

CHANGELOG.md

+20
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,28 @@
2424
**Test**
2525
**Bug Fixes**
2626
- Support simple SQL inner join
27+
- Support new statements: `FLUSH` `REPAIR`
28+
2729
-->
2830

31+
## 0.10.0 <small>(2024-11-01)</small>
32+
33+
**Features**
34+
35+
- Support `VARCHAR`, `BINARY`, `VARBINARY`
36+
- Support `WAL` [#31](https://github.com/crossdb-org/crossdb/issues/31)
37+
- Support `OR` operator
38+
- Support new API `xdb_column_blob`
39+
- Support `CREATE DATABASE` `SYNCMODE` option
40+
41+
**Improvements**
42+
43+
**Test**
44+
45+
**Bug Fixes**
46+
47+
- Create duplicate database doesn't report error sometimes
48+
2949
## 0.9.0 <small>(2024-10-11)</small>
3050

3151
**Features**

include/crossdb.h

+17-18
Original file line numberDiff line numberDiff line change
@@ -137,30 +137,29 @@ typedef struct {
137137
} xdb_rowdat_t;
138138

139139
typedef struct {
140-
uint16_t col_len; // colum total len
141-
uint8_t col_type; // 2 xdb_type_t
142-
uint8_t col_dtid; // 3
140+
uint8_t col_len; // colum total len
141+
uint8_t col_type; // 1 xdb_type_t
142+
uint16_t col_flags; // 2
143143
uint32_t col_off; // 4
144-
uint16_t col_flags; // 10
145-
uint16_t col_vid; // 8
146-
uint8_t col_decimal; // 12
147-
uint8_t col_charset; // 12
148-
uint8_t col_nmlen; // 13
149-
char col_name[]; // 14
144+
uint16_t rsvd; // 8
145+
//uint8_t col_decimal; // 8
146+
//uint8_t col_charset; // 9
147+
uint8_t col_dtid; // 10 db.table id in xdb_meta_t.tbl_name
148+
uint8_t rsvd1; // 11
149+
uint8_t col_nmlen; // 12
150+
char col_name[]; // 13
150151
} xdb_col_t;
151152

152153
typedef struct {
153154
uint32_t len_type; // MSB 4bit are type
154155
uint16_t col_count; // 4
155-
uint16_t col_vcount; // 6
156-
uint16_t cols_off; // 8
157-
uint16_t rsvd; // 10
158-
uint32_t row_size; // 12
159-
uint32_t null_off; // 16
160-
uint32_t rsvd2; // 20
161-
uint64_t col_list; // 24 xdb_col_t list after is head(u16),next(u16)
162-
uint16_t tbl_nmlen; // 32 list of db.tbl;db.tbl;db.tbl
163-
char tbl_name[];
156+
uint16_t cols_off; // 6
157+
uint64_t col_list; // 8 xdb_col_t list
158+
uint32_t row_size; // 16
159+
uint32_t null_off; // 20
160+
uint32_t rsvd[4]; // 24
161+
uint16_t tbl_nmlen; // 40 list of db.tbl,db.tbl,db.tbl
162+
char tbl_name[]; // 42
164163
//xdb_col_t cols[];
165164
} xdb_meta_t;
166165

src/core/xdb_cfg.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
CrossDB Config
1717
******************************************************************************/
1818

19-
#define XDB_VERSION "0.9.0"
19+
#define XDB_VERSION "0.10.0"
2020

2121
#define XDB_MAX_DB 1024 // at most 4096
2222
#define XDB_MAX_TBL 4095 // per DB
@@ -28,11 +28,11 @@
2828
#define XDB_MAX_SQL_BUF (1024*1024)
2929
#define XDB_MAX_JOIN 8
3030

31-
#define XDB_PATH_LEN 256
31+
#define XDB_PATH_LEN 512
3232

3333

3434
#ifndef XDB_ENABLE_SERVER
35-
#define XDB_ENABLE_SERVER 0
35+
#define XDB_ENABLE_SERVER 0
3636
#endif
3737

3838
#endif // __CROSS_CFG_H__

src/core/xdb_common.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ typedef int xdb_rowid;
7777

7878
#define XDB_CONNCODE(pConn) pConn->conn_res.errcode
7979

80-
//#define XDB_LOG_FLAGS (XDB_LOG_DB|XDB_LOG_TBL|XDB_LOG_WAL)
80+
//#define XDB_LOG_FLAGS (XDB_LOG_DB|XDB_LOG_TBL|XDB_LOG_TRANS|XDB_LOG_WAL)
8181
#ifndef XDB_LOG_FLAGS
8282
#define XDB_LOG_FLAGS 0
8383
#endif
@@ -91,6 +91,7 @@ typedef int xdb_rowid;
9191
#define XDB_LOG_STG (1<<9)
9292
#define XDB_LOG_TRANS (1<<10)
9393
#define XDB_LOG_WAL (1<<11)
94+
#define XDB_LOG_VDAT (1<<12)
9495

9596
#define XDB_IS_NOTNULL(pNull,bits) (((uint8_t*)(pNull))[bits>>3] & (1<<(bits&7)))
9697
#define XDB_SET_NOTNULL(pNull,bits) (((uint8_t*)(pNull))[bits>>3] |= (1<<(bits&7)))

src/core/xdb_crud.c

+153-22
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ xdb_row_vdata_get (xdb_tblm_t *pTblm, void *pRow)
2121
{
2222
uint8_t type;
2323
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;
2525
}
2626

2727
static inline void*
@@ -33,7 +33,7 @@ xdb_fld_vdata_get (xdb_field_t *pField, void *pRow)
3333
}
3434
uint8_t type;
3535
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))) {
3737
return NULL;
3838
}
3939
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)
14181418
{
14191419
for (int i = 0; i < pTblm->fld_count; ++i) {
14201420
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)) {
14231422
fprintf (pFile, "%s=NULL ", XDB_OBJ_NAME(pField));
14241423
continue;
14251424
}
1425+
void *pVal = pDbRow + pField->fld_off;
14261426
switch (pField->fld_type) {
14271427
case XDB_TYPE_INT:
14281428
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[])
21322132
}
21332133
}
21342134

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+
21352268
XDB_STATIC xdb_rowid
21362269
xdb_row_insert (xdb_conn_t *pConn, xdb_tblm_t *pTblm, void *pRow, int bUpdOrRol)
21372270
{
@@ -2224,6 +2357,9 @@ xdb_row_insert (xdb_conn_t *pConn, xdb_tblm_t *pTblm, void *pRow, int bUpdOrRol)
22242357
if (xdb_unlikely (aft_trig_cnt && !bUpdOrRol)) {
22252358
xdb_call_trigger (pConn, pTblm, XDB_TRIG_AFT_INS, flds_ptr, flds_ptr);
22262359
}
2360+
if (!bUpdOrRol) {
2361+
xdb_dbrow_log (pTblm, XDB_TRIG_AFT_INS, pRowDb, NULL, NULL, 0);
2362+
}
22272363

22282364
return rid;
22292365
}
@@ -2269,6 +2405,10 @@ xdb_row_delete (xdb_conn_t *pConn, xdb_tblm_t *pTblm, xdb_rowid rid, void *pRow,
22692405
xdb_call_trigger (pConn, pTblm, XDB_TRIG_AFT_DEL, flds_ptr, flds_ptr);
22702406
}
22712407

2408+
if (!bUpdOrRol) {
2409+
xdb_dbrow_log (pTblm, XDB_TRIG_AFT_DEL, NULL, pRow, NULL, 0);
2410+
}
2411+
22722412
return 0;
22732413
}
22742414

@@ -2384,6 +2524,8 @@ xdb_row_update (xdb_conn_t *pConn, xdb_tblm_t *pTblm, xdb_rowid rid, void *pRow,
23842524
xdb_call_trigger (pConn, pTblm, XDB_TRIG_AFT_UPD, upd_flds_ptr, old_flds_ptr);
23852525
}
23862526

2527+
xdb_dbrow_log (pTblm, XDB_TRIG_AFT_UPD, pUpdRow, pRow, set_flds, set_count);
2528+
23872529
XDB_BUF_FREE (pUpdRow);
23882530

23892531
return 0;
@@ -2397,14 +2539,15 @@ static inline void
23972539
xdb_mark_dirty (xdb_tblm_t *pTblm)
23982540
{
23992541
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)) {
24032545
xdb_stg_sync (&pTblm->stg_mgr, 0, 4094, true);
24042546
}
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)) {
24082551
xdb_stg_sync (&pTblm->pDbm->stg_mgr, 0, 4094, true);
24092552
}
24102553
}
@@ -2430,10 +2573,6 @@ xdb_sql_insert (xdb_stmt_insert_t *pStmt)
24302573
}
24312574
}
24322575

2433-
if (count) {
2434-
xdb_mark_dirty (pTblm);
2435-
}
2436-
24372576
xdb_wrunlock_tblstg (pTblm);
24382577

24392578
return count;
@@ -2473,10 +2612,6 @@ xdb_sql_update (xdb_stmt_select_t *pStmt)
24732612

24742613
xdb_rowset_clean (pRowSet);
24752614

2476-
if (count) {
2477-
xdb_mark_dirty (pTblm);
2478-
}
2479-
24802615
xdb_wrunlock_tblstg (pTblm);
24812616

24822617
return count;
@@ -2508,10 +2643,6 @@ xdb_sql_delete (xdb_stmt_select_t *pStmt)
25082643

25092644
xdb_rowset_clean (pRowSet);
25102645

2511-
if (count) {
2512-
xdb_mark_dirty (pTblm);
2513-
}
2514-
25152646
xdb_wrunlock_tblstg (pTblm);
25162647

25172648
return count;

0 commit comments

Comments
 (0)