add refcount
This commit is contained in:
parent
ec04ef7b79
commit
36e5dac0eb
|
@ -53,16 +53,19 @@ typedef struct sql_s sql_t;
|
||||||
|
|
||||||
|
|
||||||
struct env_s {
|
struct env_s {
|
||||||
|
uint64_t refcount;
|
||||||
unsigned int destroying:1;
|
unsigned int destroying:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct conn_s {
|
struct conn_s {
|
||||||
|
uint64_t refcount;
|
||||||
env_t *env;
|
env_t *env;
|
||||||
|
|
||||||
TAOS *taos;
|
TAOS *taos;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sql_s {
|
struct sql_s {
|
||||||
|
uint64_t refcount;
|
||||||
conn_t *conn;
|
conn_t *conn;
|
||||||
|
|
||||||
TAOS_RES *rs;
|
TAOS_RES *rs;
|
||||||
|
@ -81,6 +84,8 @@ SQLRETURN SQL_API SQLAllocEnv(SQLHENV *EnvironmentHandle) {
|
||||||
env_t *env = (env_t*)calloc(1, sizeof(*env));
|
env_t *env = (env_t*)calloc(1, sizeof(*env));
|
||||||
if (!env) return SQL_ERROR;
|
if (!env) return SQL_ERROR;
|
||||||
|
|
||||||
|
DASSERT(INC_REF(env)>0);
|
||||||
|
|
||||||
*EnvironmentHandle = env;
|
*EnvironmentHandle = env;
|
||||||
|
|
||||||
return SQL_SUCCESS;
|
return SQL_SUCCESS;
|
||||||
|
@ -90,11 +95,15 @@ SQLRETURN SQL_API SQLFreeEnv(SQLHENV EnvironmentHandle) {
|
||||||
env_t *env = (env_t*)EnvironmentHandle;
|
env_t *env = (env_t*)EnvironmentHandle;
|
||||||
if (!env) return SQL_ERROR;
|
if (!env) return SQL_ERROR;
|
||||||
|
|
||||||
|
DASSERT(GET_REF(env)==1);
|
||||||
|
|
||||||
DASSERT(!env->destroying);
|
DASSERT(!env->destroying);
|
||||||
|
|
||||||
env->destroying = 1;
|
env->destroying = 1;
|
||||||
DASSERT(env->destroying == 1);
|
DASSERT(env->destroying == 1);
|
||||||
|
|
||||||
|
DASSERT(DEC_REF(env)==0);
|
||||||
|
|
||||||
free(env);
|
free(env);
|
||||||
|
|
||||||
return SQL_SUCCESS;
|
return SQL_SUCCESS;
|
||||||
|
@ -105,6 +114,8 @@ SQLRETURN SQL_API SQLAllocConnect(SQLHENV EnvironmentHandle,
|
||||||
env_t *env = (env_t*)EnvironmentHandle;
|
env_t *env = (env_t*)EnvironmentHandle;
|
||||||
if (!env) return SQL_ERROR;
|
if (!env) return SQL_ERROR;
|
||||||
|
|
||||||
|
DASSERT(INC_REF(env)>1);
|
||||||
|
|
||||||
conn_t *conn = NULL;
|
conn_t *conn = NULL;
|
||||||
do {
|
do {
|
||||||
conn = (conn_t*)calloc(1, sizeof(*conn));
|
conn = (conn_t*)calloc(1, sizeof(*conn));
|
||||||
|
@ -112,20 +123,34 @@ SQLRETURN SQL_API SQLAllocConnect(SQLHENV EnvironmentHandle,
|
||||||
|
|
||||||
conn->env = env;
|
conn->env = env;
|
||||||
*ConnectionHandle = conn;
|
*ConnectionHandle = conn;
|
||||||
|
|
||||||
|
DASSERT(INC_REF(conn)>0);
|
||||||
|
|
||||||
|
return SQL_SUCCESS;
|
||||||
} while (0);
|
} while (0);
|
||||||
|
|
||||||
return conn ? SQL_SUCCESS : SQL_ERROR;
|
DASSERT(DEC_REF(env)>0);
|
||||||
|
|
||||||
|
return SQL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
SQLRETURN SQL_API SQLFreeConnect(SQLHDBC ConnectionHandle) {
|
SQLRETURN SQL_API SQLFreeConnect(SQLHDBC ConnectionHandle) {
|
||||||
conn_t *conn = (conn_t*)ConnectionHandle;
|
conn_t *conn = (conn_t*)ConnectionHandle;
|
||||||
if (!conn) return SQL_ERROR;
|
if (!conn) return SQL_ERROR;
|
||||||
|
|
||||||
|
DASSERT(GET_REF(conn)==1);
|
||||||
|
|
||||||
|
DASSERT(conn->env);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (conn->taos) {
|
if (conn->taos) {
|
||||||
taos_close(conn->taos);
|
taos_close(conn->taos);
|
||||||
conn->taos = NULL;
|
conn->taos = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DASSERT(DEC_REF(conn->env)>0);
|
||||||
|
DASSERT(DEC_REF(conn)==0);
|
||||||
|
|
||||||
conn->env = NULL;
|
conn->env = NULL;
|
||||||
free(conn);
|
free(conn);
|
||||||
} while (0);
|
} while (0);
|
||||||
|
@ -142,8 +167,9 @@ SQLRETURN SQL_API SQLConnect(SQLHDBC ConnectionHandle,
|
||||||
|
|
||||||
if (conn->taos) return SQL_ERROR;
|
if (conn->taos) return SQL_ERROR;
|
||||||
|
|
||||||
|
// TODO: data-race
|
||||||
conn->taos = taos_connect("localhost", (const char*)UserName, (const char*)Authentication, NULL, 0);
|
conn->taos = taos_connect("localhost", (const char*)UserName, (const char*)Authentication, NULL, 0);
|
||||||
|
|
||||||
return conn->taos ? SQL_SUCCESS : SQL_ERROR;
|
return conn->taos ? SQL_SUCCESS : SQL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -164,13 +190,23 @@ SQLRETURN SQL_API SQLAllocStmt(SQLHDBC ConnectionHandle,
|
||||||
conn_t *conn = (conn_t*)ConnectionHandle;
|
conn_t *conn = (conn_t*)ConnectionHandle;
|
||||||
if (!conn) return SQL_ERROR;
|
if (!conn) return SQL_ERROR;
|
||||||
|
|
||||||
sql_t *sql = (sql_t*)calloc(1, sizeof(*sql));
|
DASSERT(INC_REF(conn)>1);
|
||||||
if (!sql) return SQL_ERROR;
|
|
||||||
|
|
||||||
sql->conn = conn;
|
do {
|
||||||
*StatementHandle = sql;
|
sql_t *sql = (sql_t*)calloc(1, sizeof(*sql));
|
||||||
|
if (!sql) break;
|
||||||
|
|
||||||
return SQL_SUCCESS;
|
sql->conn = conn;
|
||||||
|
DASSERT(INC_REF(sql)>0);
|
||||||
|
|
||||||
|
*StatementHandle = sql;
|
||||||
|
|
||||||
|
return SQL_SUCCESS;
|
||||||
|
} while (0);
|
||||||
|
|
||||||
|
DASSERT(DEC_REF(conn)>0);
|
||||||
|
|
||||||
|
return SQL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
SQLRETURN SQL_API SQLFreeStmt(SQLHSTMT StatementHandle,
|
SQLRETURN SQL_API SQLFreeStmt(SQLHSTMT StatementHandle,
|
||||||
|
@ -178,11 +214,18 @@ SQLRETURN SQL_API SQLFreeStmt(SQLHSTMT StatementHandle,
|
||||||
sql_t *sql = (sql_t*)StatementHandle;
|
sql_t *sql = (sql_t*)StatementHandle;
|
||||||
if (!sql) return SQL_ERROR;
|
if (!sql) return SQL_ERROR;
|
||||||
|
|
||||||
|
DASSERT(GET_REF(sql)==1);
|
||||||
|
|
||||||
if (sql->rs) {
|
if (sql->rs) {
|
||||||
taos_free_result(sql->rs);
|
taos_free_result(sql->rs);
|
||||||
sql->rs = NULL;
|
sql->rs = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DASSERT(DEC_REF(sql->conn)>0);
|
||||||
|
DASSERT(DEC_REF(sql)==0);
|
||||||
|
|
||||||
sql->conn = NULL;
|
sql->conn = NULL;
|
||||||
|
|
||||||
free(sql);
|
free(sql);
|
||||||
|
|
||||||
return SQL_SUCCESS;
|
return SQL_SUCCESS;
|
||||||
|
|
Loading…
Reference in New Issue