localcli.cpp

来自「一个功能强大的内存数据库源代码,c++编写,有详细的注释」· C++ 代码 · 共 1,971 行 · 第 1/4 页

CPP
1,971
字号
		}		if (pb->var_ptr == NULL) { 		    return cli_unbound_parameter;		}		switch(pb->var_type) {		  case cli_oid:		    stmt->query.append(dbQueryElement::qVarReference, pb->var_ptr);		    break;		  case cli_bool:		    stmt->query.append(dbQueryElement::qVarBool, pb->var_ptr);		    break;		  case cli_int1:		    stmt->query.append(dbQueryElement::qVarInt1, pb->var_ptr);		    break;		  case cli_int2:		    stmt->query.append(dbQueryElement::qVarInt2, pb->var_ptr);		    break;		  case cli_int4:		    stmt->query.append(dbQueryElement::qVarInt4, pb->var_ptr);		    break;		  case cli_int8:		    stmt->query.append(dbQueryElement::qVarInt8, pb->var_ptr);		    break;		  case cli_real4:		    stmt->query.append(dbQueryElement::qVarReal4, pb->var_ptr);		    break;		  case cli_real8:		    stmt->query.append(dbQueryElement::qVarReal8, pb->var_ptr);		    break;		  case cli_asciiz:		    stmt->query.append(dbQueryElement::qVarString, pb->var_ptr);		    break;		  case cli_pasciiz:		    stmt->query.append(dbQueryElement::qVarStringPtr, pb->var_ptr);		    break;		  case cli_array_of_oid:		    stmt->query.append(dbQueryElement::qVarArrayOfRef, pb->var_ptr);		    break;		  default:		    return cli_unsupported_type;		    		}		while (isalnum(*++p));		q = p;		pb = pb->next;	    } else {		p += 1;	    }	}	if (p != q) { 	    stmt->query.append(dbQueryElement::qExpression, q);	}	stmt->prepared = true;    }    stmt->cursor.setTable(stmt->table);    stmt->cursor.reset();    return stmt->cursor.select(stmt->query, for_update ? dbCursorForUpdate : dbCursorViewOnly);}int dbCLI::fetch_columns(statement_desc* stmt){    stmt->first_fetch = false;    if (stmt->cursor.isEmpty()) {	return cli_not_found;    }    stmt->updated = false;    char* data = (char*)stmt->session->db->getRow(stmt->cursor.currId);    for (column_binding* cb = stmt->columns; cb != NULL; cb = cb->next) {        dbFieldDescriptor* fd = cb->field;	char* src = data + fd->dbsOffs;	char* dst = (char*)cb->var_ptr;        // Allow fetching of structures with one component        if (fd->type == dbField::tpStructure && fd->components->next == NULL) {             fd = fd->components;        }	switch (fd->type) {	  case dbField::tpBool:	    switch (cb->var_type) {	      case cli_bool:		*(cli_bool_t*)dst = *(bool*)src;		continue;	      case cli_int1:		*(cli_int1_t*)dst = *(bool*)src ? 1 : 0;		continue;	      case cli_int2:		*(cli_int2_t*)dst = *(bool*)src ? 1 : 0;		continue;	      case cli_int4:		*(cli_int4_t*)dst = *(bool*)src ? 1 : 0;		continue;	      case cli_int8:		*(db_int8*)dst = *(bool*)src ? 1 : 0;		continue;	      case cli_real4:		*(cli_real4_t*)dst = *(bool*)src ? 1 : 0;		continue;	      case cli_real8:		*(cli_real8_t*)dst = *(bool*)src ? 1 : 0;		continue;	    }	    break;	    	  case dbField::tpInt1:	    switch (cb->var_type) {	      case cli_bool:		*(cli_bool_t*)dst = *(int1*)src != 0;		continue;	      case cli_int1:		*(cli_int1_t*)dst = *(int1*)src;		continue;	      case cli_int2:		*(cli_int2_t*)dst = *(int1*)src;		continue;	      case cli_int4:		*(cli_int4_t*)dst = *(int1*)src;		continue;	      case cli_int8:		*(db_int8*)dst = *(int1*)src;		continue;	      case cli_real4:		*(cli_real4_t*)dst = *(int1*)src;		continue;	      case cli_real8:		*(cli_real8_t*)dst = *(int1*)src;		continue;	    }	    break;	  case dbField::tpInt2:	    switch (cb->var_type) {	      case cli_bool:		*(cli_bool_t*)dst = *(int2*)src != 0;		continue;	      case cli_int1:		*(cli_int1_t*)dst = (int1)*(int2*)src;		continue;	      case cli_int2:		*(cli_int2_t*)dst = *(int2*)src;		continue;	      case cli_int4:		*(cli_int4_t*)dst = *(int2*)src;		continue;	      case cli_int8:		*(db_int8*)dst = *(int2*)src;		continue;	      case cli_real4:		*(cli_real4_t*)dst = *(int2*)src;		continue;	      case cli_real8:		*(cli_real8_t*)dst = *(int2*)src;		continue;	    }	    break;	  case dbField::tpInt4:	    switch (cb->var_type) {	      case cli_bool:		*(cli_bool_t*)dst = *(int4*)src != 0;		continue;	      case cli_int1:		*(cli_int1_t*)dst = (cli_int1_t)*(int4*)src;		continue;	      case cli_int2:		*(cli_int2_t*)dst = (cli_int2_t)*(int4*)src;		continue;	      case cli_int4:	      case cli_autoincrement:		*(cli_int4_t*)dst = *(int4*)src;		continue;	      case cli_int8:		*(db_int8*)dst = *(int4*)src;		continue;	      case cli_real4:		*(cli_real4_t*)dst = *(int4*)src;		continue;	      case cli_real8:		*(cli_real8_t*)dst = *(int4*)src;		continue;	    }	    break;	  case dbField::tpInt8:	    switch (cb->var_type) {	      case cli_bool:		*(cli_bool_t*)dst = *(db_int8*)src != 0;		continue;	      case cli_int1:		*(cli_int1_t*)dst = (cli_int1_t)*(db_int8*)src;		continue;	      case cli_int2:		*(cli_int2_t*)dst = (cli_int2_t)*(db_int8*)src;		continue;	      case cli_int4:		*(cli_int4_t*)dst = (cli_int4_t)*(db_int8*)src;		continue;	      case cli_int8:		*(db_int8*)dst = *(db_int8*)src;		continue;	      case cli_real4:		*(cli_real4_t*)dst = *(db_int8*)src;		continue;	      case cli_real8:		*(cli_real8_t*)dst = *(db_int8*)src;		continue;	    }	    break;	  case dbField::tpReal4:	    switch (cb->var_type) {	      case cli_bool:		*(cli_bool_t*)dst = *(real4*)src != 0;		continue;	      case cli_int1:		*(cli_int1_t*)dst = (cli_int1_t)*(real4*)src;		continue;	      case cli_int2:		*(cli_int2_t*)dst = (cli_int2_t)*(real4*)src;		continue;	      case cli_int4:		*(cli_int4_t*)dst = (cli_int4_t)*(real4*)src;		continue;	      case cli_int8:		*(db_int8*)dst = (db_int8)*(real4*)src;		continue;	      case cli_real4:		*(cli_real4_t*)dst = *(real4*)src;		continue;	      case cli_real8:		*(cli_real8_t*)dst = *(real4*)src;		continue;	    }	    break;	  case dbField::tpReal8:	    switch (cb->var_type) {	      case cli_bool:		*(cli_bool_t*)dst = *(real8*)src != 0;		continue;	      case cli_int1:		*(cli_int1_t*)dst = (cli_int1_t)*(real8*)src;		continue;	      case cli_int2:		*(cli_int2_t*)dst = (cli_int2_t)*(real8*)src;		continue;	      case cli_int4:		*(cli_int4_t*)dst = (cli_int4_t)*(real8*)src;		continue;	      case cli_int8:		*(db_int8*)dst = (db_int8)*(real8*)src;		continue;	      case cli_real4:		*(cli_real4_t*)dst = (real4)*(real8*)src;		continue;	      case cli_real8:		*(cli_real8_t*)dst = *(real8*)src;		continue;	    }	    break;	  case dbField::tpReference:	    if (cb->var_type == cli_oid) { 		*(cli_oid_t*)dst = *(oid_t*)src;		continue;	    }	    break;	  case dbField::tpString:	    if (cb->var_type == cli_asciiz || cb->var_type == cli_pasciiz) { 		if (cb->var_type == cli_pasciiz) { 		    dst = *(char**)dst;		}		dbVarying* v = (dbVarying*)src;		int size = v->size;		if (cb->set_fnc != NULL) {		    dst = (char*)cb->set_fnc(cli_asciiz, dst, size, 					     cb->name, stmt->id, data + v->offs);                    if (dst != NULL) {                         memcpy(dst, data + v->offs, size);                    }		} else { 		    int n = size;		    if (cb->var_len != NULL) {			if (n > *cb->var_len) {			    n = *cb->var_len;			}			*cb->var_len = size;		    }		    memcpy(dst, data + v->offs, n);		}		continue;	    }	    break;	  case dbField::tpArray:	    if (cb->var_type >= cli_array_of_oid && cb->var_type <= cli_array_of_string) 	    { 		dbVarying* v = (dbVarying*)src;		int n = v->size;		src = data + v->offs;		if (cb->set_fnc != NULL) {		    dst = (char*)cb->set_fnc(cb->var_type, dst, n, 					     cb->name, stmt->id, src);                    if (dst == NULL) {                         continue;                    }		} else { 		    int size = n;		    if (cb->var_len != NULL) {			if (n > *cb->var_len) {			    n = *cb->var_len;			}			*cb->var_len = size;		    }		}		switch (fd->components->type) {		  case dbField::tpBool:		    if (cb->var_type == cli_array_of_bool) { 			cli_bool_t* dst_elem = (cli_bool_t*)dst;		        bool*       src_elem = (bool*)src;			while (--n >= 0) *dst_elem++ = *src_elem++;			continue;		    }		    break;		  case dbField::tpInt1:		    if (cb->var_type == cli_array_of_int1) { 			cli_int1_t* dst_elem = (cli_int1_t*)dst;		        int1*       src_elem = (int1*)src;			while (--n >= 0) *dst_elem++ = *src_elem++;			continue;		    }		    break;		  case dbField::tpInt2:		    if (cb->var_type == cli_array_of_int2) { 			cli_int2_t* dst_elem = (cli_int2_t*)dst;		        int2*       src_elem = (int2*)src;			while (--n >= 0) *dst_elem++ = *src_elem++;			continue;		    }		    break;		  case dbField::tpInt4:		    if (cb->var_type == cli_array_of_int4) { 			cli_int4_t* dst_elem = (cli_int4_t*)dst;		        int4*       src_elem = (int4*)src;			while (--n >= 0) *dst_elem++ = *src_elem++;			continue;		    }		    break;		  case dbField::tpInt8:		    if (cb->var_type == cli_array_of_int8) { 			cli_int8_t* dst_elem = (cli_int8_t*)dst;		        db_int8*       src_elem = (db_int8*)src;			while (--n >= 0) *dst_elem++ = *src_elem++;			continue;		    }		    break;		  case dbField::tpReal4:		    if (cb->var_type == cli_array_of_real4) { 			cli_real4_t* dst_elem = (cli_real4_t*)dst;		        real4*       src_elem = (real4*)src;			while (--n >= 0) *dst_elem++ = *src_elem++;			continue;		    }		    break;		  case dbField::tpReal8:		    if (cb->var_type == cli_array_of_real8) { 			cli_real8_t* dst_elem = (cli_real8_t*)dst;		        real8*       src_elem = (real8*)src;			while (--n >= 0) *dst_elem++ = *src_elem++;			continue;		    }		    break;		  case dbField::tpReference:		    if (cb->var_type == cli_array_of_oid) { 			cli_oid_t* dst_elem = (cli_oid_t*)dst;		        oid_t*     src_elem = (oid_t*)src;			while (--n >= 0) *dst_elem++ = *src_elem++;			continue;		    }		    break;		  case dbField::tpString:		    if (cb->var_type == cli_array_of_string) { 			char** dst_elem = (char**)dst;		        dbVarying* src_elem = (dbVarying*)src;			while (--n >= 0) { 			    *dst_elem++ = (char*)((char*)src_elem + src_elem->offs);			    src_elem += 1;			}			continue;		    }		    		}	    }	}	return cli_unsupported_type;    }    return cli_ok;}int dbCLI::store_columns(char* data, statement_desc* stmt){    for (column_binding* cb = stmt->columns; cb != NULL; cb = cb->next)     {        dbFieldDescriptor* fd = cb->field;	char* dst = data + fd->appOffs;	char* src = (char*)cb->var_ptr;        // Allow storing to structures with one component        if (fd->type == dbField::tpStructure && fd->components->next == NULL) {             fd = fd->components;        }	switch (fd->type) {	  case dbField::tpBool:	    switch (cb->var_type) {	      case cli_bool:		*(bool*)dst = *(cli_bool_t*)src;		continue;	      case cli_int1:		*(bool*)dst = *(cli_int1_t*)src != 0;		continue;	      case cli_int2:		*(bool*)dst = *(cli_int2_t*)src != 0;		continue;	      case cli_int4:		*(bool*)dst = *(cli_int4_t*)src != 0;		continue;	      case cli_int8:		*(bool*)dst = *(db_int8*)src != 0;		continue;	      case cli_real4:		*(bool*)dst = *(cli_real4_t*)src != 0;		continue;	      case cli_real8:		*(bool*)dst = *(cli_real8_t*)src != 0;		continue;	    }	    break;	    	  case dbField::tpInt1:	    switch (cb->var_type) {	      case cli_bool:		*(int1*)dst = *(cli_bool_t*)src ? 1 : 0;		continue;	      case cli_int1:		*(int1*)dst = *(cli_int1_t*)src;		continue;	      case cli_int2:		*(int1*)dst = (int1)*(cli_int2_t*)src;		continue;	      case cli_int4:		*(int1*)dst = (int1)*(cli_int4_t*)src;		continue;	      case cli_int8:		*(int1*)dst = (int1)*(db_int8*)src;		continue;	      case cli_real4:		*(int1*)dst = (int1)*(cli_real4_t*)src;		continue;	      case cli_real8:		*(int1*)dst = (int1)*(cli_real8_t*)src;		continue;	    }	    break;	  case dbField::tpInt2:	    switch (cb->var_type) {	      case cli_bool:		*(int2*)dst = *(cli_bool_t*)src ? 1 : 0;		continue;	      case cli_int1:		*(int2*)dst = *(cli_int1_t*)src;		continue;	      case cli_int2:		*(int2*)dst = *(cli_int2_t*)src;		continue;	      case cli_int4:		*(int2*)dst = (int2)*(cli_int4_t*)src;		continue;	      case cli_int8:		*(int2*)dst = (int2)*(db_int8*)src;		continue;	      case cli_real4:		*(int2*)dst = (int2)*(cli_real4_t*)src;		continue;	      case cli_real8:		*(int2*)dst = (int2)*(cli_real8_t*)src;		continue;	    }	    break;	  case dbField::tpInt4:	    switch (cb->var_type) {	      case cli_bool:		*(int4*)dst = *(cli_bool_t*)src ? 1 : 0;		continue;	      case cli_int1:		*(int4*)dst = *(cli_int1_t*)src;		continue;	      case cli_int2:		*(int4*)dst = *(cli_int2_t*)src;		continue;	      case cli_autoincrement:#ifdef AUTOINCREMENT_SUPPORT		*(int4*)dst = cb->field->defTable->autoincrementCount;#endif		continue;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?