~drizzle-trunk/drizzle/development

1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
1
/* Copyright (c) 2008 PrimeBase Technologies GmbH, Germany
2
 *
3
 * PrimeBase Media Stream for MySQL
4
 *
5
 * This program is free software; you can redistribute it and/or modify
6
 * it under the terms of the GNU General Public License as published by
7
 * the Free Software Foundation; either version 2 of the License, or
8
 * (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
 *
19
 * Original author: Paul McCullagh (H&G2JCtL)
20
 * Continued development: Barry Leslie
21
 *
22
 * 2007-06-15
23
 *
24
 * CORE SYSTEM STORAGE
25
 * Basic storage structures.
26
 *
27
 */
28
29
#include "CSConfig.h"
30
31
#include <assert.h>
32
#include <string.h>
33
34
#include "CSMemory.h"
35
#include "CSUTF8.h"
36
#include "CSStorage.h"
37
#include "CSGlobal.h"
38
39
/*
40
 * ---------------------------------------------------------------
41
 * HASH TABLE
42
 */
43
44
CSHashTable::~CSHashTable()
45
{
46
	clear();
47
	iSize = 0;
48
	if (iTable) {
49
		cs_free(iTable);
50
		iTable = NULL;
51
	}
52
53
}
54
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
55
void CSHashTable::setSize(uint32_t size)
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
56
{
57
	enter_();
58
	cs_realloc((void **) &iTable, sizeof(CSObject *) * size);
59
	iSize = size;
60
	exit_();
61
}
62
63
void CSHashTable::add(CSObject *item)
64
{
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
65
	uint32_t h = item->hashKey();
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
66
67
	remove(item->getKey());
68
	item->setHashLink(iTable[h % iSize]);
69
	iTable[h % iSize] = item;
70
}
71
72
CSObject *CSHashTable::find(CSObject *key)
73
{
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
74
	uint32_t h = key->hashKey();
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
75
	CSObject *item;
76
	
77
	item = iTable[h % iSize];
78
	while (item) {
79
		if (item->hashKey() == h && item->compareKey(key) == 0)
80
			return item;
81
		item = item->getHashLink();
82
	}
83
	return NULL;
84
}
85
86
void CSHashTable::remove(CSObject *key)
87
{
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
88
	uint32_t h = key->hashKey();
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
89
	CSObject *item, *prev_item;
90
91
	prev_item = NULL;
92
	item = iTable[h % iSize];
93
	while (item) {
94
		if (item->hashKey() == h &&  item->compareKey(key) == 0) {
95
			/* Remove the object: */
96
			if (prev_item)
97
				prev_item->setHashLink(item->getHashLink());
98
			else
99
				iTable[h % iSize] = item->getHashLink();
100
			item->release();
101
			break;
102
		}
103
		prev_item = item;
104
		item = item->getHashLink();
105
	}
106
}
107
108
void CSHashTable::clear()
109
{
110
	CSObject *item, *tmp_item;
111
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
112
	for (uint32_t i=0; i<iSize; i++) {
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
113
		item = iTable[i];
114
		while ((tmp_item = item)) {
115
			item = tmp_item->getHashLink();
116
			tmp_item->release();
117
		}
118
	}
119
}
120
121
/*
122
 * ---------------------------------------------------------------
123
 * SORTED LIST
124
 */
