Пример #1
0
int main(int argc, char *argv[]){
	char buffer[64];
	char *c;

#if DEBUG
	printf("[DEBUG MODE]\n");
	printf("Compile: %s %s\n", __DATE__, __TIME__);
#endif

	printf("Version: %d.%d.%d\n", VER_REL, VER_MAJOR, VER_MINOR);
	printf("Database> ");
	dbfile_t *mdb = open_dbfile(get_input(buffer, 32, TRUE));
	commit_db(mdb);

	for(;;){
		printf("valca> ");

		c = get_input(buffer, 64, TRUE);
		if(!strcmp("quit", c)||!strcmp("exit", c)||!strcmp("\\q", c)){
			break;
		}
		if(!strcmp("help", c)){
			printf("COMMANDS:\n");
			printf("COMMIT        Commit file to disk\n");
			printf("COUNT         Show row count\n");
			printf("TRUNCATE      Delete all keys\n");
			printf("UPDATE        Update key value\n");
			printf("INSERT        Insert key\n");
			printf("DELETE \\\n");
			printf("  COLUMN      Delete column\n");
			printf("  ROW         Delete row\n");
			printf("ALTER \\\n");
			printf("  NAME        Change column name\n");
			printf("  LEFT        Shift column left\n");
			printf("  RIGHT       Shift column right\n");
			printf("SELECT        Select value from\n");
			printf("ADD \\\n");
			printf("  COLUMN      Add column\n");
			printf("SHOW \\\n");
			printf("  COLUMNS     Show all columns\n");
			printf("  TREE        Show storage tree\n");
			printf("  STATUS      Show database info\n");
			printf("  TABLE       Show dataset as table\n");
			printf("FREE \\\n");
			printf("  COLUMNS     Columns freelist\n");
			printf("  NODE        Node freelist\n");
			printf("  DATAFIELDS  Payload freelist\n");
			printf("EXIT          Quit the shell\n");
		}
		if(!strcmp("commit", c)){
			commit_db(mdb);
		}
		if(!strcmp("count", c)){
			printf("Total rows: %d\n", mdb->k_cnt);
		}
		if(!strcmp("truncate", c)){
			truncate_root(mdb);
		}
		if(!strcmp("update", c)){
			char tmp[32];
			printf(">psid: ");
			c = get_input(tmp, 32, FALSE);
			int key = atoi(tmp);
			char tmpcolname[32];
			printf(">column: ");
			c = get_input(tmpcolname, 32, FALSE);
			int idx = get_column_idx(mdb, tmpcolname);
			printf(">value: ");
			c = get_input(tmp, 32, FALSE);
			change(mdb, key, (void*)tmp, idx);
		}
		if(!strcmp("insert", c)){
			if(!mdb->c_cnt){
				printf("Cannot insert without column\n");
			}else{
				char tmp[32];
				printf(">psid[%d]: ", mdb->seq_cnt);
				c = get_input(tmp, 32, FALSE);
				int key;
				if(!strlen(tmp)){
					key = mdb->seq_cnt++;
				}else{
					key = atoi(tmp);
				}
				column_t col;
				read_column(mdb, mdb->data.c_root, &col);
				printf(">%s<%s(%d)>: ", col.name, get_datatype_name(col.d_type), col.maxsize);
				c = get_input(tmp, 32, FALSE);
				if(get_datatype(col.d_type).size == -1) tmp[col.maxsize] = '\0';
				if(col.usign) printf("<> %d\n", atoi(tmp));
					//if(atoi())
				if(insert_key(mdb, key, (void*)tmp) == SUCCESS){
					result_t rs = search_key(mdb, key);
					if(rs.rstat == SUCCESS){
						char tmp[32];
						int i = 1;
						while(col.c_next != EMPTY){
							read_column(mdb, col.c_next, &col);
							printf(">%s<%s(%d)>: ", col.name, get_datatype_name(col.d_type), col.maxsize);
							c = get_input(tmp, 32, FALSE);
							add_field(mdb, rs.fpos, rs.idx, (void*)tmp, i);
							i++;
						}
					}
				}
			}
		}
		if(!strcmp("delete", c)){
			printf(">");
			c = get_input(buffer, 64, TRUE);
			if(!strcmp("column", c)){
				char tmpcolname[32];
				printf(">column: ");
				c = get_input(tmpcolname, 32, FALSE);
				int idx = get_column_idx(mdb, tmpcolname);
				delete_column(mdb, idx);
			}
			if(!strcmp("row", c)){
				char tmp[32];
				printf(">psid: ");
				c = get_input(tmp, 32, FALSE);
				int key = atoi(tmp);
				result_t rs = search_key(mdb, key);
				if(rs.rstat == SUCCESS){
					int i;
					for(i=mdb->c_cnt; i>1; i--){
						delete_field(mdb, rs.fpos, rs.idx, (i-1));
					}
					delete_key(mdb, key);
				}
			}
		}
		if(!strcmp("alter", c)){
			printf(">");
			c = get_input(buffer, 64, TRUE);
			if(!strcmp("name", c)){
				printf(">column: ");
				char tmpcolname[32];
				c = get_input(tmpcolname, 32, FALSE);
				int idx = get_column_idx(mdb, tmpcolname);
				printf(">new name: ");
				c = get_input(tmpcolname, 32, FALSE);
				rename_column(mdb, tmpcolname, idx);
			}
			if(!strcmp("left", c)){
				char tmpcolname[32];
				printf(">column: ");
				c = get_input(tmpcolname, 32, FALSE);
				int idx = get_column_idx(mdb, tmpcolname);
				shift_column_left(mdb, idx);
			}
			if(!strcmp("right", c)){
				char tmpcolname[32];
				printf(">column: ");
				c = get_input(tmpcolname, 32, FALSE);
				int idx = get_column_idx(mdb, tmpcolname);
				shift_column_right(mdb, idx);
			}
		}
		if(!strcmp("select", c)){
			printf(">");
			char tmp[16];
			printf(">psid: ");
			c = get_input(tmp, 32, FALSE);
			int key = atoi(tmp);
			result_t rs = search_key(mdb, key);
			if(rs.rstat == SUCCESS){
				found(mdb, rs.fpos, rs.idx);
			}
		}
		if(!strcmp("add", c)){
			printf(">");
			c = get_input(buffer, 64, TRUE);
			if(!strcmp("column", c)){
				char colname[32];
				DTYPE type;
				int size;
				bool usign = FALSE;
				int idx;
				printf(">name: ");
				c = get_input(colname, 32, FALSE);
				printf(">type: ");
				char tmptype[32];
				c = get_input(tmptype, 32, FALSE);
				type = get_datatype_idx(tmptype);
				if(type == EMPTY){
					printf("Unkown datatype\n");
					continue;
				}
				size = get_datatype(type).size;
				if(size == EMPTY){
					printf(">size: ");
					char tmpsize[16];
					c = get_input(tmpsize, 16, FALSE);
					size = atoi(tmpsize);
				}
				if(get_datatype(type).signness){
					printf(">unsigned: ");
					char tmpsign[4];
					c = get_input(tmpsign, 4, FALSE);
					if(!strcmp("y", tmpsign)){
						usign = TRUE;
					}
				}
				printf(">before: ");
				char tmpcolname[32];
				c = get_input(tmpcolname, 32, FALSE);
				idx = get_column_idx(mdb, tmpcolname);
				add_column(mdb, colname, size, type, usign, idx);
			}
		}
		if(!strcmp("show", c)){
			printf(">");
			c = get_input(buffer, 64, TRUE);
			if(!strcmp("columns", c)){
				printf("Idx   Offset   Psid         Columnname  Size      Type    Unsigned    Next\n");
				printf("--------------------------------------------------------------------------\n");
				print_column(mdb, mdb->data.c_root, 0);
			}
			if(!strcmp("tree", c)){
				print_tree(mdb, mdb->data.n_root, 0);
			}
			if(!strcmp("status", c)){
				print_status(mdb);
			}
			if(!strcmp("table", c)){
				print_table(mdb);
			}
		}
		if(!strcmp("free", c)){
			printf(">");
			c = get_input(buffer, 64, TRUE);
			if(!strcmp("columns", c)){
				printf("Idx   Offset   Psid         Columnname  Size      Type    Unsigned    Next\n");
				printf("--------------------------------------------------------------------------\n");
				print_column(mdb, mdb->data.c_free, 0);
			}
			if(!strcmp("node", c)){
				print_tree(mdb, mdb->data.n_free, 0);
			}
			if(!strcmp("datafields", c)){
				print_datafield(mdb, mdb->data.d_free);
			}
		}
	}

	commit_db(mdb);
	close_dbfile(mdb->vfp);
	close_db(mdb);

	return 0;
}
Пример #2
0
//对比两个数据表格,找出差异,然后找出差异的SQL
int ZCE_General_Config_Table::compare_table(const char *old_db,
                                            const char *new_db,
                                            unsigned int table_id,
                                            std::string *update_sql)
{
    int ret = 0;



    //读取旧数据
    ret = open_dbfile(old_db, true , false);
    if (0 != ret)
    {
        return ret;
    }
    ARRARY_OF_AI_IIJIMA_BINARY old_ai_iijma;
    ret = select_array(table_id,
                       0,
                       0,
                       &old_ai_iijma);
    if (0 != ret)
    {
        return ret;
    }

    //读取新数据
    ret = open_dbfile(new_db, true, false);
    if (0 != ret)
    {
        return ret;
    }
    ARRARY_OF_AI_IIJIMA_BINARY new_ai_iijma;
    ret = select_array(table_id,
                       0,
                       0,
                       &new_ai_iijma);
    if (0 != ret)
    {
        return ret;
    }

    //把新旧数据排序,方便比较
    std::sort(old_ai_iijma.begin(), old_ai_iijma.end());
    std::sort(new_ai_iijma.begin(), new_ai_iijma.end());

    update_sql->reserve(MAX_SQLSTRING_LEN);

    //两个都有序,找出差异的元素
    size_t p = 0, q = 0;
    for (; p < old_ai_iijma.size();)
    {
        //如果对比的两者相等
        if (old_ai_iijma[p].index_1_ == new_ai_iijma[q].index_1_ &&
            old_ai_iijma[p].index_2_ == new_ai_iijma[q].index_2_)
        {
            if (old_ai_iijma[p].ai_data_length_ == new_ai_iijma[q].ai_data_length_ &&
                0 == ::memcmp(old_ai_iijma[p].ai_iijima_data_,
                              new_ai_iijma[q].ai_iijima_data_,
                              old_ai_iijma[p].ai_data_length_))
            {
                //old[p] = new[q]相同,
                ++p;
                ++q;
            }
            else
            {
                //old[p] != new[q],对比的记录不相同,REPLACE
                sql_replace_one(table_id,
                                new_ai_iijma[q].index_1_,
                                new_ai_iijma[q].index_2_,
                                new_ai_iijma[q].ai_data_length_,
                                new_ai_iijma[q].ai_iijima_data_,
                                new_ai_iijma[q].last_mod_time_);
                *update_sql += sql_string_;

                ++p;
                ++q;
            }

        }
        //继续在 new 里面寻找 old[p]
        else
        {
            size_t r = q++;
            for (; r < new_ai_iijma.size();)
            {
                if (old_ai_iijma[p].index_1_ == new_ai_iijma[r].index_1_ &&
                    old_ai_iijma[p].index_2_ == new_ai_iijma[r].index_2_)
                {
                    bool r_is_equal = false;
                    if (old_ai_iijma[p].ai_data_length_ == new_ai_iijma[r].ai_data_length_ &&
                        0 == ::memcmp(old_ai_iijma[p].ai_iijima_data_,
                                      new_ai_iijma[r].ai_iijima_data_,
                                      old_ai_iijma[p].ai_data_length_))
                    {
                        r_is_equal = true;
                    }

                    //index相同的位置的数据是否一致的,决定这个位置是否更新
                    size_t end_pos = r_is_equal ? r - 1 : r;
                    for (size_t s = q; s < end_pos; ++s)
                    {
                        //new[q] 到 new[r] 都是新赠的,REPLACE
                        sql_replace_one(table_id,
                                        new_ai_iijma[s].index_1_,
                                        new_ai_iijma[s].index_2_,
                                        new_ai_iijma[s].ai_data_length_,
                                        new_ai_iijma[s].ai_iijima_data_,
                                        new_ai_iijma[s].last_mod_time_);
                        *update_sql += sql_string_;
                    }

                    break;

                }
            }

            if (r < new_ai_iijma.size())
            {
                ++p;
                q = r++;
            }
            //old[p] 是多出的,DELETE
            else
            {
                sql_delete_one(table_id, old_ai_iijma[p].index_1_, old_ai_iijma[p].index_2_);
                *update_sql += sql_string_;
                ++p;
            }
        }

    }

    //如果new[q] 不是 最后一个节点,那么new[q]到尾部都是新增的数据 REPLACE
    for (; q < new_ai_iijma.size(); ++q)
    {
        //new[q] 到 new[r] 都是新赠的,REPLACE
        sql_replace_one(table_id,
                        new_ai_iijma[q].index_1_,
                        new_ai_iijma[q].index_2_,
                        new_ai_iijma[q].ai_data_length_,
                        new_ai_iijma[q].ai_iijima_data_,
                        new_ai_iijma[q].last_mod_time_);
        *update_sql += sql_string_;
    }

    return 0;
}