Minn suġġett tar-rivista għall-prattika tal-proġett
Paġni ta' servizz u paġni tekniċi relevanti għall-artiklu
Hafna applikazzjonijiet speċjalizzati Delphi twaħħlu b’tabelli Paradox u bil-Borland Database Engine (BDE) għax dak kien standard pragmatiku: lokali, mgħaġġel biex tibda, ftit infrastruttura. Fil-prattika dawn is-sistemi jaħdmu spiss produttivament sa llum – inkluż reporting, stampa ta’ etiketti, import/export, batch-jobs, tabelli ta’ storja u loġika speċifika li tħarbat fil-aċċess tad-dejta matul is-snin. Għalhekk migrazzjoni mhix biss esportazzjoni tad-dejta, iżda ristrutturar kontrollat: mudell tad-dejta, mġiba SQL, effetti sekondarji fil-kodiċi u proċessi operattivi jeħtieġu jinxtraw flimkien.
MariaDB spiss tkun għażla tajba bħala pjattaforma tal-mira meta tfittex operat robust għal ħafna utenti, transazzjonijiet ċari, backups ċentrali, replika, ġestjoni tad-drittijiet ċara u connettività għal portali web, servizzi jew REST-APIs. Il-isfida rari tkun l-installazzjoni tal-bażi tad-dejta – il-kost li joħroġ huwa fit-triq ta’ migrazzjoni sigura: kif jittrasferixxu tabelli, indici, primary keys, encodings, kampi ta’ data, valuri “vojt” u relazzjonijiet referenzjali b’mod korrett mingħajr ma l-loġika ta’ negozju tinqasam waqt l-operat?
Dan l-artiklu jiddeskrivi approċċi provati biex Paradox u BDE jiġu mġedda b’mod kontrollat f’MariaDB: bbażat teknika, gradwali u b’fokus fuq l-istabbiltà. Il-mira hi bażi sodisfaċenti għall-passi ta’ modernizzazzjoni li jmiss – pereżempju BDE-ablösung, bidla għal BDE-Ablösung mit nativer Anbindung, arkitettura Layer-3 ċara, REST-Server u clients multiplatform.
Għaliex Paradox/BDE-migrazzjoni hija aktar minn bidla ta’ database
Paradox bħala format ta’ fajl u BDE bħala saff ta’ aċċess jiffurmaw sistema sħiħa b’tipijiet ta’ idiosinkraziji li m’għandhomx jiġu “rekreawt” 1:1 f’MariaDB. Sintomi tipiku fil-ġurnata ta’ xogħol huma:
- Dipendenzi mhux trasparenti: statements SQL miffaħħrin fi forms, DataModules, reports u SQL dinamiku fi stringi, spiss mingħajr governance ċentrali.
- Imġiba “skont sensazzjoni”: ċerti filtri, ordinarji jew joins jaħdmu b’mod każwali għax Paradox/BDE huwa tolleranti jew jagħmel konverżjonijiet tipjati b’mod implisit.
- Limitazzjonijiet multi-utent: locks fuq fajls, degradasjoni tal-prestazzjoni fuq in-netwerk, problemi ta’ locking bi volum dejta jiżdied.
- Riskji ta’ manutenzjoni: dipendenzi fuq BDE, drivers antiki, deployment diffiċli fuq verżjonijiet moderni ta’ Windows, temi 64‑Bit/ARM64.
Migrazzjoni kontrollata ma tieħu dawn il-punti bħala effett sekondarju iżda bħala kriterji ta’ mira. MariaDB ma tkunx biss “database ġdida”, iżda opportunità biex tineħħa l-saff tal-aċċess tad-dejta, ittejjeb l-integrità tan-negozju u toħloq punti ta’ konnessjoni.
Mira: MariaDB bħala bażi data stabbli għal Desktop, Services u Portali
Mira sensata għal applikazzjonijiet B2B tipikament tinkludi tliet livelli:
- Bażi tad-dejta (MariaDB): konsegwenti fil-ħażna tad-dejta, indici, constraints, transazzjonijiet, utenti/ruoli, backups.
- Loġika tan-negozju (Server/Services): validazzjonijiet, workflows, importers, scheduler, APIs. B’mod opzjonali bħala REST-Server, Windows- jew Linux-Services.
- Clients (VCL/FMX/Web): interface tal-utent, reports, partijiet offline, integrazjonijiet. Ideali b’kontratti ċari lejn il-loġika tan-negozju.
Skont il-punt ta’ partida ma jistax ikun meħtieġ li kollox jitwettaq immedjatament. Iżda l-migrazzjoni għandha tiġi pjanifikata b’mod li ma tfixkilx triq lejn arkitettura nadifa. Min jieħu tabelli biss llum u filgħodu jerġa’ jikteb direttament fil-database minn kull form, jista’ jkollu MariaDB, imma r-riskji reali jibqgħu.
Stima tal-istat: X’għandu jkun migrazzjoni verament
Fl-ewwel pass trid tinżamm inventarju li jmur lil hinn minn “kemm tabelli”. F’proġetti Paradox/BDE hija tipika s-sitwazzjoni li l-bażi tad-dejta hija biss parti mill-verità. Punti importanti:
1) Tabelli, indici, “pseudo-keys”
Spiss nieqsa Primary Keys veri. Minflok jeżistu kombinazzjonijiet ta’ campi, numerazzjonijiet li m’għandhomx constraint uniku jew campi “Key” mibnija mill-applikazzjoni. F’MariaDB dawn jeħtieġu jsiru ċwievet uniku u affidabbli – għax b’hekk biss transazzjonijiet u integrità referenzjali jiswew xi jfissru.
2) Queries, blokki SQL dinamiku, Reports
BDE juża djaletti SQL differenti skont il-komponent u jippermetti statements “kreattivi”. Komponenti ta’ reporting (inklużi antiki) spiss għandhom definizzjonijiet SQL proprji. Migrazzjoni trid issib u tikkategorizza dawn is-sorsi: core-queries kritiċi, estratti rari, importazzjonijiet speċjali.
3) Encodings u karattri speċjali (Umlaute, ISO/ANSI, Unicode)
Ħafna applikazzjonijiet Paradox huma storikament bbażati fuq ANSI. Jekk l-applikazzjoni Delphi innifisha kienet immigra għal Unicode, toħloq kundizzjonijiet miksija: dejta fil-qosor f’encoding antik, UI f’Unicode, esportazzjonijiet jistennew Windows-1252. MariaDB għandha politika ċara hawn (tipikament utf8mb4), inkluż konverżjoni nadifa u testijiet għall-iżbalji “invisibbli” (konfronti, ordinazzjoni, trim/pad, karattri speċjali).
4) Valuri “vojt”, loġika NULL u kampi ta’ data
Paradox/BDE jifhem bosta każijiet speċjali: strings vojta minflok NULL, data 0, timestamps “vojta”, valori default li jitqiegħdu mill-UI. MariaDB tiddistingwi b’mod strett bejn NULL u vojt. Dan jinfluwenza klażoli WHERE, aggregazzjonijiet u ħlasijiet. Dawn id-differenzi jeħtieġu evalwazzjoni għal kull tabella/kamp.
5) Artefatti sekondarji: tabelli ta’ session, konfigurazzjoni lokali, cache
Spiss fil-istruttura Paradox hemm tabelli lokali għal riżultati interim, buffers ta’ esportazzjoni, layouts tal-utent jew parametri. Parti tibqa’ lokali (eż. layouts tal-UI), oħra għandha tkun ċentrali (eż. vawtxijiet tax-xogħol, stat, logs). Migrazzjoni hija opportunità biex dawn il-kategoriji jiġu separati b’mod ċar.
Pitfalls Paradox/BDE: differenzi teknici tipici
Biex il-migrazzjoni tkun pjanabbli, jiswa li nindirizzaw b’mod esplicitu d-differenzi ricorrenti.
Djalett SQL u operatori
BDE/Paradox-SQL mhuwiex identiku ma’ MySQL/MariaDB-SQL. Differenzi jidhru f’funzjonijiet ta’ data, funzjonijiet ta’ string, outer joins (storikament), logika Like/mask u konverżjonijiet tipi implikiti. Approċċ kontrollat jissostitwixxi “jista’ jaħdem” b’regoli ċari: liema statements jiġu portjati, liema jiġu riskritti b’mod konsxju, u liema jiddaħħlu fi Views/Stored Procedures (jekk sensibbli).
Ordinazzjoni u collation
F’Paradox l-ordni u l-case-sensitivity spiss jidhru differenti milli f’MariaDB, speċjalment għal umlaute. F’MariaDB il-collation (eż. utf8mb4_german2_ci vs. utf8mb4_unicode_ci) jiddetermina t-tul tal-komparazzjoni u l-ordni. Dan m’huwiex punt akkademiku: jinfluwenza dedup, funzioni ta’ tfittxija u l-imġiba ta’ Unique-Constraints.
Autoincrement u ċirkolazzjoni tan-numri
Paradox għandu campi autoincrement, imma applikazzjonijiet spiss jużaw ċirkoli numeri proprji (numri ta’ dokumenti, ordnijiet) b’loġika speċjali. F’MariaDB għandu jinqasam b’mod ċar:
- Key tekniċi: AUTO_INCREMENT (jew UUID, skont l-arkitettura) għal relazzjonijiet.
- Numru tan-negozju: ċirkolu numeriku proprju b’protezzjoni transazzjonali, possibbilment għal kull mandant/perjodu.
Min jipprova jżid numru tan-negozju bħala key tekniku jitolbu xogħolijiet ta’ ristrutturazzjoni kostużi wara.
Locking u transazzjonijiet
It-tibdil minn aċċess fuq fajl għal server veru huwa vantaġġ, imma jikkawża bidliet fl-imġiba. F’MariaDB transazzjonijiet (InnoDB) huma ċentrali. Trid tiddeċiedi fejn jinsabu l-bounds tal-transazzjoni: per dialog, per operazzjoni ta’ ħażna jew per batch. Importanti partikularment: transazzjonijiet twal u “modus edit” li jdumu minuti huma komuni f’dinja Paradox, iżda fuq server jistgħu jġibu locking issues, deadlocks u replika lag. Spiss trid tadatta l-mod ta’ xogħol jew l-UI bħala parti mill-migrazzjoni.
Modell ta’ xogħol: migrazzjoni kontrollata f’fazi minflok Big Bang
F’ambjenti B2B l-istabbiltà operattiva hija spiss aktar importanti minn tibdil rapidu. Triq gradwali tnaqqas ir-riskju għax il-business u l-IT jistgħu jivvalidaw iterattivament.
Fażi 1: Trasferiment tal-mudell tad-dejta bil-mapping, mingħajr ristrutturazzjoni tal-kodiċi
Fil-pass inizjali jinbena schema MariaDB li jirrifletti s-struttura Paradox – iżda diġà skont prinċipji tal-mira: Primary Keys, indici, tipi ta’ data raġonevoli, utf8mb4, InnoDB. Parallelament jinħolqu proċessi ta’ import riproduċibbli (skripts/tools) li jistgħu jerġgħu jitwettqu. Importanti hawn il-ri-produkttività għax migrazzjoni qatt ma tkun “lesta” fil-mara tal-ewwel run.
Deliverables tipikament f’din il-fażi huma:
- Definizzjoni ta’ schema (DDL) versionata (eż. f’Git)
- Lista ta’ mapping tal-kamp (Paradox → MariaDB) inklużi regoli ta’ konverżjoni
- Proċedura ta’ import bi logging (numru ta’ rekords, żbalji, outliers)
- Reportijiet inizjali ta’ validazzjoni (counts, sums, checksums)
Fażi 2: BDE-Ablösung fil-aċċess tad-dejta (eż. ma’ FireDAC)
Pass modernizzanti essenzjali huwa deċoupling mill-BDE. F’proġetti Delphi BDE-Ablosung mit nativer Anbindung huwa mezz provat għax jipprovdi drivers moderni, transazzjonijiet, parameter binding u komponenti uniformi għal backends SQL differenti. Mhux il-mira biss li “tneħħi BDE”, iżda kif il-kodiċi jidher wara: aċċess ċentrali, trattament żbalji ċar, parametri nadif minflok concatenazzjoni ta’ stringi.
Attivitajiet tipikament f’din il-fażi:
- Bħala sostituzzjoni ta’ TTable/TQuery bl-queries u DataSets ta’ FireDAC
- Introdotti saff ta’ Data-Access (DAL) bħala bażi għal arkitettura Layer-3 li jmiss
- Standardizzazzjoni ta’ scopes ta’ transazzjoni (Commit/Rollback)
- Review tal-SQL: adattament ta’ djalett, parametri, paging, joins
Jekk l-applikazzjoni trid tiġi modernizzata fit-tul, dan il-pass huwa spiss aktar importanti mill-migrazzjoni tad-dejta purament. Jinħoloq il-libertà teknika għas-64‑Bit, verżjonijiet moderni ta’ Windows u pipelines ta’ deployment nadifa.
Fażi 3: Operazzjoni parallela u aċċettazzjoni tan-negozju mingħajr interruzzjoni
Għas-sistemi kritiċi huwa sensat operat parallelu: MariaDB tinbena u tiġi mimlija ċiklikament (jew inkrementalment) filwaqt li s-sistema antika tibqa’ taħdem. Dan jippermetti lill-business jikkonfronta rapporti, jidentifika edge-cases u jittestja l-pjattaforma ġdida taħt load. Il-operat parallelu jista’ jsir b’modijiet differenti:
- Replika read-only għar-preparazzjoni ta’ reporting/BI
- “Dual Write” f’oqsma definiti (jekk tinstab maniġġabbli)
- Migrazzjoni f’working day b’diversi runijiet dry u checklist ċara għall-cutover
Importanti mhux iżjedma l-komplessità: Dual-Write jidher attraenti iżda huwa riskjuż jekk il-loġika tan-negozju ma tkunx ċentralizzata. Spiss run tal-cutover ripetibbli bil-validazzjoni tajba huwa aktar ekonomiku.
Fażi 4: Ottimizzazzjoni, integrità, prestazzjoni u proċessi operattivi
Wara l-cutover tibda fażi fejn MariaDB għandha turi l-vantaġġi tagħha: integrità referenzjali, indici performanti, permessi nadifa, monitoring, testijiet backup/restore. Hawn jidher spiss il-load reali tal-produzzjoni: rapporti twal, maski ta’ tfittxija b’indici ħżiena, batch-updates. Migrazzjoni kontrollata tippjana din il-fażi espliċitament minflok ma tħallaha tiżviluppa bħala xogħol mhux pjanifikat.
Tipi ta’ dejta u mapping: minn Paradox għal MariaDB mingħajr telf ta’ informazzjoni
Mapping tal-kamp huwa qalb il-migrazzjoni. Waħda mapping tipika (semplifikata) hija:
- Alpha / Memo: VARCHAR/TEXT (b’utf8mb4), validazzjoni tul u regoli ta’ trim
- Number: INT/BIGINT/DECIMAL skont firxa tal-valuri; kawtela ma’ deċimali impliċiti
- Date/Time: DATE/DATETIME/TIMESTAMP; regoli ċari għal “0-datum” kontra NULL
- Logical: BOOLEAN jew TINYINT(1) b’semantika ċara
- Currency: DECIMAL(…,2/4) minflok float biex tevita problemi ta’ round-off
Hemm importanza mhux biss fit-traduzzjoni tat-tipi, iżda fit-twaqqif ta’ regoli tan-negozju: kamp jista’ jkun NULL? Liema valori default huma koretti? Liema kombinazzjonijiet għandhom ikunu uniċi? Minn dan joħorġu constraints u indici. Dawn ir-regoli kienu spiss impliziti fl-UI jew fil-kodiċi Paradox/BDE – f’MariaDB, fejn sensibbli, għandhom isiru espliċiti.
Integrità: Primary Keys, Foreign Keys u indici uniċi
Hafna databases legacy jaħdmu snin sħaħ mingħajr integrità referenzjali – sakemm integreazzjonijiet, portali jew proċessi paralleli jidħlu fil-pitk. Ladarba jiġri dan il-kwalità tad-dejta ssir fattur limitanti. F’MariaDB tista’ tuża Foreign Keys, Unique Constraints u Checks (skont verżjoni/engine) biex issalvagwardja żbalji tad-dejta bl-ewwel ċekks.
Pass prattiku hu li tiġi introdotta l-integrità gradwalment:
- L-ewwel Primary Keys u indici uniċi fuq oġġetti ewlenin (klijenti, artikli, dokumenti)
- Imbagħad Foreign Keys f’oqsma stabbli
- Għal tabelli “storjani” bi dejta inċonċistenti: l-ewwel taħbiż, imbagħad constraints
Dan jonqos ir-riskju li cutover jispiċċa minn aljeni tal-passat u fl-istess ħin jtejjeb il-kundizzjoni ġenerali b’mod sinifikanti.
Prestazzjoni fil-prattika: x’jinbidel ma’ MariaDB
Sistemi Paradox/BDE spiss kienu ottimizzati għal “veloċità fuq fajl”: indici lokali, aċċess mgħaġġel tat-tabelli, ħafna filtri client-side. Ma’ MariaDB ix-xogħol jintbagħat lejn is-server. Dan hu tajjeb imma jeħtieġ strateġiji nadifa ta’ SQL u indici.
Falli tipici tal-prestazzjoni
- SELECT * minn tabelli kbar għax qabel kien “lokali” biżżejjed
- Filtrar client-side minflok WHERE fuq il-server
- Nuqqas ta’ indici komposti fuq kampi ta’ maski ta’ tfittxija (eż. mandant + status + data)
- LIKE ‚%test%‘ mingħajr strateġija ta’ fulltext adattata
Titjib imkejjel minflok “skont sensazzjoni”
Migrazzjoni kontrollata twaqqaf punti ta’ miżura kmieni: Slow Query Log, Explain-analises, load tests riproduċibbli. Dan hu partikolarment importanti jekk wara l-migrazzjoni jkunu pjanati komponenti oħra, bħal REST-Server jew Kundenportal, li joħolqu patterns ġodda ta’ aċċess (ħafna requests żgħar, paging, endpoints ta’ tfittxija).
Delphi-speċifiku: BDE-Ablösung, FireDAC u saffijiet ta’ aċċess nadifa
F’proġetti Delphi modernizzazzjoni teknika hija marbuta mill-qrib mal-aċċess tad-dejta. BDE mhijiex biss “driver”, iżda stil sħiħ ta’ aċċess (TTable, bbażat fuq rekord, navigazzjoni, filtri lokali). Migrazzjoni f’MariaDB hi mument xieraq biex tikkonsolida l-aċċess.
Mill-“DataSets everywhere” għall-aċċess kontrollat tad-dejta
Hafna applikazzjonijiet għandhom queries f’kull form. Dan skala ħażin mill-punt ta’ viżjoni tan-negozju u sigurtà. Approċċ provat huwa:
- Klassijiet ta’ repository/service ċentrali għall-oġġetti ewlenin
- Trattament uniformi tal-iżbalji u transazzjonijiet
- Queries parametrizzati (evita SQL Injection, uża plan-caching)
- Connection-pools jew connection-management konfigurabbli għas-servizzi
B’dan jinbena bażi għal arkitettura Layer-3 fejn UI, loġika tan-negozju u persistenzja jkunu separati b’mod nadif. Dan jgħin mhux biss fil-bidla tad-database, iżda wkoll fil-bini ta’ REST-Servers jew servizzi ħdejjin fil-futur.
Konnessjoni MariaDB ma’ FireDAC: punti li normalment jeħtieġu definizzjoni
F’proġetti dejjem jidhru l-istess mistoqsijiet: liema verżjoni ta’ driver (MySQL/MariaDB), liema għażliet SSL, liema settings ta’ timezone u data, liema settings Unicode? Dawn mhumiex dettalji żgħar għax għandhom impatt dirett fuq konsistenza tad-dejta (data/ħin), ordinazzjoni u sigurtà operattiva (TLS). Migrazzjoni kontrollata tistabbilixxi dawn il-parametri, tidokumentahom u tittestjahom bi dejta reali.
Cutover-Plan: data tal-cut, freeze tad-dejta, rollback – mingħajr sorpriżi
Cutover huwa proġett f’ruħu. Pjan tajjeb mhux biss jiddeskrivi “meta nibdlu”, iżda wkoll miżuri ta’ salvagwardja:
- Datafreeze: Minn meta l-anzjani sistema ma terġax tirreġistra dejta? Hemm proċeduri tal-emergenza?
- Import finali: Kemm idum realistikament? (dry-runs jagħtu n-numri.)
- Validazzjoni: Liema checks jridu jkunu ’l-ewwel jintlaħqu qabel il-frej (counts, sums, spot-checks, reports tan-negozju)?
- Rollback: Meta nagħmlu abort u kif imbagħad inkompliw?
- Komunikazzjoni: Min jagħti l-aċċettazzjoni? Min hu disponibbli fil-War Room?
Fil-kumpaniji medji roll-back spiss mhuwiex kwistjoni teknika biss, iżda organizzattiva. Għalhekk il-migrazzjoni trid tkun ippreparata hekk li l-cutover ma jkunx esperiment, iżda fluss imdawwar u provat.
Wara l-migrazzjoni: bażi għal REST, servizzi u multiplatform
Meta MariaDB tkun stabbli u l-ablösung ta’ BDE tkun saret b’mod nadif, jidhru għażliet ġodda: REST-APIs għal sistemi esterni, ħidma background bħala Windows- jew Linux-services, deċoupling tal-UI mill-loġika tan-negozju u, perspektivament, clients multiplatform. Spiss il-pass li jmiss huwa li tneħħi loġika tan-negozju mill-desktop biex iservi integrazzjonijiet (ERP/DMS/CRM) u portali b’mod kontrollat.
Huwa importanti: REST-Server mhuwiex “saff addizzjonali”, iżda deċiżjoni arkitettonika. Min jekk diġà kellu aċċess tad-dejta, validazzjoni u permessi konsolidati f’services/repositories, jista’ jiżviluppa APIs robusti b’mod ħafna aktar faċli.
Checklista prattika: X’għandek tiddetermina qabel tibda l-proġett
- Liema moduli huma kritiċi għall-business u jridu jaħdmu bla falliment fil-jum tal-cutover?
- Kif jidher il-volum reali tad-dejta (daqsijiet tat-tabelli, tkabbir, konċetti ta’ arkivju)?
- Liema reports jeħtieġu jkunu 1:1 identiċi, u liema jista’ jkunu mibdula jew migliorati?
- Liema integrazjonijiet jiddependu mis-sistema (esportazzjonijiet ta’ fajls, ODBC, Office, linji ta’ stampa)?
- Hemm multi-tenancy u jekk iva: kif ġie modellat illum?
- Liema rekwiżiti operattivi japplikaw (windows ta’ backup, ħin ta’ restore, permessi, audit)?
Dawn il-kwistjonijiet mhumiex burokrazija, iżda jipprevjenu li migrazzjoni tkun “teknikament lesta” iżda ma titqabbadx funzjonalment mill-business.
Kundlussjoni: Migrazzjoni kontrollata tfisser li tagħmel ir-riskji pjanabbli
Migrazzjoni kontrollata ta’ Paradox u BDE lejn MariaDB tfisser modernizzazzjoni tas-sistema bħala sħiħ: mudell tad-dejta, SQL, transazzjonijiet, encodings, saff ta’ aċċess u proċessi operattivi. Min jara l-bidla bħala esportazzjoni purament, spiss isib l-istess problemi li pperċepja biex jintefa’ – biss fuq server ġdid.
Approċċ gradwali b’import riproduċibbli, mapping nadif tal-kampi, validazzjoni kmieni u ablösung ċara ta’ BDE (eż. permezz ta’ FireDAC) jipprovdi bażi stabbli: għal operat multi-utent, integrazjonijiet, servizzi u l-passi li jmiss fil-Delphi Modernisierung.
Jekk trid tippjana l-migrazzjoni tiegħek b’mod professjonali u mingħajr interruzzjoni operattiva, nitkellmu bil-qari dwar is-sitwazzjoni tiegħek, ir-riskji u pjan realistik ta’ fasi: https://net-base-software-gmbh.de/kontakt/
Pass li jmiss
Meta suġġett jissarraf f’proġett reali, l-arkitettura, is-sistema eżistenti u l-operazzjoni għandhom jiġu kkunsidrati flimkien kmien.
Aħna nappoġġjaw mhux biss f'kwistjonijiet puntwali, iżda wkoll meta biċċiet ta' kodiċi sors, temi legacy jew ideat għal portali jridu jsiru proġett korporattiv stabbli u affidabbli.
- L-istat attwali, l-istat tal-mira u r-riskji tekniċi jiġu vvalutati flimkien.
- REST, aċċess għad-dejta, portali u Rollout mhux se jiġu posposti bħala konsegwenzi tardivi.
- Tara kmieni liema triq hija sostenibbli kemm mill‑punt ta’ vista ekonomiku kif ukoll mill‑punt ta’ vista operattiv.