125
126
void CSSortedList::clear()
127
{
128
	if (iList) {
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
129
		for (uint32_t i=0; i<iInUse; i++)
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
130
			iList[i]->release();
131
		cs_free(iList);
132
		iList = NULL;
133
	}
134
	iInUse = 0;
135
	iListSize = 0;
136
}
137
138
void CSSortedList::add(CSObject *item)
139
{
140
	CSObject	*old_item;
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
141
	uint32_t		idx;
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
142
143
	enter_();
144
	if ((old_item = search(item->getKey(), idx))) {
145
		iList[idx] = item;
146
		old_item->release();
147
	}
148
	else {
149
		if (iInUse == iListSize) {
150
			push_(item);
151
			cs_realloc((void **) &iList, (iListSize + SC_SORT_LIST_INC_SIZE) * sizeof(CSObject *));
152
			pop_(item);
153
			iListSize += SC_SORT_LIST_INC_SIZE;
154
		}
155
		memmove(&iList[idx+1], &iList[idx], (iInUse - idx) * sizeof(CSObject *));
156
		iInUse++;
157
		iList[idx] = item;
158
	}
159
	exit_();
160
}
161
162
CSObject *CSSortedList::find(CSObject *key)
163
{
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
164
	uint32_t idx;
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
165
166
	return search(key, idx);
167
}
168
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
169
CSObject *CSSortedList::itemAt(uint32_t idx)
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
170
{
171
	if (idx >= iInUse)
172
		return NULL;
173
	return iList[idx];
174
}
175
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
176
CSObject *CSSortedList::takeItemAt(uint32_t idx)
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
177
{
178
	CSObject	*item;
179
180
	if (idx >= iInUse)
181
		return NULL;
182
		
183
	item = 	iList[idx];
184
	
185
	memmove(&iList[idx], &iList[idx+1], (iInUse - idx) * sizeof(CSObject *));
186
	iInUse--;
187
	return item;
188
}
189
190
void CSSortedList::remove(CSObject *key)
191
{
192
	CSObject	*item;
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
193
	uint32_t		idx;
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
194
195
	if ((item = search(key, idx))) {
196
		memmove(&iList[idx], &iList[idx+1], (iInUse - idx) * sizeof(CSObject *));
197
		iInUse--;
198
		item->release();
199
	}
200
}
201
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
202
CSObject *CSSortedList::search(CSObject *key, uint32_t& idx)
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
203
{
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
204
	register uint32_t		count = iInUse;
205
	register uint32_t		i;
206
	register uint32_t		guess;
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
207
	register int		r;
208
209
	i = 0;
210
	while (i < count) {
211
		guess = (i + count - 1) >> 1;
212
		r = iList[guess]->compareKey(key);
213
		if (r == 0) {
214
			idx = guess;
215
			return iList[guess];
216
		}
217
		if (r < 0)
218
			count = guess;
219
		else
220
			i = guess + 1;
221
	}
222
223
	idx = i;
224
	return NULL;
225
}
226
227
/*
228
 * ---------------------------------------------------------------
229
 * LINK ITEM
230
 */
231
232
/*
233
 * ---------------------------------------------------------------
234
 * LINK LIST
235
 */
236
237
void CSLinkedList::clear()
238
{
239
	while (iListFront)
240
		remove(iListFront);
241
}
242
243
void CSLinkedList::addFront(CSObject *item)
244
{
245
	if (iListFront != item) {
246
		remove(item);
247
		item->setNextLink(NULL);
248
		item->setPrevLink(iListFront);
249
		if (iListFront)
250
			iListFront->setNextLink(item);
251
		else
252
			iListBack = item;
253
		iListFront = item;
254
		iSize++;
255
	}
256
	else
257
		/* Must do this or I will have one reference too
258
		 * many!
259
		 * The input object was given to me referenced,
260
		 * but I already have the object on my list, and
261
		 * referenced!
262
		 */
263
		item->release();
264
}
265
266
bool CSLinkedList::remove(CSObject *item)
267
{
268
	bool on_list = false;
269
270
	if (item->getNextLink()) {
271
		item->getNextLink()->setPrevLink(item->getPrevLink());
272
		on_list = true;
273
	}
274
	if (item->getPrevLink()) {
275
		item->getPrevLink()->setNextLink(item->getNextLink());
276
		on_list = true;
277
	}
278
	if (iListFront == item) {
279
		iListFront = item->getPrevLink();
280
		on_list = true;
281
	}
282
	if (iListBack == item) {
283
		iListBack = item->getNextLink();
284
		on_list = true;
285
	}
286
	item->setNextLink(NULL);
287
	item->setPrevLink(NULL);
288
	if (on_list) {
289
		item->release();
290
		iSize--;
291
		return true;
292
	}
293
	return false;
294
}
295
296
CSObject *CSLinkedList::removeBack()
297
{
298
	CSObject *item = iListBack;
299
	
300
	if (item) {
301
		/* Removing dereferences the object! */
302
		remove(RETAIN(item));
303
	}
304
	return item;
305
}
306
307
CSObject *CSLinkedList::getBack()
308
{
309
	return iListBack;
310
}
311
312
CSObject *CSLinkedList::removeFront()
313
{
314
	CSObject *item = iListFront;
315
	
316
	if (item) {
317
		/* Removing dereferences the object! */
318
		remove(RETAIN(item));
319
	}
320
	return item;
321
}
322
323
CSObject *CSLinkedList::getFront()
324
{
325
	return iListFront;
326
}
327
328
/*
329
 * ---------------------------------------------------------------
330
 * VECTOR
331
 */
