inittab.c
来自「db.* (pronounced dee-be star) is an adva」· C语言 代码 · 共 1,123 行 · 第 1/3 页
C
1,123 行
else atow(q, p, flen); psp_freeMemory(q, 0); }#endif if (stat == S_OKAY) { curr_dbt->Objnames = p; getnames(task->record_names, &p, curr_dbt->rt_offset, (short) (curr_dbt->rt_offset + curr_dbt->Size_rt)); getnames(task->field_names, &p, curr_dbt->fd_offset, (short) (curr_dbt->fd_offset + curr_dbt->Size_fd)); getnames(task->set_names, &p, curr_dbt->st_offset, (short) (curr_dbt->st_offset + curr_dbt->Size_st)); flen -= p - curr_dbt->Objnames; } } else { DB_TCHAR *tmp = p; skipnames(&p, (short) (curr_dbt->Size_rt + curr_dbt->Size_fd + curr_dbt->Size_st)); flen -= p - tmp; } if (stat == S_OKAY) { if (flen == 16) { if (!sg) stat = S_INVENCRYPT; else if (!(*sg->chk)(sg->data, p)) stat = S_INVENCRYPT; } else if (sg) stat = S_INVENCRYPT; } } psp_fileClose(dbf); if (stat != S_OKAY) return dberr(stat); return S_OKAY;}static int get_sc_dict_sizes(int dbt_lc, struct DICT_SIZE * dict_size, const DB_SCHEMA * sc, DB_TASK * task){ DB_ENTRY * curr_dbt = task->curr_db_table + dbt_lc; curr_dbt->db_ver = sc->sc_version; dict_size->Page_size = sc->sc_page_size; dict_size->Size_ft = sc->sc_nfiles; dict_size->Size_rt = sc->sc_nrecords; dict_size->Size_fd = sc->sc_nfields; dict_size->Size_st = sc->sc_nsets; dict_size->Size_mt = sc->sc_nmembers; dict_size->Size_srt = sc->sc_nsorts; dict_size->Size_kt = sc->sc_nkeys; return task->db_status;}static int load_schema(int dbt_lc, const SG *sg, const DB_SCHEMA * sc, DB_TASK *task){ DB_ENTRY * curr_dbt = task->curr_db_table + dbt_lc; int i, n; int nlen; DB_TCHAR * p; FILE_ENTRY * fptr; union { V300_FILE_ENTRY * v300; V301_FILE_ENTRY * v301; V500_FILE_ENTRY * v500; U500_FILE_ENTRY * u500; } fe; fe.v300 = (V300_FILE_ENTRY*)sc->sc_files; fptr = &task->file_table[curr_dbt->ft_offset]; for (i = 0; i < curr_dbt->Size_ft; ++i, ++fptr) { switch (curr_dbt->db_ver) { case 300: atot(fe.v300->v3_ft_name, fptr->ft_name, FILENMLEN); fptr->ft_status = fe.v300->v3_ft_status; fptr->ft_type = fe.v300->v3_ft_type; fptr->ft_slots = fe.v300->v3_ft_slots; fptr->ft_slsize = fe.v300->v3_ft_slsize; fptr->ft_pgsize = fe.v300->v3_ft_pgsize; fptr->ft_flags = fe.v300->v3_ft_flags; fptr->ft_pctincrease = 0; fptr->ft_initial = 0; fptr->ft_next = 0; fptr->ft_index = -1; fptr->ft_lmtimestamp = 0; fptr->ft_cachetimestamp = 0; fe.v300++; break; case 301: atot(fe.v301->v3_ft_name, fptr->ft_name, FILENMLEN); fptr->ft_status = fe.v301->v3_ft_status; fptr->ft_type = fe.v301->v3_ft_type; fptr->ft_slots = fe.v301->v3_ft_slots; fptr->ft_slsize = fe.v301->v3_ft_slsize; fptr->ft_pgsize = fe.v301->v3_ft_pgsize; fptr->ft_flags = fe.v301->v3_ft_flags; fptr->ft_pctincrease = fe.v301->v3_ft_pctincrease; fptr->ft_initial = fe.v301->v3_ft_initial; fptr->ft_next = fe.v301->v3_ft_next; fptr->ft_index = -1; fptr->ft_lmtimestamp = 0; fptr->ft_cachetimestamp = 0; fe.v301++; break; case 500: atot(fe.v500->v5_ft_name, fptr->ft_name, FILENMLEN); fptr->ft_status = fe.v500->v5_ft_status; fptr->ft_type = fe.v500->v5_ft_type; fptr->ft_slots = fe.v500->v5_ft_slots; fptr->ft_slsize = fe.v500->v5_ft_slsize; fptr->ft_pgsize = fe.v500->v5_ft_pgsize; fptr->ft_flags = fe.v500->v5_ft_flags; fptr->ft_pctincrease = fe.v500->v5_ft_pctincrease; fptr->ft_initial = fe.v500->v5_ft_initial; fptr->ft_next = fe.v500->v5_ft_next; fptr->ft_index = -1; fptr->ft_lmtimestamp = 0; fptr->ft_cachetimestamp = 0; fe.v500++; break; case -500:#ifdef UNICODE wcsncpy(fptr->ft_name, fe.u500->v5_ft_name, FILENMLEN);#else wtoa(fe.u500->v5_ft_name, fptr->ft_name, FILENMLEN);#endif fptr->ft_status = fe.u500->v5_ft_status; fptr->ft_type = fe.u500->v5_ft_type; fptr->ft_slots = fe.u500->v5_ft_slots; fptr->ft_slsize = fe.u500->v5_ft_slsize; fptr->ft_pgsize = fe.u500->v5_ft_pgsize; fptr->ft_flags = fe.u500->v5_ft_flags; fptr->ft_pctincrease = fe.u500->v5_ft_pctincrease; fptr->ft_initial = fe.u500->v5_ft_initial; fptr->ft_next = fe.u500->v5_ft_next; fptr->ft_index = -1; fptr->ft_lmtimestamp = 0; fptr->ft_cachetimestamp = 0; fe.u500++; break; } } n = curr_dbt->Size_rt * sizeof(RECORD_ENTRY); memcpy(&task->record_table[curr_dbt->rt_offset], sc->sc_records, n); if (curr_dbt->Size_fd) { n = curr_dbt->Size_fd * sizeof(FIELD_ENTRY); memcpy(&task->field_table[curr_dbt->fd_offset], sc->sc_fields, n); } if (curr_dbt->Size_st) { n = curr_dbt->Size_st * sizeof(SET_ENTRY); memcpy(&task->set_table[curr_dbt->st_offset], sc->sc_sets, n); } if (curr_dbt->Size_mt) { n = curr_dbt->Size_mt * sizeof(MEMBER_ENTRY); memcpy(&task->member_table[curr_dbt->mt_offset], sc->sc_members, n); } if (curr_dbt->Size_srt) { n = curr_dbt->Size_srt * sizeof(SORT_ENTRY); memcpy(&task->sort_table[curr_dbt->srt_offset], sc->sc_sorts, n); } if (curr_dbt->Size_kt) { n = curr_dbt->Size_kt * sizeof(KEY_ENTRY); memcpy(&task->key_table[curr_dbt->kt_offset], sc->sc_keys, n); } if (sc->sc_names && (task->dboptions & READNAMES)) { nlen = vtstrlen(sc->sc_names); if ((p = (DB_TCHAR *) psp_cGetMemory(nlen, 0)) == NULL) return dberr(S_NOMEMORY); if (task->dboptions & READNAMES) { curr_dbt->Objnames = p; getnames(task->record_names, &p, curr_dbt->rt_offset, (short) (curr_dbt->rt_offset + curr_dbt->Size_rt)); getnames(task->field_names, &p, curr_dbt->fd_offset, (short) (curr_dbt->fd_offset + curr_dbt->Size_fd)); getnames(task->set_names, &p, curr_dbt->st_offset, (short) (curr_dbt->st_offset + curr_dbt->Size_st)); } else { DB_TCHAR *tmp = p; skipnames(&p, (short) (curr_dbt->Size_rt + curr_dbt->Size_fd + curr_dbt->Size_st)); } } if (sc->sc_nsgdata == 16 && sc->sc_sgdata) { /* TODO: I don't know if SG seed should be malloc()ed? */ DB_BYTE sg_data[16]; memcpy(sg_data, sc->sc_sgdata, 16); if (!sg) return dberr(S_INVENCRYPT); else if (!(*sg->chk)(sg->data, p)) return dberr(S_INVENCRYPT); } else if (sg) return dberr(S_INVENCRYPT); return S_OKAY;}/* ====================================================================== Initialize database tables*/int INTERNAL_FCN inittab(DB_TASK *task, const SG *sg, const DB_SCHEMA * sc){ register int dbt_lc; register short i; int stat = S_OKAY; short key_offset; short key_count; short Max_Size_ft = 0; short maxsize; int is_query_db; FILE_ENTRY *fptr; RECORD_ENTRY *rec_ptr; SET_ENTRY *set_ptr; FIELD_ENTRY *fld_ptr; MEMBER_ENTRY *mem_ptr; SORT_ENTRY *srt_ptr; KEY_ENTRY *key_ptr; DB_ENTRY *curr_dbt; struct DICT_SIZE dict_size; DB_TCHAR dbname[FILENMLEN]; /* Temporary working space */ DB_TCHAR dbfile[FILENMLEN]; /* initialize (merged) dictionary values */ if (task->no_of_dbs == 1) task->db_tsrecs = task->db_tssets = FALSE; key_offset = 0; key_offset = (short) task->no_of_keys; /* compute individual dictionary sizes and offsets */ for (dbt_lc = task->old_no_of_dbs, curr_dbt = task->curr_db_table = &task->db_table[task->old_no_of_dbs]; dbt_lc < task->no_of_dbs; ++dbt_lc, ++curr_dbt, ++task->curr_db_table) { if (sc == NULL) stat = get_dbd_dict_sizes(dbt_lc, &dict_size, task); else stat = get_sc_dict_sizes(dbt_lc, &dict_size, sc, task); if (stat != S_OKAY) return task->db_status; if (dict_size.Size_ft > Max_Size_ft) Max_Size_ft = dict_size.Size_ft; curr_dbt->Page_size = dict_size.Page_size; curr_dbt->Size_ft = dict_size.Size_ft; curr_dbt->Size_rt = dict_size.Size_rt; curr_dbt->Size_fd = dict_size.Size_fd; curr_dbt->Size_st = dict_size.Size_st; curr_dbt->Size_mt = dict_size.Size_mt; curr_dbt->Size_srt = dict_size.Size_srt; curr_dbt->Size_kt = dict_size.Size_kt; curr_dbt->sysdba = NULL_DBA; /* update merged dictionary offsets and sizes */ if (curr_dbt->Page_size > task->page_size) task->page_size = curr_dbt->Page_size; curr_dbt->ft_offset = task->size_ft; task->size_ft += curr_dbt->Size_ft; curr_dbt->rt_offset = task->size_rt; task->size_rt += curr_dbt->Size_rt; curr_dbt->fd_offset = task->size_fd; task->size_fd += curr_dbt->Size_fd; curr_dbt->st_offset = task->size_st; task->size_st += curr_dbt->Size_st; curr_dbt->mt_offset = task->size_mt; task->size_mt += curr_dbt->Size_mt; curr_dbt->srt_offset = task->size_srt; task->size_srt += curr_dbt->Size_srt; curr_dbt->kt_offset = task->size_kt; task->size_kt += curr_dbt->Size_kt; } /* allocate dictionary space */ if (alloc_dict(task, sg) != S_OKAY) return task->db_status; /* read in and adjust dictionary entries for each database */ for (dbt_lc = task->old_no_of_dbs, curr_dbt = task->curr_db_table = &task->db_table[task->old_no_of_dbs]; dbt_lc < task->no_of_dbs; ++dbt_lc, ++curr_dbt, ++task->curr_db_table) { /* special check for db_query temporary database */ is_query_db = (vtstricmp(curr_dbt->db_name, DB_TEXT("db_query")) == 0); if (sc == NULL) stat = load_dbd(dbt_lc, sg, task); else stat = load_schema(dbt_lc, sg, sc, task); if (stat != S_OKAY) return task->db_status; maxsize = 0; fptr = &task->file_table[curr_dbt->ft_offset]; for (i = 0; i < curr_dbt->Size_ft; i++, fptr++) { if (fptr->ft_pgsize > maxsize) maxsize = fptr->ft_pgsize; } if (maxsize > task->enc_size) { task->enc_buff = psp_extendMemory(task->enc_buff, maxsize, 0); task->enc_size = maxsize; } curr_dbt->key_offset = key_offset; /* update file table path entries */ if (curr_dbt->db_path[0] || task->dbfpath[0]) { for ( i = 0, fptr = &task->file_table[curr_dbt->ft_offset]; i < curr_dbt->Size_ft; ++i, ++fptr) { /* Construct the data/key file name */ if (curr_dbt->db_path[0]) vtstrcpy(dbname, curr_dbt->db_path); else dbname[0] = DB_TEXT('\0'); if (vtstrlen(dbname) + vtstrlen(curr_dbt->db_name) >= FILENMLEN + 4) return (dberr(S_NAMELEN)); vtstrcat(dbname, curr_dbt->db_name); if (con_dbf(dbfile, fptr->ft_name, dbname, get_element(task->dbfpath, dbt_lc), task) != S_OKAY) return (task->db_status); /* Save new name in dictionary */ vtstrcpy(fptr->ft_name, dbfile); } } /* make db_query's files temporary so they don't get sent to the lock manager. */ if (is_query_db) { for ( i = 0, fptr = &task->file_table[curr_dbt->ft_offset];
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?