| 919 | |
| 920 | |
| 921 | void SDW_start(thread_db* tdbb, const TEXT* file_name, |
| 922 | USHORT shadow_number, USHORT file_flags, bool delete_files) |
| 923 | { |
| 924 | /************************************** |
| 925 | * |
| 926 | * S D W _ s t a r t |
| 927 | * |
| 928 | ************************************** |
| 929 | * |
| 930 | * Functional description |
| 931 | * Commence shadowing on a previously created shadow file. |
| 932 | * |
| 933 | * <delete_files> is true if we are not actually starting shadowing, |
| 934 | * but deleting inaccessible shadow files. |
| 935 | * |
| 936 | **************************************/ |
| 937 | SET_TDBB(tdbb); |
| 938 | Database* dbb = tdbb->getDatabase(); |
| 939 | |
| 940 | SyncLockGuard guard(&dbb->dbb_shadow_sync, SYNC_EXCLUSIVE, "SDW_start"); |
| 941 | |
| 942 | USHORT header_fetched = 0; |
| 943 | |
| 944 | // check that this shadow has not already been started, |
| 945 | // (unless it is marked as invalid, in which case it may |
| 946 | // be an old shadow of the same number) |
| 947 | |
| 948 | Shadow* shadow; |
| 949 | for (shadow = dbb->dbb_shadow; shadow; shadow = shadow->sdw_next) |
| 950 | { |
| 951 | if ((shadow->sdw_number == shadow_number) && !(shadow->sdw_flags & SDW_INVALID)) |
| 952 | { |
| 953 | return; |
| 954 | } |
| 955 | } |
| 956 | |
| 957 | for (shadow = dbb->dbb_shadow; shadow; shadow = shadow->sdw_next) |
| 958 | { |
| 959 | if (shadow->sdw_number == shadow_number) |
| 960 | break; |
| 961 | } |
| 962 | |
| 963 | // check to see if the shadow is the same as the current database -- |
| 964 | // if so, a shadow file is being accessed as a database |
| 965 | |
| 966 | Firebird::PathName expanded_name(file_name); |
| 967 | ISC_expand_filename(expanded_name, false); |
| 968 | PageSpace* pageSpace = dbb->dbb_page_manager.findPageSpace(DB_PAGE_SPACE); |
| 969 | jrd_file* dbb_file = pageSpace->file; |
| 970 | |
| 971 | if (dbb_file && expanded_name == dbb_file->fil_string) |
| 972 | { |
| 973 | if (shadow && (shadow->sdw_flags & SDW_rollover)) |
| 974 | return; |
| 975 | |
| 976 | ERR_post(Arg::Gds(isc_shadow_accessed)); |
| 977 | } |
| 978 |
nothing calls this directly
no test coverage detected