332
333
void CSVector::free()
334
{
335
	clear();
336
	iMaxSize = 0;
337
	if (iArray) {
338
		cs_free(iArray);
339
		iArray = NULL;
340
	}
341
}
342
343
void CSVector::clear()
344
{
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
345
	uint32_t i = iUsage;
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
346
347
	for (;;) {
348
		if (i == 0)
349
			break;
350
		i--;
351
		if (iArray[i]) {
352
			CSObject *obj;
353
			
354
			obj = iArray[i];
355
			iArray[i] = NULL;
356
			obj->release();
357
		}
358
	}
359
	iUsage = 0;
360
}
361
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
362
CSObject *CSVector::take(uint32_t idx)
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
363
{
364
	CSObject *obj;
365
366
	if (idx >= iUsage)
367
		return NULL;
368
369
	obj = iArray[idx];
370
	iUsage--;
371
	memmove(&iArray[idx], &iArray[idx+1], (iUsage - idx) * sizeof(CSObject *));
372
	return obj;
373
}
374
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
375
void CSVector::remove(uint32_t idx)
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
376
{
377
	CSObject *obj;
378
379
	if (idx >= iUsage)
380
		return;
381
382
	obj = iArray[idx];
383
	iUsage--;
384
	memmove(&iArray[idx], &iArray[idx+1], (iUsage - idx) * sizeof(CSObject *));
385
	obj->release();
386
}
387
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
388
CSObject *CSVector::get(uint32_t idx)
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
389
{
390
	if (idx >= iUsage)
391
		return NULL;
392
	return iArray[idx];
393
}
394
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
395
void CSVector::set(uint32_t idx, CSObject *val)
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
396
{
397
	enter_();
398
	if (idx >= iMaxSize) {
399
		push_(val);
400
		cs_realloc((void **) &iArray, sizeof(CSObject *) * (idx + iGrowSize - 1));
401
		pop_(val);
402
		iMaxSize = idx + iGrowSize - 1;
403
	}
404
	if (idx >= iUsage) {
405
		if (idx > iUsage)
406
			memset(&iArray[iUsage], 0, sizeof(CSObject *) * (idx - iUsage));
407
		iUsage = idx + 1;
408
	}
409
	else if (iArray[idx]) {
410
		push_(val);
411
		iArray[idx]->release();
412
		pop_(val);
413
	}
414
	iArray[idx] = val;
415
	exit_();
416
}
417
418
void CSVector::add(CSObject *obj)
419
{
420
	enter_();
421
	if (iUsage == iMaxSize) {
1548.2.19 by Barry.Leslie at PrimeBase
Fixes for longjmp clobber problem, (Hopefully)
422
		push_(obj);
423
		cs_realloc((void **) &iArray, sizeof(CSObject *) * (iMaxSize + iGrowSize));
424
		pop_(obj);
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
425
		iMaxSize += iGrowSize;
426
	}
427
	iArray[iUsage] = obj;
428
	iUsage++;
429
	exit_();
430
}
431
432
/*
433
 * ---------------------------------------------------------------
434
 * SPARSE ARRAY
435
 */
436
437
void CSSparseArray::free()
438
{
439
	clear();
440
	iMaxSize = 0;
441
	if (iArray) {
442
		cs_free(iArray);
443
		iArray = NULL;
444
	}
445
}
446
447
void CSSparseArray::clear()
448
{
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
449
	uint32_t i = iUsage;
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
450
451
	for (;;) {
452
		if (i == 0)
453
			break;
454
		i--;
455
		if (iArray[i].sa_object) {
456
			CSObject *obj;
457
			
458
			obj = iArray[i].sa_object;
459
			iArray[i].sa_object = NULL;
460
			obj->release();
461
		}
462
	}
463
	iUsage = 0;
464
}
465
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
466
CSObject *CSSparseArray::take(uint32_t idx)
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
467
{
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
468
	uint32_t		pos;
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
469
	CSObject	*obj;
470
471
	if (!(obj = search(idx, pos)))
472
		return NULL;
473
	iUsage--;
474
	memmove(&iArray[pos], &iArray[pos+1], (iUsage - pos) * sizeof(CSSpareArrayItemRec));
475
	return obj;
476
}
477
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
478
void CSSparseArray::remove(uint32_t idx)
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
479
{
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
480
	uint32_t		pos;
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
481
	CSObject	*obj;
482
483
	if (!(obj = search(idx, pos)))
484
		return;
485
	iUsage--;
486
	memmove(&iArray[pos], &iArray[pos+1], (iUsage - pos) * sizeof(CSSpareArrayItemRec));
487
	obj->release();
488
}
489
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
490
CSObject *CSSparseArray::itemAt(uint32_t idx)
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
491
{
492
	if (idx >= iUsage)
493
		return NULL;
494
	return iArray[idx].sa_object;
495
}
496
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
497
CSObject *CSSparseArray::get(uint32_t idx)
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
498
{
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
499
	uint32_t pos;
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
500
501
	return search(idx, pos);
502
}
503
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
504
uint32_t CSSparseArray::getIndex(uint32_t idx)
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
505
{
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
506
	uint32_t pos;
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
507
508
	search(idx, pos);
509
	return pos;
510
}
511
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
512
void CSSparseArray::set(uint32_t idx, CSObject *val)
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
513
{
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
514
	uint32_t		pos;
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
515
	CSObject	*obj;
516
517
	enter_();
518
	push_(val);
519
520
	if ((obj = search(idx, pos)))
521
		obj->release();
522
	else {
523
		if (iUsage == iMaxSize) {
524
			cs_realloc((void **) &iArray, (iMaxSize + iGrowSize) * sizeof(CSSpareArrayItemRec));
525
			iMaxSize += iGrowSize;
526
		}
527
		memmove(&iArray[pos+1], &iArray[pos], (iUsage - pos) * sizeof(CSSpareArrayItemRec));
528
		iUsage++;
529
		iArray[pos].sa_index = idx;
530
	}
531
	pop_(val);
532
	iArray[pos].sa_object = val;
533
	exit_();
534
}
535
536
void CSSparseArray::removeFirst()
537
{
538
	if (iUsage > 0)
539
		remove(iArray[0].sa_index);
540
}
541
542
CSObject *CSSparseArray::first()
543
{
544
	if (iUsage == 0)
545
		return NULL;
546
	return iArray[0].sa_object;
547
}
548
549
CSObject *CSSparseArray::last()
550
{
551
	if (iUsage == 0)
552
		return NULL;
553
	return iArray[iUsage-1].sa_object;
554
}
555
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
556
CSObject *CSSparseArray::search(uint32_t idx, uint32_t& pos)
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
557
{
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
558
	register uint32_t	count = iUsage;
559
	register uint32_t	i;
560
	register uint32_t	guess;
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
561
562
	i = 0;
563
	while (i < count) {
564
		guess = (i + count - 1) >> 1;
565
		if (idx == iArray[guess].sa_index) {
566
			pos = guess;
567
			return iArray[guess].sa_object;
568
		}
569
		if (idx < iArray[guess].sa_index)
570
			count = guess;
571
		else
572
			i = guess + 1;
573
	}
574
575
	pos = i;
576
	return NULL;
577
}
578
579
/*
580
 * ---------------------------------------------------------------
581
 * ORDERED LIST
582
 */
583
584
void CSOrderedList::clear()
585
{
586
	if (iList) {
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
587
		for (uint32_t i=0; i<iInUse; i++) {
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
588
			if (iList[i].li_key)
589
				iList[i].li_key->release();
590
			if (iList[i].li_item)
591
				iList[i].li_item->release();
592
		}
593
		cs_free(iList);
594
		iList = NULL;
595
	}
596
	iInUse = 0;
597
	iListSize = 0;
598
}
599
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
600
CSObject *CSOrderedList::itemAt(uint32_t idx)
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
601
{
602
	if (idx >= iInUse)
603
		return NULL;
604
	return iList[idx].li_item;
605
}
606
607
608
void CSOrderedList::add(CSOrderKey *key, CSObject *item)
609
{
610
	CSOrderedListItemPtr	old_item;
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
611
	uint32_t					idx;
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
612
613
	enter_();
614
	if ((old_item = search(key, &idx))) {
615
		iList[idx].li_key = key;
616
		iList[idx].li_item = item;
617
		if (old_item->li_key)
618
			old_item->li_key->release();
619
		if (old_item->li_item)
620
			old_item->li_item->release();
621
	}
622
	else {
623
		if (iInUse == iListSize) {
624
			push_(key);
625
			push_(item);
626
			cs_realloc((void **) &iList, (iListSize + SC_SORT_LIST_INC_SIZE) * sizeof(CSOrderedListItemRec));
627
			pop_(item);
628
			pop_(key);
629
			iListSize += SC_SORT_LIST_INC_SIZE;
630
		}
631
		memmove(&iList[idx+1], &iList[idx], (iInUse - idx) * sizeof(CSOrderedListItemRec));
632
		iInUse++;
633
		iList[idx].li_key = key;
634
		iList[idx].li_item = item;
635
	}
636
	exit_();
637
}
638
639
CSObject *CSOrderedList::find(CSOrderKey *key)
640
{
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
641
	uint32_t					idx;
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
642
	CSOrderedListItemPtr	ptr;
643
644
	if ((ptr = search(key, &idx)))
645
		return ptr->li_item;
646
	return NULL;
647
}
648
649
void CSOrderedList::remove(CSOrderKey *key)
650
{
651
	CSOrderedListItemPtr	item;
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
652
	uint32_t					idx;
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
653
654
	if ((item = search(key, &idx))) {
655
		CSOrderedListItemRec ir;
656
657
		memcpy(&ir, item, sizeof(CSOrderedListItemRec));
658
		memmove(&iList[idx], &iList[idx+1], (iInUse - idx) * sizeof(CSOrderedListItemRec));
659
		iInUse--;
660
		if (ir.li_key)
661
			ir.li_key->release();
662
		if (ir.li_item)
663
			ir.li_item->release();
664
	}
665
}
666
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
667
CSOrderedListItemPtr CSOrderedList::search(CSOrderKey *key, uint32_t *idx)
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
668
{
1548.2.2 by Barry.Leslie at PrimeBase
A lot of minor changes to clean up the code and to get it to build with Drizzle.
669
	register uint32_t		count = iInUse;
670
	register uint32_t		i;
671
	register uint32_t		guess;
1548.2.1 by Barry.Leslie at PrimeBase
Added the PBMS daemon plugin.
672
	register int		r;
673
674
	i = 0;
675
	while (i < count) {
676
		guess = (i + count - 1) >> 1;
677
		r = iList[guess].li_key->compareKey(key);
678
		if (r == 0) {
679
			*idx = guess;
680
			return &iList[guess];
681
		}
682
		if (r < 0)
683
			count = guess;
684
		else
685
			i = guess + 1;
686
	}
687
688
	*idx = i;
689
	return NULL;
690
}
691
692